打印
[麦麦茶水间]

【每周分享】TCP协议的报文到底长啥样?不要急,Wireshark抓包告诉你!

[复制链接]
653|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dffzh|  楼主 | 2025-7-25 13:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#申请原创#
@21小跑堂


TCP协议,即TransmissionControl Protocol,传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。
TCP协议的报文格式如下图所示:

为了便于大家更好地理解TCP协议,作者通过Wireshark工具捕捉TCP报文,并对照TCP协议格式进行详细讲解。
抓取的报文数据如下图红色方框所示:

双击打开后,里面的标注了Transmission Control Protocol的即为TCP报文,如下图红色方框所示:


1、源端口:Source Port
TCP/IP协议中的端口是一种逻辑意义上的端口,端口号的范围为0~65535,即两个字节;
通信发起者的端口号,总共16位(2字节);
对应报文为0x01bb,即443:

其实433是一个比较常见的端口号,又称网页浏览端口,主要是用于HTTPS服务,是提供加密和通过安全端口传输的另一种HTTP(80端口)。所以如果你了解433端口,那就可以知道该TCP报文就是关于HTTPS协议方面的通信内容。另外,以下也列举了一些常见的网络协议对应的端口值:
HTTP(80端口)HTTPS(443端口),FTP(21端口)SSH(22端口),Telnet(23端口)SMTP(25端口)DNS(53端口)POP3(110端口)IMAP(143端口)RDP(3389端口)
2、目的端口:Destination Port
通信接收者的端口号,总共16位(2字节);
对应报文为0x1d82,即7554:


3、序号:Sequence Number
TCP连接中传送的数据流里面的每一个字节都会编上一个序号,而序号字段的值指的是本报文所发送的数据的第一个字节的序号,总共32位(4字节);
对应报文为0x1eb2a102,即515023106:
Sequence Number: 1是Wireshark自行减去的相对序号;
Sequence Number(raw)是原始序号(绝对序号);
Next Sequence Number: 1 指的该方向下一包的序号,不在报文数据流中,是Wireshark自行解析的。

4、确认号:Acknowledgment Number
期望收到对方的下一个报文的数据的第一个字节的序号,总共32位(4字节);
对应报文为0xa16f72be,即2708435646:
AcknowledgmentNumber: 2是Wireshark自行减去的相对序号;
AcknowledgmentNumber(raw)是原始序号(绝对序号)。

5、数据偏移(首部长度):Header Length
该字段指出TCP报文的数据起始处距离TCP报文的起始处有多远,即TCP报文的首部长度,单位是32位字(以4字节为计算单位),总共4位(最大1111b可以表示15),即数据偏移的最大值是15*4=60个字节,即TCP首部的最大字节是60字节,即选项字节不能超过40字节(TCP首部最大字节数-固定首部字节数);
对应报文为二进制1000,即8,因此该报文的首部长度是8*4=32字节:

6、标志位:Flag
涉及的标志位及作用如下所示:
保留位:6位,暂未使用;
Urgent:URG,紧急,1位,为1时,即告诉系统此报文中有紧急数据,需要尽快发送;
Acknowledgment:ACK,确认/应答,1位,为1时,确认号字段才有效;
Push:PSH,1位,推送,为1时,应尽快交付接收应用进程,不等到整个缓存都填满再向上交付;
Reset:RST,复位,1位,为1时,表示TCP连接中出现严重错误,需要释放连接后再重建连接;还用来拒绝一个非法的报文段或拒绝打开一个连接。
Syn:SYN,同步,1位,建立连接的时候使用,即当SYN=1,ACK=0时,为请求连接;当SYN=1,ACK=1时,为同意连接的请求应答;
Fin:FIN,终止,1位,用来释放一个连接,即为1时表明此报文的发送端的数据已发送完毕,并要求释放连接;
对应报文为0x010:

里面的TCP Flags后面的内容即表示当前哪些标志位被置1了,比如该报文里是ACK标志位被置1了,则对应显示首字母A。比如下面的报文是SYN标志位被置1了,则对应显示首字母S:

7、窗口:Window
接收端的接收窗口的大小,是一种流量控制手段,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节,总共16位(2字节);
对应报文为0x0099,即153:

8、校验和:Checksum
这个字段大家应该都比较熟悉,经常在通信协议中用来监测数据通信过程中是否出现错误报文,总共16位(2字节);
对应报文为0x7b4e:

9、紧急指针:Urgent Pointer
该字段指出在本报文中共有多少个字节的紧急数据,紧急数据放在本报文的数据的最前面,总共16位(2字节);
对应报文为0x0000,即该报文里面没有紧急数据:

10、选项和填充:Options And Padding
该字段的长度可变,当没有使用“选项”时,TCP的首部长度是20字节,其最大长度可根据TCP首部长度进行推算,其长度即为TCP首部最大字节数-固定首部字节数,最长可达40字节;
对应报文为总共12字节,其实也就是该报文的TCP首部长度32-固定首部20=12:

11、数据:Data
如果有数据的话,就会存在该字段,为不定长度。
以上通过Wireshark工具捕捉的TCP协议报文对TCP协议的各个字段进行了详细阐述,希望可以加深大家对TCP协议的理解,如有不足之处,欢迎来贴补充和分享~~。

使用特权

评论回复
沙发
xixi2017| | 2025-7-26 11:51 | 只看该作者
是一组有规律的字符串。

使用特权

评论回复
板凳
wanduzi| | 2025-7-26 14:55 | 只看该作者
这种造轮子的事情不需要自己做吧

使用特权

评论回复
地板
穷得掉渣大侠| | 2025-7-28 08:24 | 只看该作者
非常详细的TCP报文解析,通过Wireshark工具的抓包示例,让我们对TCP协议有了更直观的认识,感谢分享!

使用特权

评论回复
5
dffzh|  楼主 | 2025-7-28 08:55 | 只看该作者
wanduzi 发表于 2025-7-26 14:55
这种造轮子的事情不需要自己做吧

基于带MAC功能的MCU实现以太网通信,是需要组包协议帧的,所以还是需要了解协议规则的。

使用特权

评论回复
6
dffzh|  楼主 | 2025-7-28 08:56 | 只看该作者
穷得掉渣大侠 发表于 2025-7-28 08:24
非常详细的TCP报文解析,通过Wireshark工具的抓包示例,让我们对TCP协议有了更直观的认识,感谢分享!
...

是的,逐个字段解析后,自己对TCP协议的理解也加深了。

使用特权

评论回复
7
绝影孤狼| | 2025-7-28 11:36 | 只看该作者
非常实用的分享,通过Wireshark抓包来直观展示TCP协议的报文结构,学习了!

使用特权

评论回复
评论
dffzh 2025-7-31 08:56 回复TA
这种学习方式的效率确实比较高。 
8
星空魔法师| | 2025-7-28 13:18 | 只看该作者
这篇分享太棒了,通过Wireshark抓包来讲解TCP协议报文,直观又详细,学习了!

使用特权

评论回复
评论
dffzh 2025-7-31 08:56 回复TA
好好学~~ 
9
作业粉碎机| | 2025-7-28 19:36 | 只看该作者
学习了,通过Wireshark抓包分析TCP协议报文,确实能更直观地理解TCP协议的各个字段。楼主的分享很详细,感谢!

使用特权

评论回复
评论
dffzh 2025-7-31 08:57 回复TA
一起进步,这种抓包分析报文的方式应该是学习和研究网络协议的比较好的方法。 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

1102

帖子

20

粉丝