iOS开发实录

Http 请求头信息解析

2016-08-10  本文已影响0人  Xiaodongsu

作为前端开发人员(自己给自己定义的) 免不了每次的F12进行调试,这次我们说说 浏览器是如何请求你制作的一个个页面,一个个css文件。

大概分为几个部分

DNS查询

DNS全称为(Domain Name System,域名系统),百度百科的解释是:因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。

文字太多不想记的话可以这样理解,DNS就是 域名和IP的映射,而他们的关系为多对多的,也就是1个域名可以对应N个IP(负载均衡之类的),一个IP可以对应N个不同的域名。而在域名解析时需要用户指定A记录或者CNAME记录等等。

先清空自己电脑上面的DNS缓存,打开一个浏览器,这里我输入度娘的网址,使用Wireshark抓包获取到如下信息:

3

在过滤输入框中输入 DNS || http后部分信息如上图

可以看见在进行HTTP GET 请求之前 进行了DNS query ,在最后的返回信息中获取到了 baidu 对应的ip地址,180.97.33.108/180.97.33.107

也就是说明 www.baidu.com 对应的IP 地址为 180.97.33.108 或者 180.97.33.107 或者还有更多。

简单的测试方法是:在浏览器里面直接输入IP地址访问 看看是不是百度,还可以使用ping命令ping百度的域名看看对应响应的IP地址。

在命令终端里面使用nslookup命令也可以查询对应的DNS

terminal-dns

TCP中三次握手建立连接

本地客户端找到自己需要访问的IP地址后,就要进行握手连接,这个是必要的,在握手连接里面服务器和客户端会协商一些必要的参数例如:window size

4

分析上图,可以看到在DNS查询后就开始了TCP握手报文的请求,连续三个请求就是这里说的tcp中的三次握手建立连接

  1. 第一个,由客户端发起,发送本机的一些基本信息,并设置SYN,表示这个包是握手信号包
  1. 由服务器返回给客户端,告诉客户端服务器收到信息
  1. 客户端收到服务器的返回后会发送ACK的包响应,告诉服务器我收到了,马上我就要开始发送请求了。

每次在一个新的Http请求之前,客户端都会和服务器进行握手,所以在分析抓包的时候会看到很多类似设置了Flags的包。

现在浏览器已经知道了向谁请求数据

请求发送数据

1

从Wireshark工具中可以看到,浏览器向主机名为www.baidu.com的地址发送了一个GET请求,并且使用了HTTP 1.1的协议。

Hypertext Transfer Protocol 就是超文本传输协议,图中可以看见请求的头部信息

主要有:

Request Method:请求方法 GET

Request URI: 请求的URI地址 (URI和URL可以理解为:URI是URL的子集,剩下的自己百度吧)/

Request Version: 请求的协议版本 HTTP/1.1 (当前已经有了HTTP2.0协议)

Host: 主机名

User-Agent:用户代理,是用户使用的浏览器的类型,版本和一些系统基本信息

Accept:浏览器接受的媒体类型

Accept-Language:浏览器接受的语言

Accept-Encoding:浏览器接受的编码种类

Connection:本次请求完毕后的连接方法

服务器接收到请求后会发送Response响应给客户端 如下图

3

可能有同学要问,为什么都是乱码。其实你错拉,这里只是使用了Gzip编码,细心的可以看见在返回的头部里面有这样的一个字段

Content-Encoding:gzip

断开连接

在上面请求头中,有一个字段需要说明下:Connection:keep-alive,这个意思是让服务器和客户端保持一段时间连接,如果该字段为closed那么下一次客户端发起请求就需要再次TCP握手,而为keep-alive就不需要,客户端可以直接发起请求。

4

上图可以看见,在页面请求完毕后(这里看黑色背景部分)客户端首先发起一个Keep-Alive的ACK包,并且重复发送了五次,到了最后,服务器等得不耐烦了,发现这么久了都不来问我要东西,所以服务器就主动发送了一个关闭连接的FIN,里面设置了Flags的Fin属性,客户端迫于无奈只好放手 回复服务器我不要了。

至此,一个完整的HTTP请求就结束了,知道浏览器下一次请求。

文章中用到的数据包点击这里下载:百度网盘

上一篇下一篇

猜你喜欢

热点阅读