TCP协议包头入门
TCP协议数据包头部结构
下面我通过一抓取一个redis请求的数据包来说明:
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 |
可选包头结构及示意:
可选项类型表
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 | 空操作,补位 |