参考文档:
1. wireshark怎么抓包、wireshark抓包详细图文教程
2. 深入理解HTTP协议
3. Cache-control 百度百科
4. HTTP中cache-control的应用及说明
5. 让浏览器不再显示https页面中的http请求警报
6. 关于HTTP头(header)的Vary的解释
7. transfer-encoding:chunked的含义
一、使用Wireshark抓包
安装Wireshark
通过捕获-捕获过滤器设置捕获过滤器:TCP or UDP port80(HTTP)
设置显示过滤器:目标地址(如果要增加本地ip过滤:可以添加“
or ip.src= 你的ip
),目标地址以http://image.baidu.com/ 为例,其ip为:112.80.248.122
根据域名查询 http://image.baidu.com/ 的ip:在cmd中输入如下:
C:\Windows\System32>ping image.baidu.com从过滤结果中找到对应HTTP结果项,右键-追踪流-TCP流,可以看到三次握手的记录
二、三次握手
从上面抓包的结果可以观察到如下情况:
三、Http请求
经过TCP的三次握手之后才可以发送Http请求。
请求方的http报头结构:通用报头|请求报头|实体报头 。
GET / HTTP/1.1
Host: image.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Accept: ***
Upgrade-Insecure-Requests: 1
User-Agent: ***
Referer: ***
Accept-Encoding: ***
Accept-Language: ***
Cookie: ***
GET / HTTP/1.1 :
请求方法(GET)、URI协议(HTTP)、版本号(1.1)Host :
主机和端口号,这里是域名Connection :
此header的含义是当client和server通信时对于长链接如何进行处理。 在http1.1中,client和server都是默认对方支持长链接的,如果client使用http1.1协议,但又不希望使用长链接,则需要在header中指明connection的值为close;如果server方也不想支持长链接,则在response中也需要明确说明connection的值为close。不论request还是response的header中包含了值为close的connection,都表明当前正在使用的tcp链接在当天请求处理完毕后会被断掉。以后client再进行新的请求时就必须创建新的tcp链接了。Cache-Control :
指定请求的缓存机制,在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。属性说明
Cache-directive 说明 public 所有内容都将被缓存(客户端和代理服务器都可缓存) max-age = * 缓存的内容将在*秒后失效, 这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高 private 内容只缓存到私有缓存中(仅客户端可以缓存,代理服务器不可缓存) no-cache 必须先与服务器确认返回的响应是否被更改,然后才能使用该响应来满足后续对同一个网址的请求。因此,如果存在合适的验证令牌 (ETag),no-cache 会发起往返通信来验证缓存的响应,如果资源未被更改,可以避免下载 no-store 所有内容都不会被缓存到缓存或 Internet 临时文件中 must-revalidation/proxy-revalidation 如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证 浏览器响应:
Cache-directive 在地址栏回车 在新窗口打开该页面 回退到该页面 刷新 public 读取缓存 读取缓存 读取缓存 访问服务器 max-age = * 在*秒内读取缓存 在*秒内读取缓存 在*秒内读取缓存 访问服务器 private 第一次回车访问服务器,再次读取缓存 访问服务器 读取缓存 访问服务器 no-cache/no-store 访问服务器 访问服务器 访问服务器 访问服务器 must-revalidation/proxy-revalidation 第一次回车访问服务器,再次读取缓存 访问服务器 读取缓存 访问服务器 Expires:
头部字段提供一个日期和时间,响应在该日期和时间后被认为失效。失效的缓存条目通常不会被缓存(无论是代理缓存还是用户代理缓存)返回,除非首先通过原始服务器(或者拥有该实体的最新副本的中介缓存)验证。(注意:cache-control max-age 和 s-maxage 将覆盖 Expires 头部。)Accept:
代表发送端(客户端)希望接受的数据类型。Upgrade-Insecure-Requests:
告诉服务器,浏览器支持将http请求升级为https的操作。Referer:
Referer头域允许客户端指定请求uri的源资源地址,这可以允许服务器生成回退链表,可用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被追踪。如果请求的uri没有自己的uri地址,Referer不能被发送。如果指定的是部分uri地址,则此地址应该是一个相对地址。Accept-Encoding:
声明浏览器支持的编码类型。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间Encoding类型 说明 Accept-Encoding: 默认支持identity Accept-Encoding: compress, identity 支持compress 和gzip类型 Accept-Encoding:compress;q=0.5, gzip;q=1.0 按(q值)顺序支持 gzip , compress Accept-Encoding: * 支持任意类型 不写 支持任意类型 没有q值定义的情况下,如果Accept-Encoding中有identity 那么应该优先返回identity
Accept-Language:
告诉服务器,浏览器支持什么语言Cookie:
(1). Cookie 本意是指就着牛奶一起吃的点心。在Internet上,Cookie指的是小量信息
(2). Cookie是由 Web服务器创建并保存在用户浏览器上的小文本文件,它以key/value的形式保存用户的相关信息,这些数据通常会经过加密处理。
更多Cookie的介绍参见什么是Cookie?Authorization:
授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中;
四、Http响应
响应格式:状态行|通用报头|响应报头|实体报头
HTTP/1.1 200 OK
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html
Date: Wed, 31 Aug 2016 03:27:04 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Search_result: OK
Server: Apache
Set-Cookie: BDRCVFR[X_XKQks0S63]=mk3SLVN4HKm; path=/; domain=.baidu.com
Tracecode: 16246681250496487690083111
Vary: Accept-Encoding
X-Bd-Id: 14704930773111916548
X-Bd-Oc: 0
X-Bd-Ul: 9cd10c5ab95e2efdc2de2f16af6f004c
Transfer-Encoding: chunked
HTTP/1.1 200 OK:
状态行,包括URI协议、版本号、状态码和原因Connection:
如果如果server方不想支持长链接,需要明确说明connection的值为close.Content-Encoding:
文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Content-Type:
表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。Date:
当前时间P3p:
提供个人隐私保护策略的东东Server:
服务端软件信息Set-Cookie:
回传给客户端的cookieVary:
vary的意义在于告诉代理服务器/缓存/CDN,如何判断请求是否一样,vary中的组合就是服务器/缓存/CDN判断的依据,比如Vary中有User-Agent,那么即使相同的请求,如果用户使用IE打开了一个页面,再用Firefox打开这个页面的时候,CDN/代理会认为是不同的页面,如果Vary中没有User-Agent,那么CDN/代理会认为是相同的页面,直接给用户返回缓存的页面,而不会再去web服务器请求相应的页面。Transfer-Encoding:
用于http传送过程的分块技术,表示输出的内容长度不能确定,常用于动态网页。