一、坚持定时器
 
1.坚持定时器的由来
        TCP通过让接收方指明希望从发送方接受的窗口大小来进行流量控制。设置窗口大小为0可以组织发送方传送数据,直至窗口变为非0为止。
        如果接收方向发送方通告了一个为0的接口,然后又向发送方通告了窗口更新,恰好这个确认丢失了,那么接收方等待接收数据,发送方等待允许他继续发送数据的窗口更新,就会形成死锁。为了防止这种死锁,发送方使用一个坚持定时器来周期性地向接收方查询,以便发现窗口是否增大。这些从发送方发出的报文段称为窗口探查。
        计算坚持定时器的定时时间使用了普通的TCP指数退避。窗口探查包含一个字节的额数据,TCP总是允许在关闭连接前发送一个字节的数据。返回的窗口为0的ACK不是确认该字节,因此该字节被持续重传。
 
2.糊涂窗口综合症
(1)介绍
        接收方通告一个小窗口,发送方通过这个小窗口发送少量的数据,这个数据量甚至小于报文段的长度,TCP的传输效率低到了极点。
 
(2)避免措施
接受方:
 ①接受方不通告小窗口。通常的做法是除非窗口可以增加一个报文段或者可以增加接受方缓存的一半,否则不予通告窗口更新。 
 
发送方-满足下述条件之一再发送数据:
 ① 可以发送一个满长度的报文段
 ②可以发送至少是接受方通告窗口大小一半的报文段
 ③ 可以发送任何数据并且不希望接收ACK(没有未被确认的数据)或者该连接上不能使用Nagle算法
 
(3)坚持定时器工作流程
(1)发送端收到0窗口通告后,就启动坚持定时器,并在定时器溢出的时候向客户端查询窗口是否已经增大。
(2)在定时器未到,就收到非零通告,则关闭该定时器,并发送数据。

(3)若定时器已到,还没有收到非零通告,就发探查报文。

(4)如果探查报文ACK的通告窗口为0,就将坚持定时器的值加倍,TCP的坚持定时器使用1,2,4,8,16……64秒这样的普通指数退避序列来作为每一次的溢出时间,重复1、2、3步,如果通告窗口非零,发送数据,关闭定时器。

二、保活定时器

 

1.保活定时器的由来

 

现实中可能存在一种空闲的TCP连接--连接的双方都没有向对方发送数据,则在两个TCP模块之间不交换任何信息,这意味我们可以启动一个客户和服务器建立连接,然后离去很长时间,而连接依然保持。而且中间的路由器可以崩溃或重启,只要两端的主机没有重启,则依然保持连接建立。

服务器为了知道客户机是否崩溃或关机等情况,从而引入了保活定时器来探查这种情况。

2.工作原理

 

如果一个给定的连接在2小时内没有任何动作,那么服务器就向客户发送一个探查报文段。客户主机必须处于以下4个状态之一:

(1)客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方的正常工作的,服务器在2小时内将保活定时器复位。

(2)客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应,服务器将不能收到对探查的响应,并在75秒后超时,总共发送10个探查,每个间隔75秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。

(3)客户主机崩溃并已经重新启动。这是服务器将收到一个对其保活探查的响应,但这个响应是一个RST复位,使得服务器终止这个连接。

(4)客户主机正常运行,但是从服务器不可达。这与状态2相同,因为TCP不能够区分状态4与2之间的区别,它所能发现的就是没有收到探查的响应。

服务器不用关注客户主机被关闭或者重新启动的情况。当客户机被关闭之后,所有的应用进程也被终止,这会使客户的TCP在连接上发出一个FIN。接收到FIN会使服务器的TCP向服务器进程报告文件结束,从而服务器检测到了这种情况。

最新文章

  1. MVC学习系列3--怎么从控制器向视图传递数据
  2. json_decode返回null 和synax error原因及处理
  3. ros问题总结
  4. HTML5-格式化
  5. 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  6. jQuery自定义滚动条样式插件mCustomScrollbar
  7. JAVA6开发WebService (三)——几个概念
  8. Lua在给定范围内,生成指定个数不重复随机数组
  9. 在一个JSP页面中包含另一个JSP页面的三种方式
  10. 数据分析学习(zhuan)
  11. POJ 3422 Kaka's Matrix Travels(最小费用最大流)
  12. LCS最长公共子序列HDU1159
  13. 关于使用Element.getNodeValue()返回NULL的问题
  14. VLSI和ASIC的区别(转)
  15. python手记(36)
  16. 【NIO】dawn在buffer用法
  17. 用getBoundingClientRect()来获取页面元素的位置
  18. Linux学习之CentOS(二十)------vi/vim 按键说明
  19. mysql读写分离——中间件ProxySQL的简介与配置
  20. c语言编程上次输入影响下次记过怎么解决要交作业啦求大神相助

热门文章

  1. 解决 Oracle 11g 不能导出空表的问题
  2. FileReader和BufferedReader的区别
  3. generic type
  4. docker rancher 体验 (未完待续.....)
  5. 用Date.ToString()输出中英文月份
  6. log4j配置日志系统
  7. Ubuntu下 Astah professional 6.9 安装
  8. 左倾堆(C#)
  9. Apache 隐藏入口文件 index.php
  10. java XML转JSON格式