#TCP/IP# TCP头部选项功能详解

简单回顾下TCP报文格式

  • 1)TCP报文:由 TCP首部 和 TCP数据 组成。
  • 2)TCP首部:由 20字节的固定长度 和 可变长字段(选项和填充)组成。
  • 3)TCP首部总长度:由TCP头中的“数据偏移”字段决定。该字段占4bit,取最大的1111时,也就是十进制的15,TCP首部的偏移单位为4byte,那么TCP首部长度最长为15*4=60字节。
  • 4)选项和填充 的长度:= TCP首部总长度 - 20字节的固定长度。由3)的计算可知,TCP首部总长度最大为60字节,那么“选项和填充”字段的长度最大为40字节。填充是为了使TCP首部为4byte的整数倍。
     

可选项字段的格式

每个选项的开始是1字节的kind字段,说明选项的类型。一个TCP包可以包含多个可选项。

详细参考:#TCP/IP# 基于TCP/IP的四层协议的信息报文段格式

TCP头部选项功能

TCP头部的选项部分是TCP为了适应复杂的网络环境和更好的服务应用层而进行设计 的。TCP选项部分最长可以达到40byte ,再加上TCP选项外的固定的20byte字节部分, TCP的最长头部可达60byteo TCP头部长度可以通过TCP头部中的"数据偏移"位来查看。(值得注意的是TCP偏移量的单位是32位,也就是4byteo而TCP偏移量共占4bit位, 取最大的1111计算也就是十进制的15。15*4byte=60byte #这个也是TCP的首部不超 过60byte的原因。)

大多数的TCP选项部分出现在TCP连接建立阶段,也就是TCP的三次握手数据包中。 当然有些选项也会出现在已经建立连接的session中,不过此种情况较少出现。

TCP选项部分占有的位数必须是8bit的倍数,这也就是说,即使出现我们应用的选项 部分为4bit M旦也必须使用4bit的垫片。这样才符合RFC的要求

TCP选项部分实际运用的有以下几种:

  1. 最大报文传输段(Maximum Segment Size —MSS )
  2. 窗口扩大选项(window scaling )
  3. 选择确认选项(Selective Acknowledgements —SACK )
  4. 时间戳选项(timestamps )
  5. NOP

下面是一个实际网络中选项部分使用齐全的一个数据包,如图解码部分:

使用wireshark做出解码的解释:

我们详细看下每个选项的功能,和其主要用法等:

 

最大报文传输段(Maximum Segment Size —MSS )

MSS是TCP选项中最经常出现,也是最早岀现的选项。MSS选项占4byte。MSS是每一个TCP报文段中数据字段的最大长度,注意:只是数据部分的字段,不包括TCP的头 部。TCP在三次握手中,每一方都会通告其期望收到的MSS ( MSS只出现在SYN数据包中)如果一方不接受另一方的MSS值则定位默认值536byte

MSS值太小或太大都是不合适。太小例如MSS值只有lbyte那么为了传输这lbyte 数据,至少要消耗20字节IP头部+20字节TCP头部二40byte ,这还不包括其二层头部所 需要的开销,显然这种数据传输效率是很低的。MSS过大,导致数据包可以封装很大,那 么在IP传输中分片的可能性就会增大,接受方在处理分片包所消耗的资源和处理时间都会 增大,如果分片在传输中还发生了重传,那么其网络开销也会增大。因此合理的MSS是至 关重要的。MSS的合理值应为保证数据包不分片的最大值。对于以太网MSS可以达到 1460byte.

与MSS相似的在IP层也有f 类似的概念…MTU ( Maximum Transfer Unit )下 图可以清晰翻译MSS与MTU的关系:

窗口扩大选项(window scaling )

我们知道TCP最大的窗口大小为64Kb ,在早期网络这是够用的,但随着各种复杂 网络的产生,特别是类似卫星通信这种时延和带宽都也交大的通信而产生,需要更大窗口来满足性能和高吞吐率”于是窗口扩大选项便产生了。

我们用下图一些图来说明为什么需要这个选项,和其主要功能:

我们假设Host A—B是一条高速的WAN链路。通信距离较远,延时也由于距离的原因变大。A向B发送大量数据,由于有足够带宽,那么A在很短时间内就可以发送完64Kb 的数据,而由于窗口过小,A只能停止发送,直到B对A发送的数据进行ACK确认。上面我们可以推算,在time 2-3和后面的time 5-6之间A-B是没有实际数据发送的。而大量的时间被浪费在了等待对方回应上。

如果我们改进我们的窗口大小,使之变的更大,如下图:

现在我们把窗口扩大到256kb ,我们看到,由于窗口足够大,A可以发送大量的数据 报,在其还在忙着发送报文的时间内,对A数据的ACK就已经可以返回了。(黄色的部分可以想象成一个个数据包,大量的数据包排长队在网络中传输L这样,A-B的通信就避免 了消耗大量的等待时间。对TCP的性能改善是巨大的。

Windows scaling占3个byte ,其中的f 字节表示移位值So新的窗口值等于TCP 首部的窗口位数从16增大到(16+S L这相当于把窗口值向左移动S位后获得实际的窗口 大小。移位值准许使用的最大值是14相当于窗口最大值增大到65535*2^14也就是1GB。

窗口扩大选项在TCP建立之初进行协商,如果已经实现了窗口扩大,当不再需要其扩大窗口时,发送S=0选项就可以恢复到窗口大小16。

选择确认选项(Selective Acknowledgements —SACK )

我们假设TCP传输中有这种情况岀现:收到的报文无差错,只是未按序列号,中间还缺 少一些序列号,那么能能否只传输缺少的数据,而不重传已经正确到达的数据?这就是选择确认的技术。用下列例子来说明一下:

要传输的数据共5个,分别编号为1,234,5。A-B Host。B作为接受者,发现数据接 收是这样的1 3 5。而中间的2和4没有到达其他都是正确的数据报。那么如果选用SACK , A将只会重传2和4,而不是所有的报文都重传。

SACK选项在TCP建立连接时由SYN数据包中加上〃允许SACK"的置为1来实现。SACK 对原来TCP首部的确认号字段不会产生影响,只是在发生不连续传输中才会使用。

我们知道TCP的数据报文是有字块边界的”例如上面例子,怎么形容丢失的数据包2 呢,我们会以之间的数据包说明,也就是说丢失的数据是有左右边界的。而此边界在 传输中是用TCP序列号来表示的。由于TCP首部选项部分最多只有40字节,而指明一个 边界要用掉4字节(因为TCP序列号是32位,也就是4字节),因此在选项中最多只能指 明4个字节块的边界信息。这是因为4个字块要有8个边界(前后边界\另外还需要2 个功能字节,一个字节用来指明使用SACK选项,另一字节指明这个选项要占多少字节。4* ( 4*2 ) +2=34byte。所以最多只能指出4个字节块边界信息。

这里写图片描述

一般来说,计算机都是默认支持选择确认的。上面这张图是刚才通过wireshark工具抓取到的接收方给发送方发送的一个tcp确认包,在这个tcp选择确认(SACK)包中,在图1的tcp选项的SACK选项是选择确认(SACK)能保障可靠传输最为重要的依据。所以,这里我们重点关注tcp选项部分,在tcp首部中可以看到确认号为:2336611189,首部长度是32字节,Window size valaue字段是接收方的接收窗口,同于通知发送方将发送窗口大小设置为65520字节。

从该tcp数据包的tcp选项来看这是一个选择确认(SACK)包,也就是说这个确认包只有tcp首部,没有数据部分,Kind:SACK(5)用来表示这是选择确认(SACK),该字段占用一个字节。Length表示tcp选项长度,占用一个字节,左边界和右边界各占用4字节,也就是说这里总共用掉了10字节。其中left edge表示接收方接收到的数据块中的左边界位置(起始字节),而right edge可以理解为接收方接收到的数据块中的结束位置(右边界),为了方便学习,我们暂时这么理解吧。也就是说,通过左边界和右边界我们可以指明一个数据块的位置。

  那么我们可以根据捕获的数据报中的确认号丢失的数据块中的起始字节,也就是要重传的起始字节,再结合接收窗口,左边界和右边界。我们可以推出接收窗口中的已经接收到的数据块,和未接收到的数据块,如下图所示:

 

  从上图中我们可以清晰的看到滑动窗口中的数据分布如上图所示,其中未接收到的字节数据块表示需要重传的数据,那么发送方在进行选择性重传时,会从2336611189字节的位置开始重传。注意:对于已经接收到的字节数据块(2336631881 - 2336693150)是不会被重传的。

另外,在前面学习tcp数据报格式的时候说过,tcp首部中的选项部分最大是40字节,左边界和右边界在指明一个数据块时就用掉了8字节,那么指明4个数据块就用掉了32字节,再加上Kind:SACK(5)和Length两个字段占用的2字节,最终只剩下了6字节,换句话说,tcp选项的选择确认选项最多也就只能指明4个数据块

这里写图片描述

如上图所示,现有10个分组数据,第1个分组为1-100,第2个分组为101-200,其他以此类推… 假设发送方发送了这10个分组,然后接收方接收到数据后给发送方发送了一个选择确认(SACK)数据报,其中tcp首部中给出确认号为201,同时tcp选项中携带了8个左右边界

  发送方接收到选择确认数据包后,会根据数据包中的tcp首部中的确认号201,从201字节位置开始重传,再根据tcp首部的tcp选项中的选择确认(SACK)选项指明的已经收到的数据块的8个边界,进行选择性重传(201-300),(401-500),(601-700),(801-900)分组(对于已经收到的数据块(301-400),(501-600),(701-800),(901-1000)是不会重传的,因为选择确认(SACK)选项中给出的边界是指明已经接收到的数据块和未接收到的数据块。换句话说,边界就是接收方用来告诉发送方:“哪些数据已经收到,哪些数据没收到”。然后发送方再选择对未收到的数据进行重传)。
 

时间戳选项(timestamps )

时间戳选项占10个字节,其中最主要的字段时间戳字段(4字节)和时间戳回送回答字段(4字节)

时间戳选项主要的功能有两个:

  • 1    .用来计算往返时间RTT(Round-Trip Time往返时延)。发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文段时把时间戳字段值复制到时间戳回送回答字段。因此,发送方在 收到确认报文后,可以准确计算出RTT。时间戳是一个单调增长的值,接收方只需要回 显收到的内容,因此是不需要关注时间戳的单元是什么,也不需要连接双发的时钟同步。
  • 2    . PAWS:防止回绕的序号。我们知道序列号只有32位,而每增加2^32个序列号后就会重复使用原来用过的序列号。假设我们有F高速网络,通信的主机双方有足够大的带 宽用来快速的传输数据。例如lGb/s的速率发送报文段,则不到35秒钟数据字节的序 列号就会重复。这样对TCP传输带来混乱的情况。这种情况之出现在高速链路上。而采 用时间戳选项”可以很容易的分辨出相同序列号的数据报,哪个是最近发送,哪个是以前发送的。

NOP

NOP ( no operation ),从字面意思也看出来了,这个字段实际上是没有但可意义的字 段。设计该字段主要是用来提供填充垫片。TCP的头部必须是4byte的倍数,但是大多数 的TCP选项不是4byte的倍数。假如出现了整个TCP选项部分不是4byte的倍数,那么就 需要使用1或多个字节无意义的nop来填充,使之符合TCP的头部构造的规定。例如,选 项部分只有6byte , 2个字节的nop就会用来做垫片。

NOP也会做为分割不同的选项数据,例如我们的TCP会话中同时使用了窗口扩大选项和 SACK那么TCP头部中的SACK的表示部分与窗口扩大选项中的参数之间使用nop隔离。 明确不同的选项之间的分割点,因此在一个数据包中出现多个nop是不奇怪的。

 

总结

TCP协议是一个设计可靠的,优越的协议,通过TCP的选项部分也可以看到其设计之 精妙。TCP的选项部分做为TCP头部的补充满足了对复杂网络和苛刻传输条件的要求。TCP 选项在给网络带来性能提升和高可靠的同时”也会被黑客所利用。

例如,每个操作系统都有自己独特的处理TCP选项部分的特点和排序规则。利用这种 系统的特殊性结合其他手段可以很容易的识别出是明哪种操作系统对了解和分析主机漏洞提 供了更多的参数。

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值