1. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    2. | Source Port | Destination Port |
    3. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    4. | Sequence Number |
    5. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    6. | Acknowledgment Number |
    7. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    8. | Data | |U|A|P|R|S|F| |
    9. | Offset| Reserved |R|C|S|S|Y|I| Window |
    10. | | |G|K|H|T|N|N| |
    11. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    12. | Checksum | Urgent Pointer |
    13. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    14. | Options | Padding |
    15. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    16. | data |
    17. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    以上是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【控制位】:
      1. URG:表示报文段中存在被发送端的上层应用置为“紧急”的数据。
      2. ACK:表示确认号是有效的。
      3. PSH:表示接收方应立即将数据交给上层。
      4. RST:重置连接
      5. SYN:同步序列号
      6. FIN:没有更多的数据了
    • Window【窗口】【16bits】:用于流量控制。用于表示该报文的发送方愿意接收的字节数量。
    • Checksum【校验和】【16bits】:用于校验传输途中,数据是否丢失或损坏。
    • Options【选项】:附加选项,因为选项的长度不一定是8bits的整数倍,所以要加Padding来填充。
    • data【数据】:应用数据