说明:  本文仅供学习交流。转载请标明出处,欢迎转载!

本文是下面文献相关内容的总结

[1] 《TCP/IP具体解释 卷1:协议》

[2] 《TCP/IP协议族 第4版》

[3] 《计算机网络 第5版》

TCP协议通常包含4种计时器:重传计时器、持续计时器、保活计时器和时间等待计时器

重传计时器:Retransmission Timer,该计时器用于整个连接期间,用于处理RTO(重传超时)。

当一个报文从发送队列发出去后。就启动该计时器。若在RTO之内收到了该报文的ACK,则停止该重传计时器;若t>=RTO都还没有收到报文的ACK,则重传该报文,并重置该重传计时器。

    注意:若ACK报文捎带其它信息,则不会为该报文设置重传计时器。

持续计时器:Persistent Timer。用于处理零窗体值的通过。

若接收端的TCP要命令发送端的TCP停止发送报文段时,就向发送TCP发送一个报文段。该报文的窗体大小字段为0,称为零值窗体。发送端的TCP收到该零值窗体值报文后,就会停止向接收端的TCP发送报文,直到接收端的TCP发送一个窗体大小非0的ACK报文。

若接收端TCP向发送TCP发送ACK报文,以通知其发送窗体的大小(非0)后。接收端的TCP便等待发送端发送数据,若该ACK回去的路上丢失了。则发送端的TCP并没收到ACK报文,便不会向接收端发送报文,而接收却以为自己的ACK报文发成功了,便傻乎乎的瞎等待(别忘了,ACK报文是永远不会被设置重传计时器的)。这样两个人便陷入了“死锁状态”。

为了防止该死锁状态的出现,TCP为发送TCP设置了一个持续计时器。一旦发送TCP收到了“零值窗体报文”,该计时器便启动。

启动后,在为超时期间,若收到了接收端的非0窗体的通知,则停止该计时器;若该持续计时器超时了,则发送TCP就发送一个特殊的探測报文段,该报文段仅包括1B的新数据。该报文不须要确认。探測报文的作用在于提醒对方(目的能够记录在数据部分),重传下上次发送发送的那个ACK报文(即那个非0值窗体的报文)。

   注意:TCP规定,接收窗体的rwnd=0,也必须接收这三种报文段:零窗体探測报文段、确认报文段和携带紧急数据的报文段。

保活计时器:Keeplive Timer,防止两端的TCP在连接期间长时间处于空暇状态

能够为server设置一个保活计时器。

每当server收到客户的信息。就把该计时器复位。表示该通话还活着,超时通常设置为2小时。当server超过了2H还没有收到客户的不论什么信息时,server就向客户发送过一个探測报文段。若连续发送了10个探測报文段(没个75s一个)还没有响应,就觉得客户出了故障,并终止这个连接。

时间等待计时器:Time-Wait timer。(超时时间=2MSL,max segment lifetime),该计时器为client设置。该计时器是为还记得4次挥手中的第三次挥手吗?在第三次挥手中。client收到server发送的FIN报文后,client就启动Timer-Wait计时器,时间设置为2MSL,并发送最后一个ACK。两个作用:(1)保证在2MSL时间内,server端可以收到最后一个ACK;(2)可以保证之前某些在网络中滞留非常久的发给server的报文不会在本次连接连接关闭后再去骚扰server。值得注意的是:最后两次挥手期间。启动了两种计时器。server向client发送FIN后启动重传计时器,client收到FIN后。向server发送ACK,同一时候启动Time-Wait计时器(时间长度为2MSL)。

最新文章

  1. Linux下磁盘挂载
  2. 【Git学习笔记】初始化Git仓库和版本回退
  3. Oracle_RAC数据库GI的PSU升级(11.2.0.4.0到11.2.0.4.8)
  4. Populating Next Right Pointers in Each Node II--leetcode难题讲解系列
  5. 双系统重装windows后修复UBUNTU的GRUB
  6. Linux学习之CentOS--FTP服务原理及vsfptd的安装、配置
  7. MVC模式中路由如何生成URL
  8. MySQL集群的可行方案
  9. 【转】Ajax 基础学习
  10. CSS3展现精彩的动画效果 css3的动画属性
  11. C语言结构体的内存对齐问题
  12. 显示GetLastError()的错误描述字符串
  13. char , unsigned char 和 signed char 区别
  14. Jimmychoo商城系统总结
  15. ansible playbook实践(三)-yaml文件写法
  16. java:编程比赛中有用的方法整理(一)数组
  17. Python--day09(内存管理、垃圾回收机制)
  18. 基于vue框架手写一个notify插件,实现通知功能
  19. 使用RMAN Active duplicate创建异地auxiliary Database
  20. html5 viewport使用

热门文章

  1. 转:shell比较两个字符串是否相等
  2. imagemagick /tmp/magick-xxxxxxxx
  3. Air Raid(最小路径覆盖)
  4. leetcode第一刷_Set Matrix Zeroes
  5. c/c++内存分配方式(转)
  6. 打印NSLog分类 Foundation+Log.m
  7. [Swust OJ 247]--皇帝的新衣(组合数+Lucas定理)
  8. pkg_utility
  9. Python 模块(五)
  10. Maven创建项目: Failed to execute goal org.apache.maven.plugin( mvn archetype:create)