【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 第一章 概 ...
随机推荐
- Window版本 安装mysql
#1.下载:MySQL Community Server 5.7.16 http://dev.mysql.com/downloads/mysql/ 下载下来解压到指定目录 就安装完成了 #2.解压 如 ...
- java计算器 图形用户界面 升级版 v1.02
package com.rgy.entity; import java.awt.BorderLayout; import java.awt.Font; import java.awt.GridLayo ...
- 006-spring cloud gateway-GatewayAutoConfiguration核心配置-GatewayProperties初始化加载、Route初始化加载
一.GatewayProperties 1.1.在GatewayAutoConfiguration中加载 在Spring-Cloud-Gateway初始化时,同时GatewayAutoConfigur ...
- HTML PX/EM换算工具 快捷键
换算工具:http://www.runoob.com/tags/ref-pxtoemconversion.html 快捷键:http://www.runoob.com/tags/html-keyboa ...
- application实例
application详解及实例 application对象用来在多个程序或者是多个用户之间共享数据,用户使用的所有application对象都是一样的,这与session对象不同.服务器一旦启动,就 ...
- linux命令:locate
1.命令简介 locate(locate) 命令用来查找文件或目录. locate命令要比find -name快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/ml ...
- AngularJS 表达式 对象和数组
AngularJS 使用 表达式 把数据绑定到 HTML. AngularJS 表达式 AngularJS 表达式写在双大括号内:{{ expression }}. AngularJS 表达式把数据绑 ...
- 修改class文件
http://yucaifu1989.iteye.com/blog/1850500 http://blog.csdn.net/hexin373/article/details/6669813 使用ja ...
- Xcode 快捷键及代码格式化
按住apple键点击类名就可以定位到这个类中查看相关定义(在日后的开发中我们会经常这么来做,毕竟要记住iOS开发中所有的API是不现实的,有些API我们可以通过这种方法来查找) PS:下面都是网上百度 ...
- 2.TypeScript 基础入门(二)
变量类型的那些事 1.基本注解 类型注解使用:TypeAnnotation 语法.类型声明空间中可用的任何内容都可以用作类型注解. const num: number = 123; function ...
