什么是HTTP协议
- HTTP协议是Hypertext Transfer Protocol(超文本传输协议)的缩写
- 主要用于World Wide Web(万维网)与浏览器之间传输超文本数据
- 可以传输各种格式的数据,例如图片,文本,附件等等
- 基于TCP/IP通信协议来传输数据
工作过程
- 对www.baidu.com这个网址进行DNS域名解析,得到对应的IP地址
- 根据这个IP,找到对应的服务器,发起TCP的三次握手
- 建立TCP连接后发起HTTP请求
- 服务器响应HTTP请求,浏览器得到html代码
- 浏览器先解析渲染html代码,然后在请求html代码中的资源(如js、css、图片等)
(先得到html代码,才去加载, js,css,图片是二次加载) - 浏览器对页面进行渲染呈现给用户
- 服务器关闭关闭TCP连接
http请求时序图
URL
- URL(Uniform Resource Locator)统一资源定位符
- URL的组成部分:protocol://hostname[:port]/path
2.1 protocol:协议,例如http,ftp等等
2.2 hostname:主机名,例如IP端口或者域名 www.jiaolianmishu.com
2.3 port:端口,可以为空,默认端口为80
2.4 path:路径,使用"/"分隔开 /Index/index
2.5 例如: http://www.jiaolianmishu.com/Index/index
请求方式
- HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
- HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式
- HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法
请求方法说明
- OPTIONS
返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性 - HEAD
向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。 - GET
向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url - POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form - PUT
向指定资源位置上传其最新内容 - DELETE
请求服务器删除Request-URL所标识的资源 - TRACE
回显服务器收到的请求,主要用于测试或诊断 - CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
注意:
1)方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Mothod Not Allowed);当服务器不认识或者不支持对应的请求方法时,应返回状态码501(Not Implemented)。
2)HTTP服务器至少应该实现GET和HEAD/POST方法,其他方法都是可选的,此外除上述方法,特定的HTTP服务器支持扩展自定义的方法。
http版本差别
http0.9
最初的http版本,仅支持get方法,只能传输纯文本内容,所以请求结束服务段会给客户端返回一个HTML格式的字符串,然后由浏览器自己渲染。
http0.9是典型的无状态连接(无状态是指协议对于事务处理没有记忆功能,对同一个url请求没有上下文关系,每次的请求都是独立的,服务器中没有保存客户端的状态)
http1.0
这个版本后任何文件形式都可以被传输,本质上支持长连接,但是默认还是短连接,增加了keep-alive关键字来由短链接变成长连接。
HTTP的请求和回应格式也发生了变化,除了要传输的数据之外,每次通信都包含头信息,用来描述一些信息。
还增加了状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等
http1.1
HTTP1.1最大的变化就是引入了长链接,也就是TCP链接默认是不关闭的可以被多个请求复用。客户端或者服务器如果长时间发现对方没有活动就会关闭链接,但是规范的做法是客户端在最后一个请求的时候要求服务器关闭链接。对于同一个域名,目前浏览器支持建立6个长链接。
节约带宽,HTTP1.1支持只发送header头信息不带任何body信息,如果服务器认为客户端有权限请求指定数据那就返回100,没有就返回401,当客户端收到100的时候可以才把要请求的信息发给服务器。并且1.1还支持了请求部分内容,如果当前客户端已经有一部分资源了,只需要向服务器请求另外的部分资源即可,这也是支持文件断点续传的基础。
1.1版本中增加了host处理,在HTTP1.0中认为每台服务器都绑定一个唯一的ip地址,因此在URL中并没有传递主机名,但是随着虚拟机技术的发展,可能在一台物理机器上存在多个虚拟主机,并且他们共享了一个ip地址,http1.1中请求消息和响应消息都支持host头域,如果不存在还会报出错误
http2.0
多路复用:在一个连接里面并发处理请求,不像http1.1在一个tcp连接中各个请求是串行的。花销很大
在1.0版本后增加了header头信息,2.0版本通过算法把header进行了压缩这样数据体积就更小,在网络上传输就更快。
服务端有了推送功能,将客户端感兴趣的东西推给客户端,当客户端请求这些时,直接去缓存中取就行。
报文结构
HTTP报文主要有request和response两种
request 图解
请求报文说明:
- 请求行(request line): 包括请求方法,资源的URL,以及HTTP协议版本
- 请求头部(header): 包括请求服务器所需要的附加信息
- 空行(CRLF):请求头部后面必须是空行,即使请求数据为空,也要有空行
- 请求数据(body):也称为请求实体,可以添加任意类型的数据
response图解
- 状态行(status line): 包括HTTP协议版本,状态码和状态消息组成
- 消息报头(header): 包括返回客户端的一些附件信息
- 空行(CRLF): 必须有空行
- 响应正文(body): 服务器返回给客户端的数据,可以是任意类型的数据
常用的HTTP消息头
Request Headers
Accept:text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, image/apng, /; q=0.8
作用:向服务器申明客户端(浏览器)可以接受的媒体类型(MIME)的资源
解释:浏览器可以接受 text/html、application/xhtml+xml、application/xml类型,通配符/ 表示任意类型的数据。并且浏览器按照该顺序进行接收。( text/html —> application/xhtml+xml —> application/xml)
Accept-encoding: gzip, deflate, br
作用:向服务器申明客户端(浏览器)接收的编码方法,通常为压缩方法
解释:浏览器支持采用经过 gzip,deflate 或 br 压缩过的资源
Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
作用:向服务器申明客户端(浏览器)接收的语言
解释:浏览器能够接受 en-US, en 和 zh-CN 三种语言,其中 en-US 的权重最高 ( q 最高为1,最低为 0),服务器优先返回 en-US 语言
延伸:语言与字符集的区别:zh-CN 为汉语,汉语中有许多的编码:gbk2312 等
Cache-control: max-age=0
作用:控制浏览器的缓存,常见值为 private、no-cache、max-age、alidate,默认为 private,根据浏览器查看页面不同的方式来进行区别
解释:浏览器在访问了该页面后,不再会访问服务器
Cookie:
作用:告诉服务器关于 Session 的信息,存储让服务器辨识用户身份的信息。
Refer:https://www.baidu.com/xxxxxxxxxx
作用:告诉服务器该页面从哪个页面链接的
解释:该页面从 https://www.baidu.com 中的搜索结果中点击过来的
Upgrade-insecure-requests:1
作用:申明浏览器支持从 http 请求自动升级为 https 请求,并且在以后发送请求的时候都使用 https
解释:当页面中包含大量的 http 资源的时候(图片、iframe),如果服务器发现一旦存在上述的响应头的时候,会在加载 http 资源的时候自动替换为 https 请求
User-agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
作用:向服务器发送浏览器的版本、系统、应用程序的信息。
解释:Chrome 浏览器的版本信息为 63.0.3239.132,并将自己伪装成 Safari,使用的是 WebKit 引擎,WebKit伪装成 KHTML,KHTML伪装成Gecko(伪装是为了接收那些为Mozilla、safari、gecko编写的界面)
延伸:可以随便填(但不应该随便填)不过一般用于统计。
X-Chrome-UMA-Enabled、X-Client-Data :与 Chrome 浏览器相关的数据
Response Headers
Accpet-ranges:bytes
作用:表明自己是否接收获取某个实体的一部分(比如文件的一部分)
解释:接受
延伸:服务器支持断点续传,以及同时下载文件的多个部分时,必须设置为 bytes
Alt-svc: hq=”:443”; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337; quic=51303335,quic=”:443”; ma=2592000; v=”41,39,38,37,35”
作用:服务器使用“alt-svc”(Alternative Servicesde)标识资源,可以通过不同的网络位置或者网络协议进行获取
Content-length:24211
作用:HTTP消息实体的传输长度
解释:该实体的传输长度(被 br 压缩后的长度为)24211
Content-encoding:br
作用:设置数据使用的编码类型(压缩类型)
解释:数据使用 br 进行压缩后返回到浏览器上
Content-type:text/html; charset=UTF-8
作用:设置响应体的媒体资源类型(MIME)
解释:服务器发送 html 文档,字符集为 UTF-8
Age:1037016
作用:表明该响应从缓存中拿到时响应的寿命,代理服务器当前的系统时间与此应答消息中的通用消息头Date的值之差
解释:该响应在缓存代理中存放了 1037016 秒
Date:Thu, 15 Feb 2018 20:31:45 GMT
作用:设置响应被服务器创建的时间
解释:在 GMT(格林威治标准时间)Thu, 15 Feb 2018 20:31:45,发送的响应
Expires:Fri, 01 Feb 2019 17:33:57 GMT
作用:设置响应体的过期时间。如果在过期之前进行访问,就会读取缓存中的版本。
解释:在 GMT(格林威治标准时间)Fri, 01 Feb 2019 17:33:57,在这个时间之前,客户端不用再向服务器发送请求
延伸:如果和 Cache-control 同时存在,那么被其中的 max-age 覆盖
Last-modified:Mon, 12 Dec 2016 14:45:00 GMT
作用:设置该文件在服务器端中最后被修改的时间
解释:在 GMT(格林威治标准时间)Fri, 01 Feb 2019 17:33:57,该文件被服务器所修改
Vary:Accept-Encoding
作用:服务器响应时根据请求头中的的值返回不同的内容的
过程:浏览器 —> 请求 —> squid —> 请求 —> apache
解释:
apache 在 response headers 中 返回了 vary: Accept-Encoding,
在 squid 中需要存储该 encoding 的值作为缓存 key 的值,比如,resourse_1 : gzip, resourse_2: deflate
下次请求到 squid,需要先找到缓存文件的索引文件,根据不同的 accept-Encoding(gzip、deflate)的值来找相应的文件。
p3p:CP=”This is not a P3P policy! See g.co/p3phelp for more info.”
作用:隐私安全平台(the Platform for Privary Preferences),网站向浏览器申明自己的隐私政策。
Server: gws
作用:设置服务器名称
Set-cookie:
作用:设置 http 的 Cookie
Status: 200
作用:设置HTTP的响应状态
解释:200 代表成功请求
Strict-transport-security: max-age=3600
作用:HSTS 策略,告诉 HTTP 客户端缓存 HTTPS 策略多少时间。
解释:在 3600 秒内,不管用户在浏览器输入不带协议的网址如:google.com 时,还是http协议的网址如:http://google.com ,都会默认将请求内部跳转到 https://google.com
X-frame-options: SAMEORIGIN
作用:点击劫持保护
解释:页面可以在相同域名页面的 frame中展示
X-content-type-options: nosniff
作用:设置浏览器的”MIME”攻击机制
解释:服务器中的内容是 image/png,那么浏览器就会显示为 image/png
X-xss-protection:1; mode=block
作用:设置浏览器的XSS防护机制
解释:浏览器如果检测到恶意代码,则不渲染恶意代码
Content-Encoding:gzip + Content-Type:text/html
作用:声明文档的压缩类型和文档的确切MIME类型
解释:文档使用的 MIME 类型是 text/html,并且对内容进行了 gzip 压缩
Etag + Last-Modified
作用:服务器给文件资源打上的标签,客户端传回 Last-Modified / Etag 给服务器验证缓存
流程:
客户端请求资源 example.html
服务器返回资源,并且给该 html 连同 Etag + Last-Modified 一起缓存
客户端再次请求资源 example.html,并且将 if-None-Match 一起传给服务器
服务器计算存在服务器中的 eamples.html de Etag,并且与客户端传来的 if-None-Match:Etag 或者 Last-Modified 进行匹配:
if-None-Match-false:返回 304 和空的响应头
if-None-Match-true:返回 200 和新修改的资源,如果其中的某个值没有改变,那么就返回 304 和一个空的响应头
Last-Modified:文件上次修改的时间(精确到秒)
Etag: 实体标签(Entity Tag),标识该资源的状态,ETag 如果改变,说明资源状态已经改变,能够修复 Last-Modified 的一些问题。
服务器的文件可能只改变了修改时间,而内容没有改变,客户端不希望认为文件已经修改
文件在秒以下的时间进行修改
常用的HTTP错误码
200 - 服务器成功返回网页
404 - 请求的网页不存在
503 - 服务不可用
详细分解:
1xx(临时响应)
表示临时响应并需要请求者继续执行操作的状态代码。
代码 说明
100 (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。
2xx (成功)
表示成功处理了请求的状态代码。
代码 说明
200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
201 (已创建) 请求成功并且服务器创建了新的资源。
202 (已接受) 服务器已接受请求,但尚未处理。
203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
204 (无内容) 服务器成功处理了请求,但没有返回任何内容。
205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。
206 (部分内容) 服务器成功处理了部分 GET 请求。
3xx (重定向)
表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
代码 说明
300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
4xx(请求错误)
这些状态代码表示请求可能出错,妨碍了服务器的处理。
代码 说明
400 (错误请求) 服务器不理解请求的语法。
401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403 (禁止) 服务器拒绝请求。
404 (未找到) 服务器找不到请求的网页。
405 (方法禁用) 禁用请求中指定的方法。
406 (不接受) 无法使用请求的内容特性响应请求的网页。
407 (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
408 (请求超时) 服务器等候请求时发生超时。
409 (冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
410 (已删除) 如果请求的资源已永久删除,服务器就会返回此响应。
411 (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
412 (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。
413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414 (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
415 (不支持的媒体类型) 请求的格式不受请求页面的支持。
416 (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。
417 (未满足期望值) 服务器未满足"期望"请求标头字段的要求。
5xx(服务器错误)
这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
代码 说明
500 (服务器内部错误) 服务器遇到错误,无法完成请求。
501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。