TCP一共有四个主要的定时器,前面已经讲到了一个--超时定时器--是TCP里面最复杂的一个,另外的三个是:

  1. 坚持定时器
  2. 保活定时器
  3. 2MSL定时器

其中坚持定时器用于防止通告窗口为0以后双方互相等待死锁的情况;而保活定时器则用于处理半开放连接

1.坚持定时器

坚持定时器的原理是简单的,当TCP服务器收到了客户端的0滑动窗口报文的时候,就启动一个定时器来计时,并在定时器溢出的时候向向客户端查询窗口是否已经增大,如果得到非零的窗口就重新开始发送数据,如果得到0窗口就再开一个新的定时器准备下一次查询。通过观察可以得知,TCP的坚持定时器使用1,2,4,8,16……64秒这样的普通指数退避序列来作为每一次的溢出时间。

糊涂窗口综合症

TCP的窗口协议,会引起一种通常叫做糊涂窗口综合症的问题,具体表现为,当客户端通告一个小的非零窗口时,服务器立刻发送小数据给客户端并充满其缓冲区,一来二去就会让网络中充满小TCP数据报,从而影响网络利用率。对于发送方和接收端的这种糊涂行为。TCP给出了一些建议(或者是规定)。

  1. 接收方不通告小窗口。通常的算法是接收方不通告一个比当前窗口大的窗口(可以为0),
    除非窗口可以增加一个报文段大小(也就是将要接收的MSS)或者可以增加接收方缓存空间
    的一半,不论实际有多少。
  2. 发送方避免出现糊涂窗口综合症的措施是只有以下条件之一满足时才发送数据: ( a )可
    以发送一个满长度的报文段; ( b )可以发送至少是接收方通告窗口大小一半的报文段; ( c )可以
    发送任何数据并且不希望接收ACK(也就是说,我们没有还未被确认的数据)或者该连接上
    不能使用Nagle算法。

ok,现在我们回忆一下,可以发现TCP的很多规定都是为了在一次传送中发送尽量多的数据,例如捎带ACK数据报文的策略,Nagle算法,重传时发送包含原数据报文的策略,等等。

2.保活定时器

保活定时器更加的简单,还记得FTP或者Http服务器都有Sesstion Time机制么?因为TCP是面向连接的,所以就会出现只连接不传送数据的“半开放连接”,服务器当然要检测到这种连接并且在某些情况下释放这种连接,这就是保活定时器的作用。其时限根据服务器的实现不同而不通。另外要提到的是,当其中一端如果崩溃并重新启动的情况下,如果收到该端“前生”的保活探察,则要发送一个RST数据报文帮助另一端结束连接。

 

最新文章

  1. 旺财速啃H5框架之Bootstrap(五)
  2. NGUI学习笔记(一)UILabel介绍
  3. Ubuntu14.0下安装Zend Framework 2
  4. Bootstrap《第一篇》,关于container、jumbotron、row、col、text-center等的学习
  5. jquery/js特效代码总结(一):tab切换
  6. MSP430F149学习之路——UART
  7. 安卓开发利用外部jar包时ClassNotFound的错误
  8. windows 安装 setuptools
  9. 启动hadoop,报错Error JAVA_HOME is not set and could not be found
  10. Spring 反转控制(IOC) 依赖注入(DI)
  11. JQ兼容各种JS库的写法
  12. linux web服务器及LAMP动态网站平台搭建
  13. [Android] Android Java String 转Uri
  14. vue-cli title 里面怎动态显示文字
  15. 使用MyEclipse开发Java EE应用:用XDoclet创建EJB 2 Session Bean项目(二)
  16. Java之路(五) 访问权限控制
  17. MVC2 ,MVC3 ,MVC4,MVC5的区别,EF的各个版本的区别;LocalDB是个啥
  18. 关于学习JAVA程序设计语言的回顾与展望
  19. [转]JVM性能调优监控工具
  20. [LeetCode系列]括号生成问题

热门文章

  1. SQLSERVER2014中的新功能
  2. Task Runner Explorer for vs2015找不到啊
  3. ORM查询语言(OQL)简介--高级篇(续):庐山真貌
  4. linux 2.6 驱动笔记(二)
  5. RabbitMQ(五) -- topics
  6. GOOGLE PROTOBUF开发者指南
  7. html嵌套MP4、PDF的简单方案
  8. redis数据结构整理(一)
  9. JS基础知识总结
  10. 树形打印lua table表