http协议分析

Http头部介绍

在利用抓包工具进行抓包的时候, 我们能看到很多的项, 下面表格详细讲解每一项。

Accept告诉 WEB 服务器自己接受什么介质类型, */* 表示任何类型, type/* 表示该类型下的所有子类型, type/sub-type
Accept-Charset浏览器申明自己接收的字符集
Accept-Encoding浏览器申明自己接收的编码方法, 通常指定压缩方法, 是否支持压缩,支持什么压缩方法(gzip, deflate)
Accept-Language浏览器申明自己接收的语言
语言跟字符集的区别: 中文是语言, 中文有多种字符集, 比如 big5, gb2312, gbk 等等。
Accept-Ranges

WEB 服务器表明自己是否接受获取其某个实体的一部分(比如文件的一部分) 的请求。

bytes: 表示接受, none: 表示不接受。

Age当代理服务器用自己缓存的实体去响应请求时, 用该头部表明该实体从产生到现在经过多长时间了。
Authorization当客户端接收到来自 WEB 服务器的 WWW-Authenticate 响应时, 用该头部来回应自己的身份验证信息给 WEB 服务器。
Cache-Control请求: no-cache(不要缓存的实体, 要求现在从 WEB 服务器去取)
max-age: (只接受 Age 值小于 max-age 值, 并且没有过期的对象)
max-stale: (可以接受过去的对象, 但是过期时间必须小于 max-stale 值)
min-fresh: (接受其新鲜生命期大于其当前 Age 跟 min-fresh 值之和的缓存对象)
响应: public(可以用 Cached 内容回应任何用户)
private(只能用缓存内容回应先前请求该内容的那个用户)
no-cache(可以缓存, 但是只有在跟 WEB 服务器验证了其有效后, 才能返回给客户端)
max-age: (本响应包含的对象的过期时间)
ALL: no-store(不允许缓存)
Connection

请求: close(告诉 WEB 服务器或者代理服务器, 在完成本次请求的响应后, 断开连接, 不要等待本次连接的后续请求了)keepalive(告诉 WEB 服务器或者代理服务器, 在完成本次请求的响应后, 保持连接, 等待
本次连接的后续请求) 。
响应: close(连接已经关闭) 。
keepalive(连接保持着, 在等待本次连接的后续请求) 。
Keep-Alive: 如果浏览器请求保持连接, 则该头部表明希望 WEB 服务器保持连接多长时间(秒) 。 例如: Keep-Alive: 300

Content-EncodingWEB 服务器表明自己使用了什么压缩方法(gzip, deflate) 压缩响应中的对象。 例如: Content-Encoding: gzip
Content-LanguageWEB 服务器告诉浏览器自己响应的对象的语言。
Content-LengthWEB 服务器告诉浏览器自己响应的对象的长度。 例如: Content-Length:26012
Content-RangeWEB 服务器表明该响应包含的部分对象为整个对象的哪个部分。 例如:Content-Range: bytes 21010-47021/47022
Content-TypeWEB 服务器告诉浏览器自己响应的对象的类型。 例如: Content-Type:application/xml
ETag就是一个对象(比如 URL) 的标志值, 就一个对象而言, 比如一个 html 文件,如果被修改了, 其 Etag 也会别修改, 所以 ETag 的作用跟 Last-Modified 的作用差不多, 主要供 WEB 服务器判断一个对象是否改变了。 比如前一次请求某个 html 文件时, 获得了其ETag, 当这次又请求这个文件时, 浏览器就会把先前获得的 ETag 值发送给 WEB 服务器,然后 WEB 服务器会把这个 ETag 跟该文件的当前 ETag 进行对比, 然后就知道这个文件有没有改变了。
ExpiredWEB 服务器表明该实体将在什么时候过期, 对于过期了的对象, 只有在跟WEB 服务器验证了其有效性后, 才能用来响应客户请求。 是 HTTP/1.0 的头部。 例如: Expires:Sat, 23 May 2009 10:02:12 GMT
Host客户端指定自己想访问的 WEB 服务器的域名/IP 地址和端口号。 例如: Host:rss.sina.com.cn
If-Match如果对象的 ETag 没有改变, 其实也就意味著对象没有改变, 才执行请求的动作。
If-None-Matc如果对象的 ETag 改变了, 其实也就意味著对象也改变了, 才执行请求的动作。
If-Modified-Since如果请求的对象在该头部指定的时间之后修改了, 才执行请求的动作( 比如返回对象) , 否则返回代码 304, 告诉浏览器 该对象没有修改。 例如:If-Modified-Since: Thu, 10 Apr 2008 09:14:42 GMT
If-Unmodified-Since如果请求的对象在该头部指定的时间之后没修改过, 才执行请求
的动作(比如返回对象)
If-Range浏览器告诉 WEB 服务器, 如果我请求的对象没有改变, 就把我缺少的部分给我, 如果对象改变了, 就把整个对象给我。 浏览器通过发送请求对象的 ETag 或者 自己所知道的最后修改时间给 WEB 服务器, 让其判断对象是否改变了。 总是跟 Range 头部一起使用。
Last-ModifiedWEB 服务器认为对象的最后修改时间, 比如文件的最后修改时间, 动态页面的最后产生时间等等。 例如: Last-Modified: Tue, 06 May 2008 02:42:43 GMT
LocationWEB 服务器告诉浏览器, 试图访问的对象已经被移到别的位置了, 到该头部 指 定 的 位 置 去 取 。 例 如 : Location : http://i0.sinaimg.cn/dy/deco/2008/0528/sinahome_0803_ws_005_text_0.gif
Pramga主要使用 Pramga: no-cache, 相当于 Cache-Control: no-cache。 例如: Pragma:no-cache
Proxy-Authenticate代理服务器响应浏览器, 要求其提供代理身份验证信息。Proxy-Authorization: 浏览器响应代理服务器的身份验证请求, 提供自己的身份信息。
Range浏览器(比如 Flashget 多线程下载时) 告诉 WEB 服务器自己想取对象的哪部分。 例如: Range: bytes=1173546-
Referer

浏览器向 WEB 服务器表明自己是从哪个 网页/URL 获得/点击 当前请求中的网址/URL。 例如:

Referer: http://www.sina.com/

ServerWEB 服务器表明自己是什么软件及版本等信息。 例如: Server: Apache/2.0.61(Unix)
User-Agent

浏览器表明自己的身份(是哪种浏览器) 。 例如:

User-Agent: Mozilla/5.0(Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.14) Gecko/20080404 Firefox/2、0、0、14

Transfer-Encoding

WEB 服务器表明自己对本响应消息体(不是消息体里面的对象) 作了怎样的编码, 比如是否分块(chunked)。

例如: Transfer-Encoding: chunked

VaryWEB 服务器用该头部的内容告诉 Cache 服务器, 在什么条件下才能用本响应所返回的对象响应后续的请求。 假如源 WEB 服务器在接到第一个请求消息时, 其响应消息的头部为: Content- Encoding: gzip; Vary: Content-Encoding 那么 Cache 服务器会分析后续请求消息的头部, 检查其 Accept-Encoding, 是否跟先前响应的 Vary 头部值一致, 即是否使用相同的内容编码方法, 这样就可以防止 Cache 服务器用自己 Cache 里面压缩后的实体响应给不具备解压能力的浏览器。 例如: Vary: Accept-Encoding
Via列出从客户端到 OCS 或者相反方向的响应经过了哪些代理服务器, 他们用什么协议(和版本) 发送的请求。 当客户端请求到达第一个代理服务器时, 该服务器会在自己发出的请求里面添 加 Via 头部, 并填上自己的相关信息, 当下一个代理服务器收到第一个代理服务器的请求时, 会在自己发出的请求里面复制前一个代理服务器的请求的 Via 头部, 并把自己的相关信息加到后面, 以此类推, 当 OCS 收到最后一个代理服务器的请求时, 检查Via 头部, 就知道该请求所经过的路由。 例如: Via: 1.0 236.D0707195.sina.com.cn:80(squid/2.6.STABLE13)

HTTP请求方法(Get/Post)

方法描述
GETGet长度限制为1024,特别快,不安全,在URL里可见,URL提交参数以?分隔,多个参数用&连接,请求指定的页面信息,并返回实体主体。
HEAD类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST长度一般无限制,由中间件限制,较慢,安全,URL里不可见。请求的参数在数据包的请求body中
PUT向指定资源位置上传其最新内容
DELETE请求服务器删除指定的页面。
CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。
TRACE回显服务器收到的请求,主要用于测试或诊断。

   常见URL编码

空格        %20 或 %A0 
'           %27      
"           %22       
#           %23   
%           %25    
&           %26          
*           %2A
+           %2B
,           %2C
-           %2D
.           %2E
/           %2F
\           %5C
=           %3d
回车(\r)   %0d
换行 (\n)    %0a
  • GET请求参数显示,都显示在浏览器网址上,HTTP服务器根据该请求所包含URL中的参数来产生响应内容,即“Get”请求的参数是URL的一部分。 
  • POST请求参数在请求体当中,消息长度没有限制而且以隐式的方式进行发送,通常用来向HTTP服务器提交量比较大的数据(比如请求中包含许多参数或者文件上传操作等),请求的参数包含在“Content-Type”消息头里,指明该消息体的媒体类型和编码.

Request请求包

GET /test/  HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: https://www.baidu.com/index.php
Accept-Encoding: gzip, deflate, br
Accept-Language: zh,zh-CN;q=0.8,ar;q=0.6,zh-TW;q=0.4
Cookie: BAIDUID=AE4D1DA6B2D6689BB8C557B3436893E3:FG=1;BIDUPSID=AE4D1DA6B2D6689BB8C557B3436893E3; PSTM=1501466227;

1. GET            
   获取当前主机该路径下的数据
   HTTP/1.1是http协议的版本号

2. Host (主机和端口号)
Host:对应网址URL中的Web名称和端口号,用于指定被请求资源的Internet主机和端口号,通常属于URL的一部分。默认是80端口,如果是8080端口的话,则为: www.baidu.com:8080

3. Connection (链接类型)
Connection:表示客户端与服务连接类型

当传输的数据较小时,可以一次传输完成时,Connection的值为close

当传输的数据较大时,不能一次性传输完成时,则数据需要分块传输,即把 Connection 的值设置为 keep-alive
    Client 发起一个包含 Connection:keep-alive 的请求
    Server收到请求后:
          如果 Server 支持 keep-alive,回复一个包含 Connection:keep-alive 的响应,不关闭连接;
          如果 Server 不支持 keep-alive,回复一个包含 Connection:close 的响应,关闭连接。
    如果client收到包含 Connection:keep-alive 的响应,向同一个连接发送下一个请求,直到一方主动关闭连接。keep-alive在很多情况下能够重用连接,减少资源消耗,缩短响应时间,比如当浏览器需要多个文件时(比如一个HTML文件和相关的图形文件),不需要每次都去请求建立连接。

4. Upgrade-Insecure-Requests (升级为HTTPS请求)
Upgrade-Insecure-Requests:升级不安全的请求,意思是会在加载 http 资源时自动替换成 https 请求,让浏览器不再显示https页面中的http请求警报。
HTTPS 是以安全为目标的 HTTP 通道,所以在 HTTPS 承载的页面上不允许出现 HTTP 请求,一旦出现就是提示或报错。

5. User-Agent (浏览器名称)

User-Agent:是客户浏览器的名称
6. Accept (接收的文件类型)
Accept:指浏览器或其他客户端可以接受的MIME(Multipurpose Internet Mail Extensions(多用途互联网邮件扩展))文件类型,服务器可以根据它判断并返回适当的文件格式。
举例:
Accept: */*: 表示什么都可以接收。
Accept:image/gif: 表明客户端希望接受GIF图像格式的资源;
Accept:text/html: 表明客户端希望接受html文本。
Accept:   text/html, application/xhtml+xml;q=0.9, image/*;q=0.8:表示浏览器支持的 MIME 类型分别是 html文本、xhtml和xml文档、所有的图像格式资源。
q是权重系数,范围 0 =< q <= 1,q 值越大,请求越倾向于获得其“;”之前的类型表示的内容。若没有指定q值,则默认为1,按从左到右排序顺序;若被赋值为0,则用于表示浏览器不接受此内容类型。
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
Application:用于传输应用程序数据或者二进制数据。

7. Referer (页面跳转处)(利用:跨站点请求伪造)
Referer:表明产生请求的网页来自于哪个URL,用户是从该 Referer页面访问到当前请求的页面。这个属性可以用来跟踪Web请求来自哪个页面,是从什么网站来的等。
有时候遇到下载某网站图片,需要对应的referer,否则无法下载图片,那是因为人家做了防盗链,原理就是根据referer去判断是否是本网站的地址,如果不是,则拒绝,如果是,就可以下载;

8. Accept-Encoding(文件编解码格式)
Accept-Encoding:指出浏览器可以接受的编码方式。编码方式不同于文件格式,它是为了压缩文件并加速文件传递速度。浏览器在接收到Web响应之后先解码,然后再检查文件格式,许多情形下这可以减少大量的下载时间。
举例:Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0

如果有多个Encoding同时匹配, 按照q值顺序排列,本例中按顺序支持 gzip, identity压缩编码,支持gzip的浏览器会返回经过gzip编码的HTML页面。 如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受

9. Accept-Language(语言种类)
Accept-Langeuage:指出浏览器可以接受的语言种类,如en或en-us指英语,zh或者zh-cn指中文,当服务器能够提供一种以上的语言版本时要用到

10. Cookie (Cookie)
Cookie:浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现会话功能,以后会详细讲。

11. Accept-Charset(字符编码
Accept-Charset:指出浏览器可以接受的字符编码。
举例:Accept-Charset:iso-8859-1、gb2312、utf-8、ISO8859-1:通常叫做Latin-1。Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符,英文浏览器的默认值是ISO-8859-1.
    gb2312:标准简体中文字符集;
    utf-8:UNICODE 的一种变长字符编码,可以解决多种语言文本显示问题,从而实现应用国际化和本地化。
如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。

12. Content-Type (POST数据类型)
Content-Type:表示POST请求里用来表示的内容类型。一般有 application/x-www-form-urlencoded,multipart/form-data,text/plain三种

X-Forwarded-for(伪造批量发包,利用:刷票工具)

13. Pragma

pragma是http/1.1之前版本的历史遗留字段,仅作为与http的向后兼容而定义。

规范定义的唯一形式:Pragme:no-cache  。只用于客户端发送的请求中。客户端会要求所有的中间服务器不返回缓存的资源。

14. Cache-Control

如果所有的中间服务器都实现以 HTTP/1.1为标准,那么直接使用 Cache-Control:no-cache 即可,如果不是的话,就要包含两个字段
 

Cache-Control:no-cache
Pragme:no-cache

15.  Fetch-Site系列

Chrome 意欲在下一个版本 76 实现 Fetch Metadata请求头提案,该提案允许浏览器在发起请求时带上请求的相关上下文,使得服务器端可以进行安全相关的校验。提案的请求头包括

  • 请求目标 Sec-Fetch-Dest
  • 请求模式 Sec-Fetch-Mode(跨域规则与浏览上下文)
  • 是否跨域的 Sec-Fetch-Site 
  • 是否用户触发的 Sec-Fetch-User。
     

Reply回复包

HTTP/1.1 200 OK
Date: Fri, 05 Oct 2018 01:35:48 GMT
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45
X-Powered-By: PHP/5.4.45
Expires: Tue, 23 Jun 2009 12:00:00 GMT
Cache-Control: no-cache, must-revalidate
Pragma: no-cache
Content-Length: 5212
Connection: close
Content-Type: text/html;charset=utf-8

1. HTTP/1.1  200 OK

HTTP/1.1  是http版本号  
200 OK  是状态码 
200 页面正常
301、302 、304 重定向
400 http协议错误 、    401身份认证  、  403 禁止访问  、     404 页面不存在
500 页面的动态代码有错误         502 响应超时   521网站反爬返回头
2. Date: Fri, 05 Oct 2018 01:35:48 GMT  

   服务器回复数据时的日期和时间

3. Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45

  服务器的Web服务器类型,中间件等

4. Content-Length: 5212

  回复的数据包的长度
5. Connection: close

  链接类型,不支持长链接,所以关闭
6. Content-Type: text/html;charset=utf-8

一次HTTP请求的过程

当用户在浏览器的地址栏中输入一个URL并按回车键之后,浏览器会向HTTP服务器发送HTTP请求。HTTP请求主要分为“Get”和“Post”两种方法。
当我们在浏览器输入URL http://www.baidu.com 的时候,浏览器发送一个Request请求去获取 http://www.baidu.com 的html文件,服务器把Response文件对象发送回给浏览器。
浏览器分析Response中的 HTML,发现其中引用了很多其他文件,比如Images文件,CSS文件,JS文件。 浏览器会自动再次发送Request去获取图片,CSS文件,或者JS文件。
当所有的文件都下载成功后,网页会根据HTML语法结构,完整的显示出来了。
 

HTTP和HTTPS

 

参考链接:[谢公子博客]http协议

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值