【通过抓包学网络】TCP三次握手与四次挥手

本文章是通过wireshark来抓包的,如果你对这个工具不熟悉可以看这篇文章wireshark 简易教程

正文开始

1.首先抓个包

通过上一篇文章大家应该都能打开对应网卡的抓包页面了哈;我们利用DNS服务可以将域名解析成IP的功能来演示如何抓到我们想要的包。

1.1 开始抓包

如果进入抓包页面没有自动开始抓包,就点击左上角的开始抓包按钮,如图:
【通过抓包学网络】TCP三次握手与四次挥手_第1张图片

1.2 打开命令行界面

博主用的win10操作系统,所以打开的就是CMD了,输入以下命令

>nslookup
>set vc
>www.baidu.com

命令执行情况如图:
【通过抓包学网络】TCP三次握手与四次挥手_第2张图片

1.3 停止抓包

点击红框标记的按钮:
【通过抓包学网络】TCP三次握手与四次挥手_第3张图片

1.4 筛选

这个时候可以看到界面上抓到很多包,但是有很多是其他应用进行的网络请求,并不是我们想要的,所以要进行筛选。
在筛选框我们用Ip进行筛选,表达式为ip.addr == 116.199.0.200,如图
【通过抓包学网络】TCP三次握手与四次挥手_第4张图片
116.199.0.200是我本机DNS的ip,你可以通过刚在输入的nslookup命令得到,如图
【通过抓包学网络】TCP三次握手与四次挥手_第5张图片
但是通过筛选后发现还是有很多包不是我们想要的,我们通过info列来找到我们请求DNS的包,如图:
找到DNS协议info这列有我们刚才输入需要解析的域名这两行,这两行就是DNS解析域名的过程,我们从这两行的Info就可以很清晰的看出DNS解析域名的过程,首先192.168.1.107询问DNS www.baidu.com的IP是多少,然后DNS在下一行进行回复。
【通过抓包学网络】TCP三次握手与四次挥手_第6张图片

1.5 找到三次握手的包

在1.4小节中我们找到的926和927号包的上面就是三次握手的包,分别是921,922,923这三个包,如图:
【通过抓包学网络】TCP三次握手与四次挥手_第7张图片
你可能想问是怎么看出来的,好问题,主要是看Seq和Ack的值,三次握手的时候Seq的相对值是为0的(注意是相对值)。找到了三次握手的网络包,我们就来分析一下三次握手吧。

2. 分析三次握手

2.1 TCP 参数介绍

要学习TCP首先要学习它的参数。

Seq:标识改数据段的序号。因为TCP的传输是有序的,接收者可以通过Seq对包进行排序。

Len:表示Seq对应数据的长度。

Ack:确认号,向数据提供者表明收到了哪些包(实际收到包的Seq序号需要 Ack - 1,因为Seq是从0开始的,例如Ack = 2说明已经收到 第0段和第1段需要包,下一个需要接收的序号包Seq 需要为 2)。

SYN:表示携带这个参数的数据包正在发起连接请求。

FIN:表示携带这个参数的包正在请求停止连接。

2.2 三次握手过程

用来分析的数据包如图:
【通过抓包学网络】TCP三次握手与四次挥手_第8张图片
第一次握手 192.168.1.107 向 116.119.0.200 发送携带 SYN; Seq = 0;len = 0的请求。SYN表示这是在请求连接,Seq表示目前发送的是第0段数据包,len表示数据包的长度为0。

第二次握手 116.119.0.200 向192.168.1.107发送携带SYN;Seq = 0;Len = 0; Ack = 1的请求。因为TCP是双向连接,所以双方都要维护各自的参数,除了Ack其他参数在第一次握手的时候讲过了,Ack表示已经接收到Seq = 0 的数据包了,下一次请从Seq = 1 的数据包发送。

第三次握手:192.168.1.107 向 116.119.0.200 发送携带Ack = 1; Seq = 1; len = 0;的请求,表示已经收到Seq = 0 的数据包了,下一次请从Seq = 1 的数据包发送。
这时连接已经成功建立。

这样就通过三次握手建立了一个连接,至于面试常问的为什么不是两次或者四次相信你已经知道答案了,因为两次不可靠,可能在第二次握手的时候超时了,对方并没有收到请求,而发送方并不知道,以为已经成功建立了连接,所以会向对方发送数据,但是对方因为其他原因没有接收到第二次握手,所以不会接受数据发送方发送的数据。至于四次没必要,因为所有想做的事情已经做完了。

3. 分析四次挥手

3.1 找到四次挥手的数据包

四次挥手的数据包就是928至931,你又想问这是怎么看出来的?好问题,讲三次握手的时候介绍过 FIN参数就代表着请求断开连接,那我们就找离DNS解析域名数据包最近的携带FIN参数的数据包。
【通过抓包学网络】TCP三次握手与四次挥手_第9张图片

3.2 分析四次挥手

第一次挥手:192.168.1.107 向 116.119.0.200 发送携带FIN; Seq = 34; Ack = 93; 的数据包,FIN表示请求断开连接,Seq = 34表示这个数据包是第34段,Ack = 93表示已经收到93段之前的数据包了,下一次请求第93段数据包开始发送。

第二次挥手: 116.119.0.200 向192.168.1.107发送携带Seq = 93; Ack = 35;的数据包,表示请求已经收到 Seq和Ack参数就不解释了。

第三次挥手:116.119.0.200 向192.168.1.107发送携带FIN; Seq = 93; Ack = 35; 的数据包,表示请求断开连接。

第四次挥手:192.168.1.107 向 116.119.0.200 发送携带Seq = 35; Ack = 94;的数据包,表示已经接收到请求。

通过四次挥手完成了连接的断开,面试的时候常问为什么不能是三次挥手,这里已经很明确了,因为116.119.0.200这台服务器需要连续发送两个数据包,那为什么是两个呢?因为可能还有一些网络数据没有处理完,不能马上断开连接,只能先回应请求收到了,等处理完数据后再发送断开连接请求。

你可能感兴趣的:(wireshark,网络协议,网络)