TCP简介

TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP保证数据传输的可靠性,确保数据不丢失、不重复、按序到达。

TCP主要有以下特点:

  • 面向连接: 在进行数据传输之前,需要先建立连接,确保双方可以可靠地进行通信。
  • 可靠性: 采用多种机制来保证数据传输的可靠性,包括:
    • 序列号: 为每个字节分配一个序列号,用于保证数据的按序接收和避免重复。
    • 确认应答:接收方会向发送方发送确认应答,告知发送方哪些数据已成功接收,未收到确认的数据将会被重传。
    • 超时重传: 如果发送方在一定时间内未收到确认,则会重新发送数据。
    • 校验和: 用于检测数据在传输过程中是否发生错误。
  • 面向字节流: TCP将数据看作是无结构,无边界的字节流,可以灵活地处理不同大小的数据块,并根据网络状况进行分段和重组。
  • 全双工通信: 允许数据在两个方向上同时进行传输。
  • 点对点通信:每一条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 |       |C|E|U|A|P|R|S|F|                               |
   | Offset| Rsrvd |W|C|R|C|S|S|Y|I|            Window             |
   |       |       |R|E|G|K|H|T|N|N|                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Checksum            |         Urgent Pointer        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           [Options]                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               :
   :                             Data                              :
   :                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

          Note that one tick mark represents one bit position.

各字段含义:

  • 源端口(Source Port):16bit,发送端的tcp端口号
  • 目的端口(Destination Port):16bit,接收端的端口号
  • 序号(Sequence Number):32bit,如果SYN设置,序号为初始序号(ISN),在建立连接时由客户端/服务端随机生成,建立连接后,序号从ISN+1开始,每发送一个报文段,序列号都会累加该报文段所携带的数据字节数。
  • 确认号(Acknowledgment Number):32bit,代表接收方期望收到的下一个字节的序列号。ACK = 接收到的最小序号 + 1
  • 数据偏移(Data Offset),4bit:
    • 一个完整的TCP报文头长度可以在20到60字节之间变化,数据偏移字段用于让接收方知道TCP报文头的实际长度
    • 数据偏移的值以32bit为单位,TCP报文头长度(字节) = 数据偏移字段的值 × 4,
    • 数据偏移字段的值的范围是5到15。
  • 保留(Reserved):4bit,必须设置为0。
  • 控制位,8bit:
    • CWR:Congestion Window Reduced,拥塞窗口已减少,表示发送方已经接收到ECN-Echo标志位的ACK,并且已经减少了拥塞窗口大小。
    • ECE:ECN-Echo,ECN回显,表示接收方支持ECN(Explicit Congestion Notification),并且在接收到拥塞通知时设置该标志位。
    • URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针;
    • ACK:确认号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段;
    • PSH:为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队;
    • RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求;
    • SYN:同步序号,TCP连接的建立和断开都需要使用SYN标志位;
    • FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送;
  • 窗口(Window):2bit,滑动窗口大小,用来告知发送端接收端的缓冲区大小。
  • 校验和(Checksum):2bit,校验和包含了伪首部、TCP首部和数据,校验和是TCP强制要求的,由发送方计算,接收方验证。
  • 紧急指针(Urgent Pointer):2bit,URG标志为1时,紧急指针有效,表示数据需要优先处理。紧急指针指出在TCP段中的紧急数据的最后一个字节的序号,使接收方可以知道紧急数据共有多长。
  • 选项(Options):
    • 最小0bit,最大40bit;
    • 常见的选项包括最大报文段长度(MSS)、时间戳、窗口扩大因子、选择确认(SACK)等
    • 通过MSS向对方通知本机可以接收的最大TCP段长度。MSS选项只在建立连接的请求中发送。
    • 不足32bit,需要补齐0,TCP头部必须32字节对齐。

参考资料