专栏首页cwl_Java速读原著-TCP/IP(窗口扩大选项)

速读原著-TCP/IP(窗口扩大选项)

第24章 TCP的未来和性能

24.4 窗口扩大选项

窗口扩大选项使T C P的窗口定义从16 bit增加为32 bit。这并不是通过修改T C P首部来实现的, T C P首部仍然使用 16 bit ,而是通过定义一个选项实现对 16 bit 的扩大操作 ( s c a l i n g o p e r a t i o n )来完成的。于是T C P在内部将实际的窗口大小维持为 32 bit的值。

在图1 8 - 2 0可以看到关于这个选项的例子。一个字节的移位记数器取值为 0(没有扩大窗口的操作)和1 4。这个最大值1 4表示窗口大小为1 073 725 440字节(6 5 5 3 5×21 4)。

这个选项只能够出现在一个 S Y N报文段中,因此当连接建立起来后,在每个方向的扩大因子是固定的。为了使用窗口扩大,两端必须在它们的 S Y N报文段中发送这个选项。主动建立连接的一方在其 S Y N中发送这个选项,但是被动建立连接的一方只能够在收到带有这个选项的S Y N之后才可以发送这个选项。每个方向上的扩大因子可以不同。

如果主动连接的一方发送一个非零的扩大因子,但是没有从另一端收到一个窗口扩大选项,它就将发送和接收的移位记数器置为 0。这就允许较新的系统能够与较旧的、不理解新选项的系统进行互操作。

Host Requirements RFC要求T C P接受在任何报文段中的一个选项(只有前面定义的一个选项,即最大报文段大小,仅在S Y N报文段中出现)。它还进一步要求T C P忽略任何它不理解的选项。这就使事情变得容易,因为所有新的选项都有一个长度字段(图1 8 - 2 0)。

假定我们正在使用窗口扩大选项,发送移位记数为 S,而接收移位记数则为 R。于是我们从另一端收到的每一个 16 bit的通告窗口将被左移 R位以获得实际的通告窗口大小。每次当我们向对方发送一个窗口通告的时候,我们将实际的 32 bit窗口大小右移S比特,然后用它来替换T C P首部中的16 bit的值。

T C P根据接收缓存的大小自动选择移位计数。这个大小是由系统设置的,但是通常向应用进程提供了修改途径(我们在 2 0 . 4节中讨论了这个缓存)。

一个例子 如果在4 . 4 B S D的主机v a n g o g h . c s . b e r k e l e y . e d u上使用s o c k程序来初始化一个连接,我们可以观察到它的 T C P计算窗口扩大因子的情况。下面的交互输出显示的是两个连续运行的程序,第1个指定接收缓存为128 000字节,而第2个的缓存则为220 000字节。

图2 4 - 7显示了这两个连接的 t c p d u m p输出结果(去掉了第 2个连接的最后8行,因为没有什么新内容)。

在第1行,v a n g o g h通告一个 6 5 5 3 5的窗口,并通过设置移位计数为 1来指明窗口扩大选项。这个通告的窗口是比接收窗口( 128 000)还小的一个最大可能取值,因为在一个 S Y N报文段中的窗口字段从不进行扩大运算。

扩大因子为1表示v a n g o g h发送窗口通告一直到131 070(6 5 5 3 5×21)。这将调节我们的接收缓存的大小(12 8000)。因为b s d i在它的S Y N(第2行)中没有发送窗口扩大选项,因此这个选项没有被使用。注意到v a n g o g h在随后的连接阶段继续使用最大可能的窗口(6 5 5 3 5)。

对于第2个连接v a n g o g h请求的移位计数为 2,表明它希望发送窗口通告一直为 262 140(6 5 5 3 5×22),这比我们的接收缓存(220 000)大。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 速读原著-TCP/IP(TCP的未来和性能)

    T C P已经在从1200 b/s的拨号S L I P链路到以太数据链路上运行了许多年。在 8 0年代和9 0年代初期,以太网是运行 T C P / I P最主...

    cwl_java
  • 速读原著-TCP/IP(TCP 选项)

    T C P首部可以包含选项部分(图 1 7 - 2)。仅在最初的T C P规范中定义的选项是选项表结束、无操作和最大报文段长度。在我们的例子中,几乎每个 S Y...

    cwl_java
  • 速读原著-TCP/IP(sock程序)

    在本书中一直使用一个称为 s o c k的小测试程序,用来生成 T C P和U D P数据。它既可以用作一个客户进程,也可以用作一个服务器进程。有这样一个可以从...

    cwl_java
  • Qt 用画笔对图片实现马赛克效果

    最近接了一个用 Qt 做跨平台截图工具的任务,主要功能有截图、绘制图案、马赛克、毛玻璃、文字能效果,其中马赛克功能时参考网上的文献并自己研究制作出来的,这里特意...

    我与梦想有个约会
  • bunzip2: command not found

    错误信息:bunzip2: command not found [/root/anaconda2] >>> PREFIX=/root/anaconda2 An...

    程裕强
  • 浏览器与服务器的消息通信

    最近工作中遇到一个场景,商家在商家后台需要实时的获取到有没有新订单,有的话是几个;这个需求类似与日常中使用QQ或者微信时的新信息提醒一样,只要有新信息就需要提醒...

    李海彬
  • FTP:构建在TCP协议之上的文件传输协议

    在前几节我们辛苦完成了TCP协议的基本设计,我们的代码当然无法达到工业级要求,但是基本将TCP协议的要点表达出来,是一个”基本可用版本“。TCP协议类似于一条货...

    望月从良
  • 浏览器与服务器的消息通信

    最近工作中遇到一个场景,商家在商家后台需要实时的获取到有没有新订单,有的话是几个;这个需求类似与日常中使用QQ或者微信时的新信息提醒一样,只要有新信息就需要提醒...

    哲洛不闹
  • 浏览器与服务器的消息通信

    最近工作中遇到一个场景,商家在商家后台需要实时的获取到有没有新订单,有的话是几个;这个需求类似与日常中使用QQ或者微信时的新信息提醒一样,只要有新信息就需要提醒...

    李海彬
  • 企业面试题: 对前端工程师这个职位是怎么样理解的

    - 前端是最贴近用户的程序员,前端的能力就是能让产品从 90分进化到 100 分,甚至更好,

    舒克

扫码关注云+社区

领取腾讯云代金券