这两章来到了TCP的定时器部分,在 TCP的超时与重传 和 TCP的三握四挥 我们介绍了 TCP的重传定时器 和 TCP的2MSL定时器。
本随笔介绍 防止返回ACK丢失的死锁情况 的 坚持定时器 和 检测连接的 保活定时器。
在坚持定时器的内容里,介绍了 糊涂窗口综合症,以及解决的措施。

TCP的坚持定时器

坚持定时器

我们在前面已经看到,当返回的ACK指明的窗口为0时,会有效地阻止发送方传送数据。
但是,一个问题仍然存在:ACK的传输 并不可靠。也就是说,TCP不对ACK报文段进行确认,TCP只确认 那些包含有数据的 窗口更新。

如果一个确认丢失了,那么双方很有可能因为等待对方而使连接终止:接收方等待接收数据(因为已经向发送方发送了一个 非0的通告窗口),发送方等待窗口更新。这就是死锁现象。
为了防止这种死锁现象的产生,发送方使用一个 坚持定时器 来 周期性地向接收方查询,以便发现窗口是否增大。
这些查询,称为 窗口探查。

当接收到 窗口为0 的通知窗口后,发送方停止发送数据,引起客户设置坚持定时器。如果在定时器时间到的时候,客户还没有接收到一个窗口更新,它就探查这个空的窗口以决定窗口更新是否丢失。
计算坚持定时器的时候,使用了普通的指数退避。
坚持状态 与前面介绍的 重传超时 之间一个不同的特点就是:TCP 从不放弃 窗口探查,这些探查每隔60s发送一次。这个过程 将持续到 窗口被打开(通告窗口不为0) 或者 应用程序使用的连接 被结束。

糊涂窗口综合症

基于窗口的 流量控制方案 会导致一种称为 糊涂窗口综合症 的情况。即 发送 少量 数据,而不是满长度的报文段,通过连接进行交换。
这个现象可以发生在 接收端 和 发送端:接收方通告一个很小的窗口(而不是一直等到有较大的窗口时,即缓存较为宽松的时候 发送);发送方发送很少的数据(而不是等待其他的数据一起发送)

解决方法:
(1)接收方不通告小窗口。当窗口增大到 缓存的一半时,或者增加了一个报文段的长度(即字节增加了一个 MSS),才允许通告非0的通告窗口。
(2)发送方在出现 以下状况之一 时才发送数据:

  • a) 可以发送一个 满长度 的数据报
  • b) 可以发送 大于等于 1/2通告窗口 的报文段
  • c) 能够发送手头中的所有数据,并且不希望接收ACK(就是说,我们还没有 未确认的数据) 或者 连接禁止了Nagle算法(也就是说 不能使用Nagle算法)

条件b 主要用来对付那些 总是通告小窗口的较老的,原始的主机,这要求发送方始终监视另外一方的通告窗口,这是一种发送方 猜测 对方接受缓存大小 的企图。
Nagle算法阻止我们发送小的分组,那么多小算小呢?从条件a可以看出来: 字节数小于报文段的大小 即为小。

一个例子

教材P249提到了一个例子,在 接收方返回的 第13个报文段 上 通告的窗口大小 为509,这似乎与我们前面看到的防止发送小分组相违背···

我这里提供更多的细节:
之前的报文段:报文段11(接收方->发送方):win 1533,报文段12(发送方->接收方):1024bit,报文段13(接收方->发送方):win 509.
之所以发生这种情况,是因为我们之前提到的 滑动窗口机制:窗口右沿 不允许向左边移动。

在报文段11的时候,窗口的大小是 1533,假定 左边沿 所在的地方 为 A字节,右边沿 所在的地方 为 B字节,区别 已发送但未确认的数据 和 未发送的数据 所在的界限为 C字节

A -> B = 1533, C -> B = 509, A -> C = 1024

那么发送方发送了1024字节,左边沿往右移动,移动到了C处。
此时,如果接收方通告窗口为 win0,那么意味着 B要向C靠拢,不符合 滑动窗口机制。
因此,报文段13 为 win509.

问题

  • 为什么要有 TCP坚持定时器?
    答:避免通告窗口的丢失造成的 死锁现象。
  • TCP为什么要避免糊涂窗口综合症?
    答:避免通告小的窗口大小,或者发送小的报文段。与之前我们提到的Nagle算法类似:避免造成 广域网(etc,网络比较缓慢) 的网络拥塞。

2016/8/18

