TCP详解(一)报文详情/MSS/MTU

本文旨在介绍TCP的报文格式详情和传输层、链路层的字节数限制

1 TCP 协议的报文格式

TCP 报文段包括协议首部和数据两部分,协议首部的固定部分是 20 个字节,头部是固定部分,后面是选项部分。

1.1 端口号

16位源端口:发送方主机的应用程序的端口号

16位目的端口:目的主机的应用程序的端口号

1.2 序列号

32位Seq序号。表示本报文段所发送数据的第一个字节的编号

1.3 确认号

32位Ack 序号,接收方期望收到发送方下一个报文段的第一个字节数据的编号,因此确认序号应该是上次已经成功收到数据字节序号加 1,即 Ack = 连续的最后一个Seq序号(收到的连续字节中最后一个字节编号) + 1。

1.4 数据偏移

4位,数据偏移代表数据部分距离报文首部的偏移量,表示TCP所传输的数据部分应该从TCP包的哪个位置开始计算,也可以理解为TCP首部的长度。“数据偏移”的计算单位是 32 位(4 字节)

例如:数据偏移设置为0101 = 5,5 x 4 = 20个字节,代表报文段首部距离数据部分的偏移长度是20字节;最大1111表示15 x 4= 60个字节,即表示TCP首部最大长度为60个字节,由于有20个字节是固定必须有的,因此“选项”部分最多40个字节。

1.5 保留字段

6位,为TCP将来的发展预留空间,目前必须全部为0 

1.6 标志位字段 

6位标志位:共有6个标志位,每个标志位占1个bit,内容含义如下 

  • URG(紧急):为1时表明紧急指针字段有效
  • ACK(确认):为1时表明确认号字段有效
  • PSH(推送):为1时接收方应尽快将这个报文段交给应用层
  • RST(复位):为1时表明TCP连接出现故障必须重建连接
  • SYN(同步):在连接建立时用来同步序号
  • FIN(终止):为1时表明发送端数据发送完毕要求释放连接

1.7 窗口大小

16位窗口大小:表示发送该TCP报文的接受窗口还可以接受多少字节的数据量。即表示当前接收缓冲区的大小

1.8 校验和

16位校验和字段:用于确认传输的数据有无损坏 。发送端基于数据内容校验生成一个数值,接收端根据接受的数据校验生成一个值。两个值相同代表数据有效,反之无效,丢弃该数据包。校验和根据 伪首部 + TCP头 + TCP数据 三部分进行计算

伪首部共有12字节,包含IP首部的一些字段,有如下信息:32位源IP地址、32位目的IP地址、8位保留字节(置0)、8位传输层协议号(TCP是6,UDP是17)、16位报文长度(首部+数据)。

伪首部是为了增加校验和的检错能力:通过伪首部的目的IP地址来检查TCP报文是否收错了、通过伪首部的传输层协议号来检查传输层协议是否选对了。数据包经过中间器件(路由器)的时候,这些中间器件可能会修改IP首部的内容,例如同时修改目的IP和IP首部校验和。这样一来将导致错误的接收方接收到该数据包。因此在TCP的伪首部加上IP地址,可以防止错收报文。

1.9 紧急指针

16位紧急指针字段: 仅当标志位字段的URG标志位为1时才有意义。指出有效载荷中为紧急数据的字节数。当所有紧急数据处理完后,TCP就会告诉应用程序恢复到正常操作。即使接收方窗口大小为0,也可以发送紧急数据,因为紧急数据无须缓存

1.10 选项/填充

长度不定,内容可变,因此必须使用首部长度来区分选项的具体长度。可选项和填充部分的长度为4n字节(n是整数),该部分是根据需要而增加的选项。如果不足4n字节,要加填充位,使得选项长度为32位(4字节)的整数倍,具体的做法是在这个字段中加入额外的零,以确保TCP头是32位(4字节)的整数倍。

典型的选项字段的结构示意图如

选项的第一个kind说明选项的类型。第二个length指定该选项的总长度,该长度包括kind和length所占的两个字节。第三个info是选项的具体信息。

1.10.1 kind=0

选项表结束(EOP)选项,一个报文段仅用一次。放在末尾用于填充,用途是说明:首部已经没有更多的消息,应用数据在下一个32位字开始处

1.10.2 kind=1

空操作(NOP)选项没有特殊含义,一般用于将TCP选项的总长度填充为4字节的整数倍

1.10.3 kind=2

最大段尺寸(Maximum Segment Size,MSS)选项。MSS是每个TCP报文段中的数据部分的最大长度。数据部分加上TCP首部才等于整个TCP报文段。在建立TCP连接的过程中,双方把自己能够支持的MSS填入这一字段,以后就按照这个数值传输数据,提高效率,网络利用率(避免本机发生IP分片)

双方可以有不同的MSS值。若主机未填写这一项,则MSS的默认值为536字节长度。因此,所有互联网上的主机都应能接受报文长度为536+20(TCP固定首部长度) =586字节。MSS的大小受到数据链路层的MTU(最大传输单元)的限制,因为TCP报文最终会封装在IP数据包中进行传输,而IP数据包的大小受到底层网络设备MTU的限制。一般来说,MSS的值会设为MTU减去IP报头和TCP报头的长度,以保证TCP报文在IP层传输不会被分片

1.10.4 kind=3

