dffzh 发表于 2025-7-25 13:29

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

#申请原创#
@21小跑堂


TCP协议,即TransmissionControl Protocol,传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP协议的报文格式如下图所示:
为了便于大家更好地理解TCP协议,作者通过Wireshark工具捕捉TCP报文,并对照TCP协议格式进行详细讲解。抓取的报文数据如下图红色方框所示:
双击打开后,里面的标注了Transmission Control Protocol的即为TCP报文,如下图红色方框所示:

1、源端口:Source PortTCP/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 NumberTCP连接中传送的数据流里面的每一个字节都会编上一个序号,而序号字段的值指的是本报文所发送的数据的第一个字节的序号,总共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协议有了更直观的认识,感谢分享!

dffzh 发表于 2025-7-28 08:55

wanduzi 发表于 2025-7-26 14:55
这种造轮子的事情不需要自己做吧

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

dffzh 发表于 2025-7-28 08:56

穷得掉渣大侠 发表于 2025-7-28 08:24
非常详细的TCP报文解析,通过Wireshark工具的抓包示例,让我们对TCP协议有了更直观的认识,感谢分享!
...

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

绝影孤狼 发表于 2025-7-28 11:36

非常实用的分享,通过Wireshark抓包来直观展示TCP协议的报文结构,学习了!

星空魔法师 发表于 2025-7-28 13:18

这篇分享太棒了,通过Wireshark抓包来讲解TCP协议报文,直观又详细,学习了!

作业粉碎机 发表于 2025-7-28 19:36

学习了,通过Wireshark抓包分析TCP协议报文,确实能更直观地理解TCP协议的各个字段。楼主的分享很详细,感谢!
页: [1]
查看完整版本: 【每周分享】TCP协议的报文到底长啥样?不要急,Wireshark抓包告诉你!