一、wireshark分析示例
二、curl命令查看HTTP响应头信息
1.清空缓存
在进行跟踪之前,首先清空Web浏览器的高速缓存来确保Web网页是从网络中获取的,而不是从高速缓冲中取得的。之后,还要在客户端清空DNS高速缓存,来确保Web服务器域名到IP地址的映射是从网络中请求。
2.启动wireshark
3.选择接口en0,开始捕获。
4.在浏览器地址栏中输入www.baidu.com,在过滤器中选择HTTP,点击apply。
5.分析数据
在协议框中选择“GET/HTTP/1.1”所在的分组会看到这个基本请求行后跟随着一系列额外的请求首部。在首部后的“\r\n”表示一个回车和换行,以此将该首部与下一个首部隔开。
“Host”首部在HTTP1.1版本中是必须的,它描述了URL中机器的域名,本测试中是www.baidu.com。这就允许了一个Web服务器在同一时间支持许多不同的域名。有了这个首部,Web服务器就可以区别客户试图连接哪一个Web服务器,并对每个客户响应不同的内容。
User-Agent首部描述了提出请求的Web浏览器及客户机器。
接下来是一系列的Accpet首部,包括Accept、Accept-Language、Accept-Encoding、Accept-Charset。它们告诉Web服务器客户Web浏览器准备处理的数据类型。Web服务器可以将数据转变为不同的语言和格式。这些首部表明了客户的能力和偏好。
Keep-Alive及Connection首部描述了有关TCP连接的信息,通过此连接发送HTTP请求和响应。它表明在发送请求之后连接是否保持活动状态及保持多久。大多数HTTP 1.1连接是持久的(persistent),意思是在每次请求后不关闭TCP连接,而是保持该连接以接受从同一台服务器发来的多个请求。
已经查看了由Web浏览器发送的请求,现在来观察Web服务器的应答。响应首先发送“HTTP/1.1 200 ok”,指明它开始使用HTTP 1.1版本来发送网页。同样,在响应分组中,它后面也跟随着一些首部。最后,被请求的实际数据被发送。第一个Cache-control首部,用于描述是否将数据的副本存储或高速缓存起来,以便将来引用。一般个人的Web浏览器会高速缓存一些本机最近访问过的网页,随后对同一页面再次进行访问时,如果该网页仍存
储于高速缓存中,则不再向服务器请求数据。在HTTP请求中,Web服务器列出内容类型及可接受的内容编码。此例中Web服务器选择发送内容的类型是text/html。
客户端(浏览器)从服务器请求数据经历如下基本步骤:
1.用户发起一个http请求,缓存获取到URL,根据URL查找是否有匹配的副本,这个副本可能在内存中,也可能在本地磁盘。
2.如果请求命中本地缓存则从本地缓存中获取一个对应资源的"copy"。
3.检查这个"copy"是否过期,没过期则直接返回,过期则继续向服务器转发请求。
HTTP中,通过Cache-Control首部和Expires首部为文档指定了过期时间,通过对过期时间的判断,缓存就可以知道文档是不是在保质期内。
Expires首部和Cache-Control:max-age首部都是来告诉缓存文档有没有过期,为什么需要两个响应首部来做这件简单的事情?
其实这一切都是历史原因,Expires首部是HTTP 1.0中提出来的,因为使用的是绝对日期,如果服务端和客户端时钟不同步的话(实际上这种情况非常常见),缓存可能就会认为文档已经过了保质期。
4.服务器接收到请求,然后判断资源是否变更,是则返回新内容,否则返回304,未变更,更新过期时间。
命令行输入命令
[root@localhost ~]# curl -I http://www.baidu.com/
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: keep-alive
Content-Length: 277
Content-Type: text/html
Date: Mon, 22 Feb 2021 07:42:44 GMT
Etag: "575e1f59-115"
Last-Modified: Mon, 13 Jun 2016 02:50:01 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
HTTP响应头的信息
(1)HTTP返回码
状态码 | 意义 |
1xx | client的请求,server已经接收,正在处理。 |
2xx | 成功。表示client请求,server端已经接收、理解并处理。 |
3xx | client请求被重定向其它的server(其它的URL)。 |
4xx | 表示client请求不正确,server不能识别。 |
5xx | server端服务不正常。 |
(2)Cache-Control
web站点对缓存的设置:Cache-Control指定请求和响应遵循的缓存机制。
缓存分类
私有缓存:常见就是浏览器里内置的缓存。
公有缓存:常见的就是代理缓存。
Cache-Control可选的参数:private、public、no-cache、max-age、must-revalidate等。
no-cache:响应不会被缓存,而是实时向服务器端请求资源。
no-store:在任何条件下,响应都不会被缓存,并且不会被写入到客户端的磁盘里,这也是基于安全考虑的某些敏感的响应才会使用这个。
Private:指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅描述当前用户的部分响应消息,此响应消息对于其他用户的请求无效。不能在用户间共享。
Public:响应会被缓存,并且在多用户间共享。正常情况,如果要求HTTP认证,响应会自动设置为private。
max-age:指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
例如:Cache-control: max-age=5表示当访问此网页后的5秒内再次访问不会去服务器。
must-revalidate:响应在特定条件下会被重用,以满足接下来的请求,但是它必须到服务器端去验证它是不是最新的(强制所有缓存都验证响应)。
proxy-revalidate:类似于must-revalidate,它要求对公共缓存进行验证。
(3)Connection
server是否支持长连接;如果是keep-alive,说明web的server支持长连接。但是TCP的长连接是双向的;必须是client和server都支持长连接,才可以建立长连接。
一般client浏览器都是默认支持长连接;所以只要sever端支持长连接,就可以建立长连接。
通过curl的-w参数可以自定义curl的输出,%{http_code}代表http状态码。
[root@localhost ~]# curl -I -o /dev/null -s -w %{http_code}"\n" www.baidu.com
200