Wireshark抓包分析TCP连接、发送数据与断开过程

准备工具:

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连接的一些特性,有助于理解网络编程出现的一些问题。

 

### 使用 Wireshark 抓取并分析 TCP 数据包 #### 准备工作 在使用 Wireshark 进行抓包之前,需要完成一些基本的准备工作。确保计算机上已安装 Wireshark 软件,并具备网络接口卡(NIC)权限以便捕获流量。启动程序后,在界面下方选择要监控的目标网卡设备[^2]。 #### 开始抓包 点击工具栏上的“开始捕捉数据包”按钮(通常是一个鲨鱼鳍图标),此时会实时显示通过选定网络适配器传输的所有数据流信息。为了减少无关干扰项,可设置过滤条件来限定只查看特定类型的通信记录。例如输入`tcp.port == 80`仅展示HTTP相关联部分[^3]。 #### 设置过滤规则 对于更精确的结果筛选,可以根据实际需求构建复杂的布尔表达式组合多种属性字段共同作用于查询语句之中。比如针对某个具体端口号或者IP地址范围内的交互行为做深入剖析。这里提到的一个例子就是利用 `tcp.port eq 13` 来专注于观察 daytime 协议下的客户机和服务端之间的联系状况。 #### 分析三次握手过程 当新建立一条TCP连接时,双方之间会发生著名的三步握手动作。第一个阶段由发起方发出SYN标志位置起始同步请求;第二个环节接收者回应带有相同SYN标记以及额外附加ACK确认信号的数据帧;最后一步则是原发方向目标节点回传单纯含有ACK标识符的消息以最终确立链路有效性[^4]。 #### 序列号确认号机制 在一个完整的通讯周期里,每当有一段有效载荷被成功递交出去之后,相应的另一侧就会依据先前所约定好的算法计算得出新的预期位置数值反馈回去告知对方自己已经准备就绪等待后续更多内容的到来。比如说如果最初发送的是字符串"hello",其长度为5字节,则下一轮回复中的ack值应该等于原始seq加上这五个单位大小之总和[^5]。 ```python # 示例 Python脚本用于自动化处理Wireshark导出文件 import pyshark def analyze_tcp_packets(pcap_file): capture = pyshark.FileCapture(pcap_file) for packet in capture: try: if 'TCP' in packet and hasattr(packet.tcp, 'stream'): src_port = packet.tcp.srcport dst_port = packet.tcp.dstport # 打印源端口、目的端口以及其他感兴趣的参数 print(f'Source Port: {src_port}, Destination Port: {dst_port}') except AttributeError as e: pass # 处理异常情况 if __name__ == "__main__": pcap_filepath = './example.pcap' analyze_tcp_packets(pcap_filepath) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值