TCP详解之TCP头部结构

TCP头部结构

  TCP头部信息出现在每个TCP报文段,用于指定通信的源端端口,目的端口,管理TCP连接等。

TCP固定头部结构

在这里插入图片描述
  16位端口号:告知主机该报文段是来自哪里(源端端口)以及传给哪个上层协议或应用程序(目的端口)的。进行TCP通信时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名服务端口号(所有知名端口号定义在/etc/services文件中)。
  32位序号SEQ(sequence number):一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。假设主机A和主机B进行TCP通信,A发送给B的第一个TCP报文段中,序号值被系统初始化为某个随机值ISN(Initial Sequence Number,初始序号值)。那么在该传输方向上(A->B),后续的TCP报文段序号值被系统设置为ISN加上该报文段所携带数据的第一个字节在整个字节流中的偏移。例如,某个TCP报文段传送的数据是字节流中的1025–2048字节,那么该报文段的序号值就是ISN+1025。另一个方向的TCP报文段的序号值也具有相同的含义。
  32位确认号ACK(acknowledgement number):用作对另一方发送来的TCP报文段的响应。其值是收到的TCP报文段的序号值加一。假设主机A和主机B进行TCP通信,那么A发送出的TCP报文段不仅携带自己的序号,而且包含了对B发送来的TCP报文段的确认号。反之,B主机发送的TCP报文段也同时携带自己的序号和对A发送来的报文段的确认号。
  4位头部长度:标识该TCP头部有多少个32bit字(字节)。因为4位最大表示15,所以TCP头部最长是60字节。
  6位保留:保留
  6位标志位:
在这里插入图片描述
  16位窗口大小:是TCP流量控制的一个手段。这里说的窗口,指的是接收通告窗口(Receiver Window,RWND)。它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。
  16位校验和:由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意:此处的校验不仅包括TCP头部,也包括数据部分。不同于IP数据报只校验IP头部。
  16位紧急指针:是个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一个字节的序号。确切地说,这个字段是紧急指针相对于当前序号的偏移。TCP的紧急指针是发送端向接收端发送紧急数据的方法。

TCP头部选项

  TCP头部的最后一个选项字段是可变长的可选信息。这部分最多包含40字节,因为TCP头部最长是60字节。
TCP头部选项的一般结构如图:
在这里插入图片描述
  第一个字段kind说明选项的类型。有的TCP选项没有后面两个字段,仅包含一字节的kind字段。
  第二个字段length(若有的话)指定该选项的总长度,该长度包括kind字段和length字段占据的两个字节和info字段。
  第三个字段info(若有的话)是选项的具体信息。
常见的TCP选项有7种:
在这里插入图片描述
  kind=0是选项表结束选项。
  kind=1是空操作选项,没有特殊含义,一般用于将TCP选项的总长度填充为4字节的整数倍。
  kind=2是最大报文段长度选项。TCP连接初始化时,通信双方使用该选项来协商最大报文段长度(Max Segment Size,MSS)。TCP模块通常将MSS设置为(MTU-40)字节(减掉的这40字节包括20字节的TCP头部和20字节的IP头部)。这样携带TCP报文段的IP数据报长度就不会超过MTU(一般情况下TCP和IP头部不包含选项字段),从而在一般情况下避免本机发生IP分片。对于以太网来说,MSS值是1500-40=1460字节。
  kind=3是窗口扩大因子选项。TCP连接初始化时,通信双方使用该选项来协商接收通告窗口的扩大因子。在TCP头部中,接收通告窗口大小是用16位表示的,故最大为65535字节,但实际上TCP模块允许的接收通告窗口大小远不止这个数(为了提高TCP通信的吞吐量)。窗口扩大因子解决了这个问题。假设TCP头部中的接收通告窗口大小是N,窗口扩大因子(移位数)是M,那么TCP报文段的实际接收通告窗口大小是N左移M位的大小。M的取值范围是0-14。我们可以通过修改/proc/sys/net/ipv4/tcp_window_scaling内核变量来启用或关闭窗口扩大因子选项。和MSS选项一样,窗口扩大因子选项只能出现在同步报文段中,否则将被忽略。但同步报文段本身不执行窗口扩大操作,即同步报文段头部的接受通告窗口大小就是该TCP报文段的实际接受通告窗口大小。当连接建立好之后,每个数据传输方向的窗口扩大因子就固定不变了。
  kind=4是选择性确认(SACK)选项。TCP通信时,如果某个TCP报文段丢失,则TCP模块会重传最后被确认的TCP报文段后续的所有报文段,这样,原先已经正确传输的TCP报文段也可能重复发送,从而降低了TCP性能。SACK技术正是为改善这种情况而产生的,他使得TCP模块只重新发送丢失的TCP报文段,不用发送所有未被确认的TCP报文段。选择性确认选项用在连接初始化时,表示是否支持SACK技术。可以通过修改/proc/sys/net/ipv4/tcp_sack内核变量来启用或关闭选择性却惹选项。
  kind=5是SACK实际工作的选项。该选项的参数告诉发送方本端已经收到,并且已经缓存的不连续的数据块,从而让发送端可以据此检查并重发丢失的数据块。每个块边沿参数包含一个4字节的序号。其中块左边沿表示不连续块的第一个数据的序号,而块右边沿则表示不连续块的最后一个数据的序号的下一个序号。这样一对参数(块左边沿和块右边沿)之间的数据是没有收到的。因为一个块信息占用8字节,所以TCP头部选项中实际最多可以包含4个这样的不连续数据块(考虑选项类型和长度占用的2字节)。
  kind=8是时间戳选项。该选项提供了较为准确的计算通信双方之间的回路时间(Round Trip Time,RTT)的方法,从而为TCP流量控制提供重要信息。可以通过修改/proc/sys/net/ipv4/tcp_timestamps内核变量来启用或关闭时间戳选项。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值