TCP首部

概述

TCP的全部功能都体现在其首部中的各个字段. 因此, 只有弄清TCP首部各个字段的作用才能理解TCP的工作原理.

TCP首部的前20个字节是固定的,后面有4n字节是根据需要而增加的选项, TCP首部的最小长度为20字节, 最多为60字节.

源端口和目的端口

各占2个字节, 分别写入源端口号和目的端口号. TCP的分用和复用功能是通过端口实现的.

序号

占4个字节.TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号.序号字段值是用来指定本报文段所发送的数据的第一个字节的序号.

确认号

占4字节.是接收方期望收到发送方下一个报文段的第一个数据字节序号.例如:B正确接收了A发送过来的一个报文段,其序号字段为501,数据长度为200字节,表明B正确接收了501~700的序号的数据.因此,B期望收到A的下一个数据序号是701, 于是B在发送给A的确认报文中把确认号置为701.

首部长度

占4位, 该字段是以32位Bit为单位, 它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远.这个字段实际上是指出TCP首部的长度. 所以TCP的首部长度为最多60字节.

保留

占4位, 保留为今后使用, 目前应置为0

8个标志位

  • 拥塞创窗口减CWR: 告知发送方, 降低发送速率.

  • CEC: 发送方接收到了一个更早的拥塞通告.

  • 紧急URG: 当URG = 1时, 表明紧急指针字段有效.它告诉系统,当前报文段有紧急数据,应当尽快传送.

  • 确认ACK: 仅当ACK = 1时确认号字段才有效.当ACK = 0时,确认号无效. TCP规定,在连接建立后所有传送的报文段都必须把ACK置为1.

  • 推送PSH: 当发送方将PSH置为1,并立即创建一个报文段发送出去.接收方TCP收到PSH = 1的报文段时,就尽快地交付接收应用程序,而不再等到整个缓存填满了再向上交付.

  • 复位(RST): 当RST = 1 时, 表明TCP连接出现严重错误,必须释放连接,然后再重新建立连接.

  • 同步SYN: 在连接建立时用来同步序号. 当SYN = 1 时而ACK = 0 时表示这是一个连接请求报文段.若对方同意连接后, 则应在响应报文中使SYN = 1和ACK = 1.实际上SYN = 1 时表示这是一个连接请求或接受报文.

  • 终止FIN: 用来释放一个连接. 当FIN = 1 时, 表明此报文段的发送数据已发送完毕,并要求释放连接.

窗口

占2字节.窗口指的是发送报文段一方的接收窗口.窗口值告诉对方:接收方目前允许对方发送的数据量. 由于窗口占2个字节, 所以窗口最大为: 65535. 但这不是绝对的, 因为在TCP的选项字段中, 含有一个窗口缩放字段, 可以用来扩大窗口的值.

检验和

检验和字段检验的范围包括首部和数据这两部分.

紧急指针

占2字节. 当URG = 1 时才有意义, 它指出本报文段中的紧急数据字节数.

TCP选项

TCP的每一个选项字段的头字节为种类(kind), 它指明了选项的类型. 除了无操作选项表结束没有长度字段外, 其他的选项都有一个len字段来说明该选项的长度.

  • 选项列表结束(EOL): 指出了选项列表的结尾, 说明无需对此选项列表再进行处理.

  • 无操作(NOP): 填充字段. 因为TCP的首部单位是4个字节. 所以当选项字段不是4字节的倍数时, 可以用NOP来进行字段的填充.

  • 最大报文段长度(MSS): 告知通信方, 自己接受的最大报文的长度(不包括TCP和IP的首部). 默认情况下, 最大段大小为: 536. 因为任务主机能够处理至少为576字节的IPV4报文段. 由于536是不包括TCP首部和IP首部的, 所以当加上TCP20字节和IP首部20字节的话, 刚好是576.

  • 窗口缩放(WSCALE或WSOPT): 能够将窗口字段从14位扩大到30位. 该选项字段只能出现于一个SYN报文段中. 主动打开连接的一方可以在SYN指定这个字段, 被动打开的一方可以在ACK SYN报文中指定该选项. 假设现在正在使用该字段. 发送出去的WSCALEs的话, 并且接收到对方的WSCALEr. 这样, 当接收到通信方的窗口时, 我们需要将该窗口值左移r为得到真正的窗口大小. 当我们要告知对方窗口值的大小时, 会将实际的大小右移s位, 然后再发送出去.

  • 时间戳选项(TSOPT): 该字段指用于记录每收到一个ACK的往返时间(RTT). 该选项必须在双方建立连接时协商好, 并且需要双方都开启才有效.

参考资料

  • 计算机网络(谢希仁)

  • 计算机网络-自顶向下方法

  • TCP/IP详解

分享到