【TCP/IP详解 卷一:协议】第二十二章 TCP的坚持定时器
这两章来到了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的坚持定时器的更多相关文章
- TCP/IP详解 卷一(第十二章 广播和多播)
广播和多播仅应用于UDP. 广播指的是一个主机向网上的所有其他主机发送帧,而 多播仅发送给属于多播组的多个主机. 为了弄清广播和多播,需要了解主机对由信道传送过来帧的过滤过程 1.首先,网卡查看由信道 ...
- TCP/IP详解 卷一(第十九章 TCP的交互数据流)
TCP需要同时处理两类数据:块数据.交互数据. 本章将以Rlogin应用为例观察交互数据的传输过程. 交互式输入 首先观察在一个Rlogin连接上键入一个交互命令时所产生的数据流(每键入一个交互按键都 ...
- TCP/IP详解 卷一(第十四章 DNS:域名系统)
域名系统(DNS Domain Name System)是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换及有关电子邮件的选路信息. 从应用角度上看,对DNS的访问时通过 ...
- TCP/IP详解 卷1 第十九章 TCP的交互数据流
19.1 引言 成块数据:比如ftp.电子邮件.Usenet新闻 交互数据:Telnet.Rlogin 成块数据的报文段基本上都是满长度(full-size)的,而交互数据小的多(Telnet和Rlo ...
- TCP/IP详解 卷一(第二章 链路层)
在TCP/IP协议族中,链路层主要有三个目的: 1.为IP模块发送和接收IP数据报 2.为ARP模块发送ARP请求和接收ARP应答 3.为RARP请求和接收RARP应答 TCP/IP支持多种不同的链路 ...
- TCP/IP详解 卷一(第二十章 TCP的成块数据流)
本章将介绍TCP所使用的被称为滑动窗口协议的一种流量控制方法. 该协议允许发送方在停止并等待确认前可以连续发送多个分组,这样就可以加速数据的传输. 滑动窗口 下图用可视化的方法显示了滑动窗口协议 我们 ...
- TCP/IP详解 卷一(第十八章 TCP连接的建立和终止)
建立连接 建立一个TCP连接时会发生下述情况 1.客户TCP发送一个SYN(同步)分节,它告诉服务器将在(待建立)连接中发送的数据的初始序列号. 2.服务器确认(ACK)客户的SYN,同时自己也得发送 ...
- 【TCP/IP详解 卷一:协议】第二章:链路层
2.1 引言 链路层的三个目的: (1)为IP模块发送和接收IP数据报. (2)为ARP模块发送ARP请求和接收ARP应答.地址解析协议:ARP. (3)为RARP模块发送RARP请求和接收RARP应 ...
- 『TCP/IP详解——卷一:协议』读书笔记——10
2013-08-22 22:57:17 3.8 ifconfig命令 这个命令在Linux系统下可以通过下面的指令阅读说明文档: ifconfig 由于书中作者用的系统比较早的某Unix系统,所以我的 ...
- 『TCP/IP详解——卷一:协议』读书笔记——01
从今日起开始认真研读TCP/IP详解这本经典制作,一是巩固我薄弱的计算机网络知识,二来提高我的假期的时间利用率.将心得与思考记录下来,防止白看-哦耶 2013-08-14 18:47:06 第一章 概 ...
随机推荐
- Java-SpringMvc-响应Html代码展示
代码 @RequestMapping(value = "/test.do", method = {RequestMethod.GET}) public void test(Http ...
- IP追踪
cmd里输入:tracert www.baidu.com 上图箭头方框中就是对应公司的总网IP
- racle修改字段类型时报"要更改的列必须为空"处理方法
执行以下语句报"要修改数据类型,则要更改的列必须为空" alter table 表名 modify (目标字段 varchar2(100)); 解决步骤: 第一步,在表中 ...
- [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 ...
- 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 ...
- Qt addStretch()详解
addStretch函数,是在布局的时候用到. 函数原型: void QBoxLayout::addStretch ( int stretch = 0 ) 作用:平均分配Layout 比如: QVBo ...
- malloc 实现原理
1. Reference: 如何实现一个malloc http://blog.codinglabs.org/articles/a-malloc-tutorial.html 2.
- cocos代码研究(2)Label学习笔记
理论部分 Label类继承自Node类,中文翻译文字与字体,通常在应用开发中为模块作为提示和描述的作用,主要有3中不同的创建方式. 1.通过ttf字体包创建,通过指定本地已有的ttf格式的字体文件,创 ...
- ngxin开启rewrite伪静态
1.编辑nginx配置文件 vi /usr/local/nginx/conf/nginx.conf #include enable-php.conf; include enable-php-pathi ...
- 【转】eclipse反编译插件
原文地址:http://bbs.csdn.net/topics/390263414 离线安装包下载地址一:http://feeling.sourceforge.net/downloads/org.sf ...