+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| 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 |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
以上是RFC 793中定义的TCP报文段的结构。
- Source Port【源端口】【16bits】:发送方的应用进程的端口号
- Destination Port【源端口】【16bits】:接收方的应用进程的端口号
- Sequence Number【序列号】【32bits】:tcp数据中第一个字节的序号。如果SYN标志位是1,那么序列号就是初始序列号,这种情况下,数据中第一个字节的序号是序列号+1。比如,该报文段的序列号是100,报文段中的数据有100个字节,那么下一个报文段的序列号就是200.
- Acknowledgment Number【确认号】【32bits】:确认号表示该报文的发送方期望收到的下一个报文的序列号。也就是说,该报文的发送方已经收到了该确认号之前序列号的报文。
- Data Offset【数据偏移/首部长度】:含有选项的tcp首部是变长的,所以需要表明首部的长度。
- Reserved【保留区域】:保留区域,留到以后使用,必须为0。
- Control Bits【控制位】:
- URG:表示报文段中存在被发送端的上层应用置为“紧急”的数据。
- ACK:表示确认号是有效的。
- PSH:表示接收方应立即将数据交给上层。
- RST:重置连接
- SYN:同步序列号
- FIN:没有更多的数据了
- Window【窗口】【16bits】:用于流量控制。用于表示该报文的发送方愿意接收的字节数量。
- Checksum【校验和】【16bits】:用于校验传输途中,数据是否丢失或损坏。
- Options【选项】:附加选项,因为选项的长度不一定是8bits的整数倍,所以要加Padding来填充。
- data【数据】:应用数据
