TCP头部结构
TCP头部信息出现再每个TCP报文段中,用于指定通信的 源端端口,目的端口,管理TCP连接等。
1、TCP固定头部结构
16位端口号:告知主机该报文段是来自哪里(源端口)以及传给哪个上层协议或应用程序(目的端口)的。请注意:进行TCP通信时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名服务端口号。
32位序号(seq):一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。
前面一张图是相对值,后面是真正的序号,图中的7是1+6("hello"6个字节)就是所说的字节流的每个字节的编号
32位确认号(ack):用作对另一方发送来的TCP报文段的响应。其值是收到的TCP报文段的序号值加1。
4位头部长度:标识该TCP头部有多少个32bit字(4字节)。因为4位最大能表示15,所以TCP头部最长是60字节。
6位标志位:1)URG:表示紧急指针是否有效 2)ACK:表示确认号是否有效 3)PSH:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间(如果应用程序不将接收到的数据读走,它们就会一直停留在TCP接收缓冲区中) 4)RST:表示要求对方重新建立连接,我们称携带RST标志的TCP报文段为复位报文段 5)SYN:表示请求建立一个连接。我们称携带SYN标志的TCP报文段为同步报文段 6)FIN:表示:通知对方本端要关闭连接了,我们称携带FIN的TCP报文段为结束报文段
16位窗口大小:是TCP流量控制的一个手段,该处的窗口指的是接收通告窗口。它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度
16位校验和:由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意:这个校验不仅包括TCP头部,也包括数据部分,这也是TCP可靠传输的一个重要保障
16位紧急指针:是一个正的偏移量。TCP的紧急指针是发送端向接收端发送紧急数据的方法
2、TCP头部选项:TCP头部的最后一个选项字段是可变长的可选信息。这部分最多包含40字节,因为TCP头部最长是60字节(其中还包含前面讨论的20字节的固定部分),下图是TCP头部选项结构
选项的第一个字段kind说明选项的类型。有的TCP选项没有后面的两个字段,仅包含1个字节的kind字段。第二个字段length(如果有的话)指定该选项的总长度,该长度包括kind字段和length字段占据的2字节。第三个字段info(如果有的话)是选项的具体信息。常见的TCP选项有7种,如下:
kind = 0 是选项表结束选项。
kind = 1 是空操作(nop)选项,没有特殊含义,一般用于将TCP选项的总长度填充为4字节的整数倍
kind = 2 是最大报文段长度选项
kind = 3 是窗口扩大因子选项,该选项只能出现在同步报文段中,否则将被忽略
kind = 4 是选择确认选项,该选项用在连接初始化时,表示是否支持SACK技术,因为TCP通信时,如果某个TCP报文段丢失,则TCP模块会重传最后被确认的TCP报文段后续的所有报文段,这样原先已经正确传输的YCP报文段也可能重复发送,从而降低了TCP性能,所以利用SACK技术,使TCP模块只重新发送丢失的TCP报文段,不用发送所有未被确认的TCP报文段
kind = 5 是SACK实际工作的选项,该选项的参数告诉发送方本端已经接收到并缓存的不连续的数据块,从而让发送端可以据此检查并重复丢失的数据块
kind = 8 是时间戳选项,该选项提供了较为准确的计算通信双方之间的回路时间的方法,从而为TCP流量控制提供重要的信息。