这两章来到了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. 迁移到 Linux:使用 sudo | Linux 中国

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/F8qG7f9YD02Pe/article/details/80976600 https://mmbi ...

  2. CSS分列等高

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. android Thread

    1.Thread的三种形式 第一种: class MyThread extends Thread{ @Override public void run(){ Log.d("MainActiv ...

  4. SQLite-创建、附加、分离数据库

    创建数据库 - $> sqlite3 DatabaseName.db 附加数据库 - sqlite> ATTACH DATABASE 'DatabaseName.db' AS 'Alias ...

  5. spring boot上传 下载图片。

    https://blog.csdn.net/a625013/article/details/52414470 build.gradle buildscript { repositories { mav ...

  6. bootstrap modal插件弹出窗口如何限制最大高度,并且在内容过多时可以滚动显示

    .modal-body{ max-height:400px; overflow-y:auto; } 只有在modal-body类上限制高度才能起作用,其他地方的限制均不起作用

  7. (转)Elasticsearch索引mapping的写入、查看与修改

    mapping的写入与查看 首先创建一个索引: curl -XPOST "http://127.0.0.1:9200/productindex" {"acknowledg ...

  8. [LeetCode] 116&117. Populating Next Right Pointers in Each Node I&II_Medium tag: BFS(Dont know why leetcode tag it as DFS...)

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  9. excel 数字转文本

    问: 在EXCEL2003中,如何把一列数字转换成文本格式我的意思的,这一列数字全部变成带有文本格式符号(就是左上角有个绿色小三角)的那种以文本形式存储的数字.目前我只知道一个一个双击单元格,但一列数 ...

  10. 软件包管理:源码包管理-源码包与RPM包的区别

    RPM会安装在默认位置,源码包会安装在指定位置. 绝大多数ROM包遵循此规范.写软件包是就固定好了. 主要影响体现在对服务的管理方法,服务的管理分三种:启动,重启动,停止. 启动时使用绝对路径来启动. ...