TCP协议包头入门

TCP协议数据包头部结构

TCP协议包头入门

TCP协议包头入门下面我通过一抓取一个redis请求的数据包来说明:

TCP协议包头入门TCP协议包头入门

TCP固定头示意:

16进制 10进制 头部信息 备注
0xcd8e 52622 16位源端口号  
0x18ed 6379 16位目的端口号  
0x3210 6019   32位序号  
0x0000 0000   32位确认号 这里因为是syn包,所以为0
0xb 11 4位头部长度(32bit)  
0x002   syn

① URG: 表示紧急指针是否有效

② ACK: 表示确认号是否有效(携带ACK标志的TCP报文段称为确认报文段)

③ PSH: 提示接收端应用程序要立即从TCP接收缓冲区读走数据,以腾出空间接收后续的数据。(若应用程序不读走数据,数据会一直留在TCP模块的接收缓冲区)  

④ RST: 表示要求对方重新建立连接(携带RST标志的TCP报文段为复位报文段)  

⑤ SYN: 表示请求建立一个连接(携带SYN标志的TCP报文段称为同步报文段)  

⑥ FIN: 表示通知对方要关闭连接(携带FIN标志的TCP报文段为结束报文段)

0xffff   16位窗口大小  
0xfe34   16位校验和  
0x0000   16位紧急指针 因为SYN包,所以紧急指针为0

可选包头结构及示意:

TCP协议包头入门

可选项类型表

TCP协议包头入门

TCP协议包头入门

16进制 10进制 TCP头部选项 备注
0x0204   设置kind值和最大segment长度  
0x3fd8 16344 设置最大报文段长度  
0x01   空操作  
0x0303   设置kind值和窗口扩大因子

kind=3,窗口扩大因子选项,TCP连接初始化时,通信双发使用该协议来协商接受通告窗口的扩大因子。在TCP的头部中,接受通告窗口大小是

使用16位来表示的,故最大为65535字节,但实际上TCP模块允许的接受通告大小远不止这个数。窗口扩大因子解决了这个问题。

假设TCP头部中的接受通告窗口大小是N,窗口扩大因子是M,那么实际的接受通告窗口大小为N左移M位。

0x06 6 扩大因子为6  
0x0101   空操作  
0x080a   时间戳选项kind和长度  
0x69ad 9cc6 1772985542 时间戳  
0x0000 0000 0 回显应答时间戳  
0x0402   允许SACK操作

kind=4,选择性确认。为了提高TCP丢包重传的效率,SACK是用来只传输丢掉的数据包,而不是传输从丢弃包开始后的所有包。这个选项

用来表示是否支持SACK技术。

0x0000   空操作,补位