窗口扩大因子选项,TCP连接初始化时,通信双方使用该选项来协商接收窗口的扩大因子。在TCP的头部中,接收窗口大小是用16位表示的,故最大为65535字节,但实际上TCP模块允许的接收窗口大小远不止这个数(为了提高TCP通信的吞吐量)。窗口扩大因子解决了这个问题。
假设TCP头部中的接收通告窗口大小是N,窗口扩大因子(移位数)是M,那么TCP报文段的实际接收通告窗口大小是N*2M,或者说N左移M位。注意,M的取值范围是0~14。我们可以通过修改 /proc/sys/net/ipv4/tcp_window_scaling 内核变量来启用或关闭窗口扩大因子选项。
和MSS选项一样,窗口扩大因子选项只能出现在同步报文段中,否则将被忽略。但同步报文段本身不执行窗口扩大操作,即同步报文段头部的接收窗口大小就是该TCP报文段的实际接收窗口大小。当连接建立好之后,每个数据传输方向的窗口扩大因子就固定不变了。

1.10.5 kind=4

选择确认(Selective Acknowledgment,SACK)选项。TCP通信时,如果某个TCP报文段丢失,则TCP模块会重传最后被接收方确认的TCP报文段后续的所有报文段,这样原先已经正确传输的TCP报文段也可能重复发送,从而降低TCP性能。SACK选项正式为了改善这种情况而产生的,它使TCP模块只重新发送丢失的TCP报文段,而不用发送所有未被确认的TCP报文段。选择确认字段用于TCP连接建立时,表示是否支持SACK选项。可通过修改Linux系统的/proc/sys/net/ipv4/tcp_sack内核变量来启动或关闭该选项

1.10.6 kind=5

是SACK实际工作的选项。该选项的参数告诉发送端,本端已经接收到不连续的数据块,从而让发送端据此检查并重发丢失的数据。每个块边沿(end of block)参数包含一个4字节的序号。其中左边沿表示不连续块的第一个数据字节的序号,而右边沿表示不连续块的最后一个数据字节的下一个字节序号。左右边沿之间的数据就是没有收到的。因为一个块信息占8字节,所以TCP首部选项中实际最多可以包含4个这样的不连续数据块(4*8+2=34 < 40)

1.10.7 kind=8

时间戳选项,占10字节。时间戳有以下两个功能

  1.  用来计算通信双方之间的回路时间(Round Trip Time,RTT)。发送方在发送TCP报文段时把当前时间放入时间戳字段,接收方在确认该报文段时把时间戳字段值复制到时间戳回显应答字段。因此,发送方在收到确认报文后,可以准确地计算出RTT
  2. 用于处理TCP序号超过2^32(4,294,967,296)的情况,这又称为防止序号绕回PAWS(Protect Against Wrapped Sequence numbers)。我们知道,TCP报文段的序号只有32位,而每增加2^32个序号后就会重新从0开始编号。当使用高速网络时,在一次TCP连接的数据传送中序号很可能会被重复使用。例如,当使用 1.5Mbit/s的速率发送TCP报文段时,序号重复要6小时以上。但若使用2.5Gbit/s的速率发送数据报时,则不到14秒钟序号就会重复。为了使接收方能够把新的报文段和迟到很久的报文段(序号相同的情况下)区分开,可以在报文段中加上时间戳选项。我们可以通过修改Linux系统的 /proc/sys/net/ipv4/tcp_timestamps 内核变量来启用和关闭时间戳选项。

完整的选项:Transmission Control Protocol (TCP) Parameters

并不是所有的TCP实现都支持所有的选项类型。因此,在使用TCP选项字段时需要确保双方都支持相应的选项类型和长度,否则可能会导致通信错误和不兼容问题。

2 MSS/MTU

2.1 MTU

最大传输单元MTU,是指网络能够传输的最大数据包大小,以字节为单位。它是由底层网络技术(如以太网、Wi-Fi等)所决定的,并且通常是在网络设备(如路由器、交换机)上配置的。MTU包括数据链路层的数据部分以及数据链路层头部和尾部的大小。

MTU是数据链路层的概念,指数据链路层对帧的数据部分长度的限制,实际上,不同的厂商,甚至同一厂商的不同产品型号对MTU的定义也不尽相同

早期以太网使用共享链路的工作方式,为了保证CSMA/CD(载波多路复用/冲突检测)机制,规定了以太帧长度最小为64字节,最大为1518字节。

  • 最小64字节是为了保证最极端的冲突能被检测到,64字节是能被检测到的最小值;
  • 最大不超过1518字节是为了防止过长的帧传输时间过长而占用共享链路太长时间导致其他业务阻塞。

以太网最大的数据帧是1518字节,这样刨去帧头14字节和帧尾CRC校验部分4字节,那么剩下承载上层IP报文的地方最大就只有1500字节,这个值就是以太网的默认MTU值。这个MTU就是网络层协议非常关心的地方,因为网络层协议比如IP协议会根据这个值来决定是否把上层传下来的数据进行分片,如果单个IP报文长度大于MTU,则会在发送出接口前被分片,被切割为小于或等于MTU长度的IP包。

2.2 MSS

是TCP协议中的一个概念,UDP协议中不存在MSS一说。

MSS指的是TCP协议中数据段的最大大小,它是在TCP连接建立时协商确定的。MSS是指在TCP数据包中的数据部分的最大允许长度,不包括TCP头部和IP头部的大小。TCP协议中的MSS通常由TCP连接的双方协商确定,取双方中较小的那个值。

通常情况下,MSS的大小会略小于MTU减去IP头部和TCP头部的长度,以保证数据包在传输过程中不会超出MTU的限制

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值