TCP/IP卷一:66---TCP连接管理之(TCP选项(最大段大小/选择确认/窗口缩放/时间戳/用户超时/认证选项))
发布日期:2021-06-29 22:33:14 浏览次数:2 分类:技术文章

本文共 3396 字,大约阅读时间需要 11 分钟。

一、TCP选项

  • 种类:每一个选项的头一节点为“种类”,指明了该选项的类型
  • 长度:种类值为0或1的选项仅占一个字节。其他的选项会根据种类来确定自身的字节数。选项的总长度为种类与此长度的和
  • 需要记住的是TCP头部的长度应该是32比特的倍数,因为TCP头部长度字段是以此为单位的
  • EOL指出了选项列表的结尾,说明无需对此选项列表再进行处理

二、最大段大小选项(MSS选项)

  • 概念:最大段大小是指TCP协议所允许的从对方接收到的最大报文段,因此这也是通信对方在发送数据时能够使用的最大报文

详细介绍

  • 根据[RFCO879],最大段大小只记录TCP数据的字节数而不包括其他相关的TCP与IP头部
  • 当建立一条TCP连接时,通信的每一方都要在SYN报文段的MSS选项中说明自已允许的最大段大小
  • 这16位的选项能够说明最大段大小的数值
  • 在没有事先指明的情况下,最大段大小的默认数值为536字节。前文曾介绍过,任何主机都应该能够处理至少576字节的IPv4数据报。如果接照最小的IPv4与TCP头部计算,TCP协议要求在每次发送时的最大段大小为536字节,这样就正好能够组成一个576(20(ip数据报头部)+20(TCP头部)+536=576)字节的IPv4数据报

最大段大小推荐设置值

  • IPv4中:
    • 最大段大小的数值建议为1460。这是IPv4协议中的典型值,因此IPv4数据报的大小也相应增加40个字节(总共1500字节,以太网中最大传输单元与互联网路径最大传输单元的典型数值):20字节的TCP头部加20字节的IP头部
  • IPv6中:
    • 当使用IPv6协议时,最大段大小通常为1440字节。由于IPv6的头部比IPv4多20个字节,因此最大段大小的数值相应减少20字节
  • 在[RFC2675]中65535是一个特殊数值,与IPv6超长数据报一起用来指定一个表示无限大的有效最大段大小值。在这种情况下,发送方的最大段大小等于路径MTU的数值减去60字节(40字节用于IPv6头部,20字节用于TCP头部)

三、选择确认选项(SACK选项)

数据空洞

  • 在前面的文章介绍了滑动窗口的概念,并描述了TCP协议是如何管理序列号与确认的。由于采用累积ACK确认,TCP不能正确地确认之前已经接收的数据
  • 由于接收的数据是无序的,所以接收到数据的序列号也是不连续的。在这种情况下,TCP接收方的数据队列中会出现空洞的情况。因此在提供字节流传输服务时,TCP接收方需要防止应用程序使用超出空洞的数据

选择确认(SACK)选项

  • 如果TCP发送方能够了解接收方当前的空洞(以及在序列空间中超出空洞的乱序数据块),它就能在报文段丢失或被接收方遗漏时更好地进行重传工作
  • 根据[RFC2018]与[RFC2883],TCP “选择确认”(SACK)选项提供了上述功能。如果TCP接收方能够提供选择确认信息,并且发送方能够合理有效地利用这些信息,那么上述方案将会十分高效
  • 通过接收SYN(或者SYN+ACK)报文段中的“允许选择确认”选项,TCP通信方会了解到自身具有了发布SACK信息的能力。当接收到乱序的数据时,它就能提供一个SACK选项来描述这些乱序的数据,从而帮助对方有效地进行重传

在报文中的封装与一些概念

  • SACK信息保存于SACK选项中,包含了接收方已经成功接收的数据块的序列号范围。每一个范围被称作一个SACK块,由一对32位的序列号表示
  • 因此,一个SACK选项包含了n个SACK块,长度为(8n+2) 个字节。增加的2个字节用于保存SACK选项的种类与长度
  • 由于TCP头部选项的空间是有限的,因此一个报文段中发送的最大SACK块数目为3(假设使用了时间戳选项。见下面的时间戳选项介绍,这是现代TCP实现中的典型情况)
  • 虽然只有SYN报文段才能包含“允许选择确认”选项,但是只要发送方已经发送了该选项,SACK块就能够通过任何报文段发送出去
  • 由于选择确认的操作相对于TCP的错误和拥塞控制的操作而言更简单,更多的内容将在“TCP超时与重传”与“TCP拥塞控制”中再介绍相关的细节

四、窗口缩放选项(WSCALE或WSOPT选项)

  • 待续

五、时间戳选项(TSOPT或TSopt选项)与防回绕序列号

