通过Wireshark捕捉访问网页的全过程
整个过程可以概括为以下几个部分:
1. 打开Wireshark并开始捕捉
2. 访问网页
-
打开一个无痕浏览器,并访问网站www.4399.com
-
访问完成后,停止抓包
3. DNS解析域名过程
在显示过滤器中输入DNS,搜索www.4399.com相关的报文
IPv4 DNS请求报文:
分析:
第一个是Transaction ID为标识字段,2字节,用于辨别DNS应答报文是哪个请求报文的响应.
第二个是Flags标志字段,2字节,每一位的含义不同,具体可以参考上面那个图,也可以看下面这个图:
QR: 查询/响应,1为响应,0为查询
Opcode: 查询或响应类型,这里0表示标准,1表示反向,2表示服务器状态请求
AA: 授权回答,在响应报文中有效,待会儿再看
TC: 截断,1表示超过512字节并已被截断,0表示没有发生截断
RD: 是否希望得到递归回答
RA: 响应报文中为1表示得到递归响应
zero: 全0保留字段
rcode: 返回码,在响应报文中,各取值的含义:
0 - 无差错
1 - 格式错误
2 - 域名服务器出现错误
3 - 域参照问题
4 - 查询类型不支持
5 - 被禁止
6 ~ 15 保留
紧接着标志位的是
Quetions(问题数),2字节,通常为1
Answer RRs(资源记录数),Authority RRs(授权资源记录数),Additional RRs(额外资源记录数)通常为0
字段Queries为查询或者响应的正文部分,分为Name Type Class
Name(查询名称):这里是ping后的参数,不定长度以0结束
Type(查询类型):2字节,这里是主机A记录.其各个取值的含义如下:
值 助记符 说明
1 A IPv4地址。
2 NS 名字服务器。
5 CNAME 规范名称。定义主机的正式名字的别名。
6 SOA 开始授权。标记一个区的开始。
11 WKS 熟知服务。定义主机提供的网络服务。
12 PTR 指针。把IP地址转化为域名。
13 HINFO 主机信息。给出主机使用的硬件和操作系统的表述。
15 MX 邮件交换。把邮件改变路由送到邮件服务器。
28 AAAA IPv6地址。
252 AXFR 传送整个区的请求。
255 ANY 对所有记录的请求。
Class(类):2字节,IN表示Internet数据,通常为1
IPv4 DNS响应报文:
分析:
可以看到和第一个请求包相比,响应包多出了一个Answers字段,同时Flags字段每一位都有定义.
关注一下Flags中Answer RRs 为4 说明对应的Answers字段中将会出现2项解析结果.
Answers字段可以看成一个List,集合中每项为一个资源记录,除了上面提到过的Name,Type,Class之外,还有Time to Live,Data length,Addr.
4. 三次握手
过滤一下IP地址
三次握手过程:
第一次握手:
浅蓝色那里的Sequence number,只是相对序列号。
客户端作为源主机通过向服务器(作为目的主机)发送TCP连接请求(SYN段),其中flags处,SYN=1,ACK=0;
客户端进入SYN_SENT状态。
第二次握手:
服务器在指定的端口等待连接,收到TCP连接请求后,将回应一个TCP连接应答(即SYN/ACK段),其中Flags显示是SYN=1,ACK=1;序列号不变,但确认号为客户端的初始序列号加一。
服务器进入SYN_RCVD状态
第三次握手:
客户端再向服务器发送一个TCP连接确认报文,其中Flags处SYN=0,ACK=1;序列号为客户端初始序列号加一,确认好为服务器的初始序列号加一。
此时客户端和服务器都进入ESTABLISHED状态。
经过上述的三次握手,TCP连接正式建立,双方都置为ACK flag,交换并确认了对方的初始序列号。
5. 发送与收取数据(浏览器与目的主机开始HTTP访问过程)
过程:
HTTP协议:
请求报文和响应报文结构:
分析:
HTTP请求报文:
一个HTTP请求报文由请求行(request line)、请求头部(request header)、空行和请求数据4个部分构成。
请求行数据格式由三个部分组成:请求方法、URI、HTTP协议版本,他们之间用空格分隔。
该部分位于数据首行,基本格式为:
GET / HTTP/1.1
该部分的请求方法字段给出了请求类型,URI给出请求的资源位置(/)。HTTP中的请求类型包括:GET、POST、HEAD、PUT、DELETE。一般常用的为GET和POST方式。最后HTTP协议版本给出HTTP的版本号。
请求头部紧跟着请求行,该部分主要是用于描述请求正文,其基本格式如下:
Host: www.4399.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
主要是用于说明请求源、连接类型、以及一些Cookie信息等。
请求正文和请求头部通过一个空行进行隔开,一般用于存放POST请求类型的请求正文。
HTTP响应报文:
HTTP响应报文由状态行(HTTP版本、状态码(数字和原因短语))、响应头部、空行和响应体4个部分构成。
其中响应头部和响应体同样也是通过一个空行进行隔开,如下为一个简单的示例:
HTTP/1.1 200 OK
Date: Tue, 25 Jan 2022 08:38:24 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Expires: Tue, 25 Jan 2022 05:50:30 GMT
Server: nginx
Last-Modified: Tue, 25 Jan 2022 01:14:26 GMT
ETag: W/"61ef4ef2-26b31"
Cache-Control: max-age=1800
Content-Encoding: gzip
Age: 11874
X-Via: 1.1 PS-KHN-01xD135:4 (Cdn Cache Server V2.0), 1.1 wtong33:1 (Cdn Cache Server V2.0), 1.1 PS-JJN-01nQa28:12 (Cdn Cache Server V2.0)
X-Ws-Request-Id: 61efb700_PS-JJN-010EZ27_38388-36841
388
............ys[../.........-U,a...b*....K'.n.o...bA$DR" ..-.I.w.%;.FR.D...y.G.-[..x.-..%K.......g...`.{.......{.................UM................B.#..P..._....^.._VE...^.........LK(.._UWU7.
...B.N.:|*v8...z._B.i...X.<TP~y...P].....{......Q.q".t....9.i...f..`-.............
.........U.....B.t!DO8RU....g.G..Ec.huU.}.L}S.....kQ.j.......v..Bs.%[.~fsum..x,../....._
....
或者有一些浏览器响应头部在Header中显示,响应体在Reponse中显示。
状态行主要给出响应HTTP协议的版本号、响应返回状态码、响应描述,同样是单行显示。格式为:
HTTP/1.1 200 OK
状态码告知从服务器端返回的请求的状态,一般由一个三位数组成,分别以整数1~5开头组成。
响应头部主要是返回一些服务器的基本信息,以及一些Cookie值等。如上的响应头为:
Date: Tue, 25 Jan 2022 08:38:24 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Expires: Tue, 25 Jan 2022 05:50:30 GMT
Server: nginx
Last-Modified: Tue, 25 Jan 2022 01:14:26 GMT
ETag: W/"61ef4ef2-26b31"
Cache-Control: max-age=1800
Content-Encoding: gzip
Age: 11874
X-Via: 1.1 PS-KHN-01xD135:4 (Cdn Cache Server V2.0), 1.1 wtong33:1 (Cdn Cache Server V2.0), 1.1 PS-JJN-01nQa28:12 (Cdn Cache Server V2.0)
X-Ws-Request-Id: 61efb700_PS-JJN-010EZ27_38388-36841
响应体为请求需要得到的具体数据,可以为任何类型数据,一般网页浏览返回的为html文件内容,如上面的响应体为:
388
............ys[../.........-U,a...b*....K'.n.o...bA$DR" ..-.I.w.%;.FR.D...y.G.-[..x.-..%K.......g...`.{.......{.................UM................B.#..P..._....^.._VE...^.........LK(.._UWU7.
...B.N.:|*v8...z._B.i...X.<TP~y...P].....{......Q.q".t....9.i...f..`-.............
.........U.....B.t!DO8RU....g.G..Ec.huU.}.L}S.....kQ.j.......v..Bs.%[.~fsum..x,../....._
....
6. 四次挥手
TCP使用四次挥手关闭一个连接:
参考资料:
参考资料1
参考资料2
参考资料3
参考资料4