准备工具:

1. 两台连接到同个局域网的电脑,或者虚拟机;

2. 在其中一台电脑安装Wireshark;

3. 在两台电脑上面都有TCP&UDP测试工具软件


TCP连接建立过程(三次握手):


抓包分析TCP连接过程:

1.两台主机都分别打开TCP&UDP测试工具

这里设置主机A的IP地址为10.1.13.2, 主机B为10.1.13.3。

主机A作为客户端,主机B作为服务器端。

--------------------------------------------------------------------

主机A(10.1.13.2) 设置如下:

点击右上角的创建连接,弹出对话框。

类型选择TCP

目标IP选择10.1.13.3,端口号选择80

本机端口号选择指定为4001,当然也能随机端口,这里为了更好说明,选择固定的端口号。

如下图所示:

点击创建,如下图所示:

--------------------------------------------------------------------

主机B(10.1.13.3) 设置如下:

打开TCP&DUP测试工具,点击左上角创建服务器。

指定IP设置为10.1.13.3,本机端口:80。

点击确定之后如下图所示:

点击启动服务器。

--------------------------------------------------------------------

2. 打开Wireshark,选择目前在用的网卡,我这里是“以太网”,点击进入,开始抓包。

3.在主机A(10.1.13.2)中,点击TCP&UDP测试工具中的【连接】按钮。

此时,主机A如下:

主机B如下:

4.Wireshark软件点击左上角红色方框,停止抓包。

可以把抓到的包保存起来,点击文件->保存即可。

在应用显示过滤器搜索栏中输入ip.addr == 10.1.13.2 and ip.addr == 10.1.13.3 and tcp

这样就抓到了TCP连接三次握手过程的包。

5.分析TCP连接过程:

从每一条的初略信息可以看出,第一条是10.1.13.2客户端发给10.1.13.3服务器端的,发送的是一个seq=0, ctl = SYN的包;

第二条是服务器端10.1.13.3发给客户端10.1.13.2, seq = 0, ack = 0, ctl = SYN, ACK;

第三条是客户端发给服务器端 seq = 1, ack = 1, ctl = ACK。

跟我们平时看见的TCP连接三次握手过程一致。

----------------------------------------------------

进一步分析,点击第一条信息,弹出如下详细信息:

这里我们可以看见几个层的详细信息,和原始数据。

其中有一个Transmission Control Protocol, Src Port:4001, Dst Port:80, Seq:0,Len:0.

这个就是一个TCP的包。打开如下:

这里完整给我们展示了第一次握手时TCP包的详细过程。

根据TCP报文格式定义:

对比上面的信息,可以知道每一个数据代表的意思。这里不进行展开说明。

这里发的序列号码是seq=0;

SYN标志在控制位的倒数第二位,如上上图的红线部分;

以上两点说明了这个TCP第一次握手的通信过程。

其他两次握手过程不再展开讨论。


抓包分析TCP发送数据过程:

1. 在TCP&UDP测试工具中,假设这是客户端和服务器TCP是处于连接状态,我们在客户端发送一个hello到服务器,如下图。并按照上面介绍的方法抓包。

抓到的包如下:

第一个包为10.1.13.2发给10.1.13.3的一个TCP包,第二个为10.1.13.3发给10.1.13.2的一个回应。

由上面可以看出,TCP在发送数据的时候,seq=1, ack = 1,当然,这里的seq和ack会随着发送数据的次数而增加,不一定都是1。

控制位 ack, push被置为1;

最后我们还看见了发送的数据,共5个字节,为68 65 6c 6c 6f 翻译为字符串即为hello。

-------------------------------------------------

10.1.13.3回复10.1.13.2,它收到了一个TCP包,如下,seq = 1, 控制位ack置为1。


抓包分析TCP断开过程:

最后点击10.1.13.2客户端主机的TCP&UDP测试工具的"断开连接",再用wireshark抓包,得到如下:

TCP断开是4次握手,如下图:

对比抓包和这个示意图,可以更清晰展现TCP断开的过程。

10.1.13.2客户端发送FIN,ACK控制命令给10.1.13.3服务器,告诉服务器,你可以结束(final)连接了,请给我确认(ack)一下;

服务器收到之后,会先给客户端发送一个ACK,确认收到了客户端的请求;

然后服务器准备好断开之后,再给客户端发送FIN,ACK,告诉客户端,我服务器已经把准备好你断开结束(final)了,收到请给我确认(ack)一下。

客户端收到之后,再给服务器发送一个ACK,说明它收到了。然后进入一个称为TIME_WAIT的等待时间,这个时间要求是2个MSL,

MSL是一个IP包能在互联网上生存的最长时间。这样做是为了防止服务器收不到最后一个ACK,导致服务器资源的浪费。

服务器收到ACK之后就断开了。通信结束。


通过抓包可以更深入学习TCP连接的一些特性,有助于理解网络编程出现的一些问题。

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