什么是时间戳选项?

  • 时间戳选项(记作TSOPT或TSopt)要求发送方在每一个报文段中添加2个4字节的时间戳数值。接收方将会在确认中反映这些数值,允许发送方针对每一个接收到的ACK估算TCP连接的往返时间(由于TCP协议经常利用一个ACK来确认多个报文段,此处必须指出是“每个接收到的ACK”而不是“每个报文段”。将在后面“TCP数据流与窗口管理”中详细地讨论这一问题)

使用时间戳选项后,TCP头部的变化

  • 当使用时间戳选项时:
    • 发送方将一个32位的数值填充到时间戳数值字段(称作TSV或TSval)作为时间戳选项的第一个部分
    • 接收方则将收到的时间戳数值原封不动地填充至第二部分的时间戳回显重试字段(称作TSER或TSecr)
  • 由于包含了时间戳选项,TCP头部的长度将会增长10字节(8字节用于保存2个时间戳数值,而另2个数值则用于指明选项的数值与长度)
  • 时间戳是一个单调增加的数值。由于接收者只会对它接收到的信息做出响应,所以它并不关心时间戳单元或数值到底是什么。该选项并不要求在两台主机之间进行任何形式的时钟同步。 [RFC1323]推荐发送者每秒钟至少将时间戳数值加1

演示案例

  • 下图显示了通过Wireshark软件获得的时间戳选项

  • 此例子中,通信双方都产生并回应了对方的时间戳。第一个报文段(客户端的SYN)使用了一个初始的时间戳数值81813090。该数值被填充在时间戳数值字段中。由于客户端并不知道服务器的时间戳数值,所以该报文段的第二部分时间戳回显重试字段的数值为0

时间戳选项应用之超时重传

  • 估算一条TCP连接的往返时间主要是为了设置重传超时。重传超时用于告知TCP通信方何时应该重新发送可能已经丢失的报文段。在后面超时重传的文章中我们会讨论在一些往返时间函数的基础上设置此项超时的必要性
  • 借助时间戳选项,我们能够获待往返时间相对精确的测量结果。在使用时间戳选项之前,大多TCP通信会针对每个窗口的数据抽取一个往返时间样本。时间戳选项使我们获得了更多的样本,从而提升了精确估算往返时间的能力

时间戳选项应用之防回绕序列号

  • 由于时间戳选项与重传计时器的设置紧密相关,我们将在后面“TCP超时与重传”文章讨论重传问题时详细介绍时间戳选项的这一用途。 “这一用途”是为了强调虽然时间戳选项允许更高频率的往返时间样本,但它也为接收者提供了避免接收旧报文段与判断报文段正确性的方法这被称作防回绕序列号(PAWS),它与时间戳选项 一起记录于[RFC1323]中。现在,我们要继续探究一下它是如何工作的
  • 假设一个TCP连接使用了窗口缩放选项,并将其设置为可能最大的窗口,大约1GB。再假设使用了时间戳选项,并且发送者针对发送的每个窗口分配的时间戳数值都会加1。(这一假设是保守的。正常情况下时间戳数值的增长速度要远快于此)
  • 下表显示了当传输6GB数据时两个主机之间可能的数据流。为了避免过多的10位数字,我们使用符号G表示1 073 741 824的倍数。我们还再次采用了tcpdump中的符号J:K来表示从第J个字节到第K-1个字节的数据

  • 32位序列号字段在时刻D和时刻E间回绕。假设在时刻B有一个报文段丢失并被重传。又假设这一丢失的报文段在时刻F重新出现。假设报文段丢失与重新出现的时间差小于一个报文段在网络中存在的最大时间(称为MSL)否则当路由器发现TTL期满后就会丢弃该报文段。正如我们之前提到的,旧的报文段重新出现并包含当前正在传输的序列号的问题只会发生在相对高速的连接中
  • 由上表可以看出,使用时间戳选项能够有效地防止上述问题。接收者可以将时间戳看作一个32位的扩展序列号。丢失的报文段会在时刻F重新出现,由于它的时间戳为2,小于最近的有效时间戳(5或6),因此防回绕序列号算法会将其丢弃。防回绕序列号算法并不要求在发送者与接收者之间有任何形式的时钟同步。接收者所需要的是保证时间戳数值单调增长,并且每一个窗口的数据至少增加1

六、用户超时选项(UTO选项)

  • 待续

七、认证选项(TCP-AO选项

  • 待续

转载地址:https://dongshao.blog.csdn.net/article/details/104039845 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:TCP/IP卷一:67---TCP连接管理之(分组层路径最大传输单元发现(PLPMTUD)、黑洞问题、黑洞探测)
下一篇:Effective STL第7条:容器之(如果容器内元素通过new创建,切记在容器对象析构前将指针delete掉(使用智能指针))

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月14日 06时43分23秒