一个TCP报文段分为首部和数据两部分,而TCP的全部功能都体现在它首部中各字段的作用。
因此,只有弄清TCP首部各字段的作用才能掌握TCP的工作原理。下面就讨论TCP报文段的首部格式。
TCP首部最小长度是20字节。前20个字节固定的,后面4n字节根据需要增加。
- 源端口号和目的端口号:各占2个字节,跟UDP类似。(因为端口号本身就是16位,需要2个字节表示)
- 序号:4个字节
- 确认号:4个字节
- 数据偏移:4个位
- 保留:占6位,保留为今后使用。
序号
序号范围是,共
(即4 294 967 296)个序号。序号增加到
后,下一个序号就又回到0。也就是说,序号使用mod
运算。TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。
首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。
例如,一报文段的序号字段值是301,而携带的数据共有100字节。这就表明:本报文段的数据的第一个字节的序号是301,最后一个字节的序号是400。显然,下一个报文段(如果还有的话)的数据序号应当从401开始,即下一个报文段的序号字段值应为401。这个字段的名称也叫做“报文段序号”。
确认号
确认号 占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。例如,B正确收到了A发送过来的一个报文段,其序号字段值是501,而数据长度是200字节(序号501~700),这表明B正确收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。请注意,现在的确认号不是501,也不是700,而是701。
数据偏移
它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。
这个字段实际上是指出TCP报文段的首部长度。
由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的。
但应注意,“数据偏移”的单位是32位字(即以4字节长的字为计算单位)。由于4位二进制数能够表示的最大十进制数字是15,因此数据偏移的最大值是60字节,这也是TCP首部的最大长度(即选项长度不能超过40字节)。
保留
确定ACK(ACKnowlegment):仅当ACK = 1时确认号字段才有效。当ACK = 0,确认号无效。
同步SYN:在连接建立时用来同步序号。
当SYN = 1而ACK = 0时,表明这是一个连接请求报文段。
对方若同意建立连接,则应在响应的报文段中使SYN = 1和ACK = 1。
因此,SYN置为1就表示这是一个连接请求或连接接受报文。
终止FIN:用来释放一个连接。
当FIN = 1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
窗口:占2个字节。
窗口:指的是接收窗口。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量。
例如,设确认号是701,窗口字段是1000。这就表明,从701号算起,发送此报文段的一方还有接收1000个字节数据(字节序号是701~1 700)的接收缓存空间。
校验和:占2个字节。检验首部和数据两部分。
最大报文段长度
MSS(Maximum Segment Size)。是每一个TCP报文段中的数据字段的最大长度(注意:只是数据字段)。