【TCP/IP详解 卷一:协议】第二十二章 TCP的坚持定时器的更多相关文章

  1. TCP/IP详解 卷一(第十二章 广播和多播)

    广播和多播仅应用于UDP. 广播指的是一个主机向网上的所有其他主机发送帧,而 多播仅发送给属于多播组的多个主机. 为了弄清广播和多播,需要了解主机对由信道传送过来帧的过滤过程 1.首先,网卡查看由信道 ...

  2. TCP/IP详解 卷一(第十九章 TCP的交互数据流)

    TCP需要同时处理两类数据:块数据.交互数据. 本章将以Rlogin应用为例观察交互数据的传输过程. 交互式输入 首先观察在一个Rlogin连接上键入一个交互命令时所产生的数据流(每键入一个交互按键都 ...

  3. TCP/IP详解 卷一(第十四章 DNS:域名系统)

    域名系统(DNS Domain Name System)是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换及有关电子邮件的选路信息. 从应用角度上看,对DNS的访问时通过 ...

  4. TCP/IP详解 卷1 第十九章 TCP的交互数据流

    19.1 引言 成块数据:比如ftp.电子邮件.Usenet新闻 交互数据:Telnet.Rlogin 成块数据的报文段基本上都是满长度(full-size)的,而交互数据小的多(Telnet和Rlo ...

  5. TCP/IP详解 卷一(第二章 链路层)

    在TCP/IP协议族中,链路层主要有三个目的: 1.为IP模块发送和接收IP数据报 2.为ARP模块发送ARP请求和接收ARP应答 3.为RARP请求和接收RARP应答 TCP/IP支持多种不同的链路 ...

  6. TCP/IP详解 卷一(第二十章 TCP的成块数据流)

    本章将介绍TCP所使用的被称为滑动窗口协议的一种流量控制方法. 该协议允许发送方在停止并等待确认前可以连续发送多个分组,这样就可以加速数据的传输. 滑动窗口 下图用可视化的方法显示了滑动窗口协议 我们 ...

  7. TCP/IP详解 卷一(第十八章 TCP连接的建立和终止)

    建立连接 建立一个TCP连接时会发生下述情况 1.客户TCP发送一个SYN(同步)分节,它告诉服务器将在(待建立)连接中发送的数据的初始序列号. 2.服务器确认(ACK)客户的SYN,同时自己也得发送 ...

  8. 【TCP/IP详解 卷一:协议】第二章:链路层

    2.1 引言 链路层的三个目的: (1)为IP模块发送和接收IP数据报. (2)为ARP模块发送ARP请求和接收ARP应答.地址解析协议:ARP. (3)为RARP模块发送RARP请求和接收RARP应 ...

  9. 『TCP/IP详解——卷一:协议』读书笔记——10

    2013-08-22 22:57:17 3.8 ifconfig命令 这个命令在Linux系统下可以通过下面的指令阅读说明文档: ifconfig 由于书中作者用的系统比较早的某Unix系统,所以我的 ...

  10. 『TCP/IP详解——卷一:协议』读书笔记——01

    从今日起开始认真研读TCP/IP详解这本经典制作,一是巩固我薄弱的计算机网络知识,二来提高我的假期的时间利用率.将心得与思考记录下来,防止白看-哦耶 2013-08-14 18:47:06 第一章 概 ...

随机推荐

  1. Java-SpringMvc-响应Html代码展示

    代码 @RequestMapping(value = "/test.do", method = {RequestMethod.GET}) public void test(Http ...

  2. IP追踪

    cmd里输入:tracert www.baidu.com 上图箭头方框中就是对应公司的总网IP

  3. racle修改字段类型时报"要更改的列必须为空"处理方法

    执行以下语句报"要修改数据类型,则要更改的列必须为空"      alter table 表名 modify (目标字段 varchar2(100)); 解决步骤: 第一步,在表中 ...

  4. [LeetCode] 415. Add Strings_Easy tag: String

    Given two non-negative integers num1 and num2 represented as string, return the sum of num1 and num2 ...

  5. Look for the Air Jordan 32 in full family sizing

    Following the release of the 'Rosso Corsa' colorway, Jordan Brand is now set to officially launch th ...

  6. Qt addStretch()详解

    addStretch函数,是在布局的时候用到. 函数原型: void QBoxLayout::addStretch ( int stretch = 0 ) 作用:平均分配Layout 比如: QVBo ...

  7. malloc 实现原理

    1. Reference: 如何实现一个malloc http://blog.codinglabs.org/articles/a-malloc-tutorial.html 2.

  8. cocos代码研究(2)Label学习笔记

    理论部分 Label类继承自Node类,中文翻译文字与字体,通常在应用开发中为模块作为提示和描述的作用,主要有3中不同的创建方式. 1.通过ttf字体包创建,通过指定本地已有的ttf格式的字体文件,创 ...

  9. ngxin开启rewrite伪静态

    1.编辑nginx配置文件 vi /usr/local/nginx/conf/nginx.conf #include enable-php.conf; include enable-php-pathi ...

  10. 【转】eclipse反编译插件

    原文地址:http://bbs.csdn.net/topics/390263414 离线安装包下载地址一:http://feeling.sourceforge.net/downloads/org.sf ...