TCP 首部
TCP header定义如下所示:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Source Port: 源端口号
Destination Port: 目地端口号
Sequence Number: 序列号,表示数据段中第一个字节数据的编号。如果SYN标志位设置,则表示初始序列号(Initial Sequence number,ISN),此数据段中的第一个字节编号为ISN+1.
Acknowledgment Number: 确认序列号,只有当ACK标志位设置时才有意义,表示此数据段的发送方期望收到的数据的编号。当一个连接处于established状态时,ACK标志位总是设置为1.
Data Offset:数据偏移值,指示数据相对于协议头的偏移值,由于数据总是紧跟在协议头的后面,也表示协议头(包含头选项)的长度,单位是4字节。
Reserved:保留字段。
URG/ACK/PSH/RST/SYN/FIN:控制位,其定义如下:
URG:紧急数据指针有效位
ACK:确认序列号字段有效位
PSH:表明接收方需将数据递送到应用程序。
RST:重置连接。
SYN:表明当前为SYN数据段。
FIN:表示没有更多数据需要发送
Window:接收窗口,表明此数据段的发送方期望收到的数据量,单位为字节。
Checksum: 校验和, 其计算需要包含伪头部、TCP头部、tcp负载数据,如果负载数据的长度是奇数(字节),需要填充0(只是计算校验和时用到,并不会发送), 并且计算时校验和字段本身置0。伪头部的定义如下:
+--------+--------+--------+--------+
| Source Address |
+--------+--------+--------+--------+
| Destination Address |
+--------+--------+--------+--------+
| zero | PTCL | TCP Length |
+--------+--------+--------+--------+
Source Address/Destination Address/PTCL:IP层的源地址/目地地址/协议号。
TCP Length: TCP协议头及负载数据的长度(包含尾部的填充字节)。
Urgent Pointer:紧急数据指针,是一个相对于当前数据段的序列号的偏移值,指向紧急数据之后的数据,表示这之前的数据为紧急数据。当URG置位是有效。
Options: TCP选项字段。
TCP选项
TCP选项根椐长度的不同可分为两种:单字节选项 和 多字节选项。
其中多字节选项的格式如下:
+--------+--------+---------+--------+
| kind | length | value |
+--------+--------+---------+--------+
kind占用1字节,指示选项类型。
length占用1字节,指示选项长度,包含kind与length。
value为选项内容,长度为lenght - 2.
目前TCP支持的选项如下:
Kind Length Meaning
---- ------ -------
0 - End of option list.
1 - No-Operation.
2 4 Maximum Segment Size.
3 3 Window Scaling Factor
4 2 Selective Acknowledgment Permitted
5 variable Selective Acknowledgement Block
8 10 Timestamps
19 18 MD5 digest
28 4 User Timeout
29 variable Authentication