通过Wireshark捕捉访问网页的全过程
整个过程可以概括为以下几个部分:
1)域名解析成IP地址
2)与目的主机进行TCP连接(三次握手)
3)发送与收取数据(浏览器与目的主机开始HTTP访问过程)
4)与目的主机断开TCP连接(四次挥手)
1. 打开Wireshark并开始捕捉
2. 访问网页
-
打开一个无痕浏览器,并访问网站www.4399.com
-
访问完成后,停止抓包
3. DNS解析域名过程
DNS域名解析时用的是UDP协议。整个域名解析的过程如下:
1)浏览器向本机DNS模块发出DNS请求,DNS模块生成相关的DNS报文;
2)DNS模块将生成的DNS报文传递给传输层的UDP协议单元;
3)UDP协议单元将该数据封装成UDP数据报,传递给网络层的IP协议单元;
4)IP协议单元将该数据封装成IP数据包,其目的IP地址为DNS服务器的IP地址;
5)封装好的IP数据包将传递给数据链路层的协议单元进行发送;
6)发送时在ARP缓存中查询相关数据,如果没有,就发送ARP广播(包含待查询的IP地址,收到广播的主机检查自己的IP,符合条件的主机将含有自己MAC地址的ARP包发送给ARP广播的主机)请求,等待ARP回应;
7)得到ARP回应后,将IP地址与路由的下一跳MAC地址对应的信息写入ARP缓存表;
8)写入缓存后,以路由下一跳的地址填充目的MAC地址,以数据帧形式转发;
9)转发可能进行多次;
10)DNS请求到达DNS服务器的数据链路层协议单元;
11)DNS服务器的数据链路层协议单元解析数据帧,将内部的IP数据包传递给网络层IP协议单元;
12)DNS服务器的IP协议单元解析IP数据包,将内部的UDP数据报传递给传输层UDP协议单元;
13)DNS服务器的UDP协议单元解析收到的UDP数据报,将内部的DNS报文传递给DNS服务单元;
14)DNS服务单元将域名解析成对应IP地址,产生DNS回应报文;
15)DNS回应报文->UDP->IP->MAC->我的主机;
16)我的主机收到数据帧,将数据帧->IP->UDP->浏览器;
17)将域名解析结果以域名和IP地址对应的形式写入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.
Time to Live(生存时间TTL):表示该资源记录的生命周期,从取出记录到抹掉记录缓存的时间,以秒为单位.
Data length(资源数据长度):以字节为单位,这里的4表示IP地址的长度为4字节.也就是下面Addr字段的长度.
Addr(资源数据): 返回的IP地址,就是我们想要的结果.
4. 三次握手
过滤一下IP地址
三次握手过程:
第一次握手:客户端发送SYN包至服务器,并进入SYN_SENT状态,等待服务器确认
第二次握手:服务器收到客户端的SYN包,发送一个ACK,同时发送自己的SYN,此时服务器进入SYN_RCVD状态
第三次握手:客户端接收到服务器发送的SYN+ACK后,进入ESTABLISHED状态,并发送服务器SYN包的确认ACK,服务器接收到客户端ACK后,进入ESTABLISHED状态
第一次握手:
浅蓝色那里的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访问过程)
过程:
1)浏览器向域名发出GET方法报文(HTTP请求);
2)该GET方法报文通过TCP->IP(DNS)->MAC(ARP)->网关->目的主机;
3)目的主机收到数据帧,通过IP->TCP->HTTP,HTTP协议单元会回应HTTP协议格式封装好的HTML形式数据(HTTP响应);[ 从请求信息中获得客户机想访问的主机名。从请求信息中获取客户机想要访问的web应用(web应用程序指提供浏览器访问的程序,简称web应用)。从请求信息中获取客户机要访问的web资源。(web资源,即各种文件,图片,视频,文本等)读取相应的主机下的web应用,web资源。用读取到的web资源数据,创建一个HTTP响应。
4)该HTML数据通过TCP->IP(DNS)->MAC(ARP)->网关->我的主机;
5)我的主机收到数据帧,通过IP->TCP->HTTP->浏览器,浏览器以网页形式显示HTML内容。
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的版本号。
GET和POST的区别:
1)get是从服务器上获取数据,post是向服务器传送数据。
2)生成方式不同:
Get:URL输入;超连接;Form表单中method属性为get;Form表单中method为空。
Post只有一种:Form表单中method为Post。
3)数据传送方式:Get传递的请求数据按照key-value的方式放在URL后面,在网址中可以直接看到,使用?分割URL和传输数据,传输的参数之间以&相连,如:login.action?name=user&password=123。所以安全性差。
POST方法会把请求的参数放到请求头部和空格下面的请求数据字段就是请求正文(请求体)中以&分隔各个字段,请求行不包含参数,URL中不会额外附带参数。所以安全性高。
4)发送数据大小的限制:通常GET请求可以用于获取轻量级的数据,而POST请求的内容数据量比较庞大些。
Get:1~2KB。get方法提交数据的大小直接影响到了URL的长度,但HTTP协议规范中其实是没有对URL限制长度的,限制URL长度的是客户端或服务器的支持的不同所影响。
Post:没有要求。post方式HTTP协议规范中也没有限定,起限制作用的是服务器的处理程序的能力。
5)提交数据的安全:POST比GET方式的安全性要高。Get安全性差,Post安全性高。
通过GET提交数据,用户名和密码将明文出现在URL上,如果登录页面有浏览器缓存,或者其他人查看浏览器的历史记录,那么
就可以拿到用户的账号和密码了。安全性将会很差。
其中HTTP协议版本有两种:HTTP1.0/HTTP1.1。HTTP1.0/HTTP1.1的区别:
HTTP1.0对于每个连接都只能传送一个请求和响应,请求完服务器返回响应就会关闭,HTTP1.0没有Host字段。
而HTTP1.1在同一个连接中可以传送多个请求和响应,多个请求可以重叠和同时进行,HTTP1.1必须有Host字段。
请求头部紧跟着请求行,该部分主要是用于描述请求正文,其基本格式如下:
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开头组成。
1XX 请求正在处理
2XX 请求成功 200 OK 正常处理 204 no content 请求处理成功但没有资源可返回 206 Partial Content 对资源的某一部分请求
3XX 重定向 301 Moved Permanenly请求资源的URI已经更新(永久移动),客户端会同步更新URI。
302 Found 资源的URI已临时定位到其他位置,客户端不会更新URI。
303 See Other 资源的URI已更新,明确表示客户端要使用GET方法获取资源。
304 Not Modified 当客户端附带条件请求访问资源时资源已找到但未符合条件请求。
307 Temporary Redirect临时重定向
4XX 客户端错误 400 Bad Request 请求报文中存在语法错误,一般为参数异常。401 Unauthorized 发送的请求需要HTTP认证。
403 Forbiddden 不允许访问,对请求资源的访问被服务器拒绝 404 Not Found 无法找到请求的资源,请求资源不存在。
405 请求的方式不支持。
5XX 服务器错误 500 Internal Server Error 服务器的内部资源出故障,服务器在执行请求时发生了错误。
503 Service Unavailable 服务器暂时处于超负载状态或正在进行停机维护,无法处理请求,服务器正忙。
响应头部主要是返回一些服务器的基本信息,以及一些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使用四次挥手关闭一个连接:
第一次挥手:主动关闭方发送一个FIN并进入FIN_WAIT1状态
第二次挥手:被动关闭方接收到主动关闭方发送的FIN并发送ACK,此时被动关闭方进入CLOSE_WAIT状态;主动关闭方收到被动关闭方的ACK后,进入FIN_WAIT2状态
第三次挥手:被动关闭方发送一个FIN并进入LAST_ACK状态
第四次挥手:主动关闭方收到被动关闭方发送的FIN并发送ACK,此时主动关闭方进入TIME_WAIT状态,经过2MSL时间后关闭连接;被动关闭方收到主动关闭方的ACK后,关闭连接
参考资料:
参考资料1
参考资料2
参考资料3文章来源:https://www.toymoban.com/news/detail-403181.html
参考资料4文章来源地址https://www.toymoban.com/news/detail-403181.html
到了这里,关于通过Wireshark捕捉访问网页的全过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!