TCP中的四个定时器:

1、超时定时器(最复杂的一个)  2、坚持定时器  3、保活定时器  4、2MSL定时器

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

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

糊涂窗口综合症

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

  1、接收方不通告小窗口。通常的算法是接收方不通告一个比当前窗口大的窗口(可以为0),除非窗口可以增加一个报文段大小(也就是将要接收的MSS)或者可以增加接收方缓存空间的一半,不论实际有多少。发送方避免出现糊涂窗口综合症的措施是只有以下条件之一满足时才发送数据:

    ( a )可以发送一个满长度的报文段;

    ( b )可以发送至少是接收方通告窗口大小一半的报文段;

     ( c )可以发送任何数据并且不希望接收ACK(也就是说,我们没有还未被确认的数据)或者该连接上不能使用Nagle算法。
ok,现在我们回忆一下,可以发现TCP的很多规定都是为了在一次传送中发送尽量多的数据,例如捎带ACK数据报文的策略,Nagle算法,重传时发送包含原数据报文的策略,等等。

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

最新文章

  1. react+react-router+webpack+express+nodejs
  2. Shell入门教程:流程控制(1)命令的结束状态
  3. Using GET_APPLICATION_PROPERTY in Oracle D2k Forms
  4. golang的内存模型与new()与make()
  5. [百度空间] [原]MFC杂乱笔记
  6. 百度全新的ARM架构服务器,一个2U机箱装6台,每台4个3T硬盘,每个机箱共72TB
  7. ajax取返回值的方法
  8. Date对象需要注意的点
  9. Difference between datacontract and messagecontract in wcf
  10. eclipse luna 无法安装veloeclipse问题
  11. Zero Downtime Upgrade of Oracle 10g to Oracle 11g Using GoldenGate — 3
  12. jQuery UI的datepicker日期控件如何让他显示中文
  13. SpringMVC一路总结(一)(转)
  14. hibernate对象的状态以及生命周期
  15. Error:Failed to open zip file. Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
  16. TPFrame框架之robot模块的基本使用
  17. 3064: Tyvj 1518 CPU监控
  18. (淘宝无限适配)手机端rem布局详解
  19. selenium实现淘宝的商品爬取
  20. Numpy存字符串

热门文章

  1. table边框不显示
  2. ExtJS003单击按钮弹出window
  3. #pragma pack(push,1)与#pragma pack(pop)
  4. 腾讯云部署Flask应用
  5. nodejs入门demo
  6. git切换远程
  7. php制作数据字典
  8. bzoj 1042: [HAOI2008]硬币购物 dp+容斥原理
  9. python3.4 使用pymssql 乱码
  10. mybatis字段名与类属性名不相同的冲突