TCP报文格式

  • TCP报文的首部和IP数据报的首部格式非常相似。
    TCP报文格式

  • 首部:20个字节的固定首部, 最大40字节的可变部分。首部最长是60个字节 (和IP数据报完全一样)

  • 源端口和目的端口: 16位,2个字节,因为一个端口号是16位。(端口是运输层与应用层的服务接口,运输层的复用和分用功能都要通过端口才能实现)

  • 序号字段:占4字节。TCP连接中传送的数据流是截段传输的。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号

  • 确认号:同样占4个字节,指期望下一个收到对方发送的报文段的数据的第一个字节的序号(序号和确认号非常重要,可靠传输靠的就是确认和重传,重传后面会讲)

    • 例如主机A已经收到了主机B的包含字节0-500字节的报文段,这时候主机A还需要501-1000字节的报文段,由于某种原因主机A迟迟没有收到这个序号为501的报文段,因此,A发往B的下一个报文段TCP首部中的确认号就是501。
    • 另外,如果A虽然没有收到以501为序号的报文,但收到了600-1000的报文段,但A发送B的下一个报文段TCP首部中的确认号并不会是1001,仍然是501,因为501-599还没收到。并且所收到的600-1000字节的报文段属于失序到达,这与这种失序的报文段的处理方法有两种,一种是直接丢弃,第二种是保留失序报文段并等待缺少的字节。
  • 数据偏移(首部长度): 占4位,指首部长度(单位是4字节)因此最大是60字节。

  • 保留字段: 占6位,保留为以后使用,目前全部置为0.

  • 六个小字母字段:每个占1位。

    1. 紧急URG: 当URG=1时,表明这个报文中有紧急数据,优先级高(在发送方缓存中,可以插队,放在报文的前面)。
    2. 确认ACK: 只有当ACK = 1 是确认号字段才有效。当ACK = 0 时,确认号无效。因为有时候不需要确认号,比如第一个包,最后一个包。
    3. 推送PSH(push):- - 接收TCP收到PSH = 1 的报文段,就尽快将它交付给应用进程,而不再等整个缓存都填满了再向上交付。(接收方插队)
    4. 复位PST: (ReSet) 当RST = 1 ,表明TCP连接中出现严重差错,(如主机崩溃或其他原因),必须释放连接,再重新建立连接。
    5. 同步SYN: SYN - - 当SYN =1 时表示在请求建立一个TCP连接。
    6. 终止FIN: (Finish) - -用来释放一个连接。FIN = 1 表明此报文段的发送端的数据已发送完毕,并要求释放TCP连接。
  • 窗口: 占2个字节 用来让对方设置发送窗口的依据,单位为字节。

    • 接收方的TCP缓存空间是有限的,因此接收方会随着自己缓存剩余空间的大小动态的告诉发送方自己还能接受最大多少字节的内存。
    • 比如A向B发送数据,B收到了0-500字节报文段,这时B的缓存空间还剩下100字节。 因此B向A回发一个报文段,告诉A自己最大还能再接受你的100字节的报文段。因此A收到信息后就会考虑到B的缓存空间问题,就不会一次性发太多让B装不下。
  • 检验和: 占2字节。检验和字段检验的范围包括首部和数据这两部分(整个TCP报文)。在计算检验和的时候,要在首部前面加上伪首部。

  • 紧急指针字段: 占16位,指出本报文段中紧急数据共有多少个字节(配合URG使用,另外紧急数据放在本报文段的最前面)。

  • 选项字段: 长度可变, 比如最大报文段 等

  • 填充字段: 这是为了使整个首部长度是4个字节的倍数。IP数据报的首部也同样有这个字段,也要4字节对齐 (为什么要4字节对齐呢?)