概述
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
首部的, 所以当加上TCP
20字节和IP
首部20字节的话, 刚好是576.窗口缩放(WSCALE或WSOPT): 能够将窗口字段从14位扩大到30位. 该选项字段只能出现于一个
SYN
报文段中. 主动打开连接的一方可以在SYN
指定这个字段, 被动打开的一方可以在ACK SYN
报文中指定该选项. 假设现在正在使用该字段. 发送出去的WSCALE
为s
的话, 并且接收到对方的WSCALE
为r
. 这样, 当接收到通信方的窗口时, 我们需要将该窗口值左移r
为得到真正的窗口大小. 当我们要告知对方窗口值的大小时, 会将实际的大小右移s
位, 然后再发送出去.时间戳选项(TSOPT): 该字段指用于记录每收到一个
ACK
的往返时间(RTT). 该选项必须在双方建立连接时协商好, 并且需要双方都开启才有效.
参考资料
计算机网络(谢希仁)
计算机网络-自顶向下方法
TCP/IP详解