TCP协议中的计时器
说明: 本文仅供学习交流。转载请标明出处,欢迎转载!
本文是下面文献相关内容的总结
[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)。
TCP协议中的计时器的更多相关文章
- TCP协议中的三次握手和四次挥手(图解)【转】
建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. [更新于2017.01.04 ]该部分内容配图有误,请大家见谅,正确的配图如下,错误配图也不删 ...
- python中TCP协议中的粘包问题
TCP协议中的粘包问题 1.粘包现象 基于TCP实现一个简易远程cmd功能 #服务端 import socket import subprocess sever = socket.socket() s ...
- 客户端验证、tcp协议中多个客户端的同时在线
一.客户端验证 当在一个局域网内需要验证是否为合法的客户端连接时,我们需要写代码进行验证. Server端 import os import hmac import socket def auth(c ...
- 从TCP三次握手说起–浅析TCP协议中的疑难杂症(2)
版权声明:本文由黄日成原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/108 来源:腾云阁 https://www.qclo ...
- TCP协议中的SO_LINGER选项
TCP协议中的SO_LINGER选项 SO_LINGER选项用来设置延迟关闭的时间,等待套接字发送缓冲区中的数据发送完成.没有设置该选项时,在调用close()后,在发送完FIN后会立即进行一些清理工 ...
- TCP 协议中的 Window Size与吞吐量
原地址:http://blog.sina.com.cn/s/blog_c5c2d6690102wpxl.html TCP协议中影响实际业务流量的参数很多,这里主要分析一下窗口的影响. TCP窗口目的 ...
- TCP协议中是如何保证报文可靠传输的
1.什么是TCP的可靠传输 它向应用层提供的数据是无差错的.有序的.无丢失的,换言之就是:TCP最终递交给应用层的数据和发送者发送的数据是一模一样的. 2.TCP保证可靠传输的办法有哪些? TCP采用 ...
- TCP协议中的序列号
TCP 协议工作在OSI的传输层,是一种可靠的面向连接的数据流协议,TCP之所以可靠,是因为它保证了传送数据包的顺序.顺序是用一个序列号来保证的.响应包内也包括一个序列号,表示接收方准备好这个序列号的 ...
- TCP 协议中MSS的理解
在介绍MSS之前我们必须要理解下面的几个重要的概念.MTU: Maxitum Transmission Unit 最大传输单元MSS: Maxitum Segment Size 最大分段大小PPPoE ...
随机推荐
- 「JAVA」:Berkeley DB的JAVA连接
Berkeley DB是一个嵌入式的数据库,它适合于管理海量的.简单的数据.关键字/数据(key/value)是Berkeley DB用来进行数据管理的基础.每个key/value构成了一条记录,而整 ...
- Java学习之二分查找算法
好久没写算法了.只记得递归方法..结果测试下爆栈了. 思路就是取范围的中间点,判断是不是要找的值,是就输出,不是就与范围的两个临界值比较大小,不断更新临界值直到找到为止,给定的集合一定是有序的. 自己 ...
- 更新ADT到Android L的方法
android ADT无法更新到20? 哈哈,有办法,windows 进入host 写入例如以下所有,是的所有.然后在到sdk manager中方可更新 #Google Services STAR ...
- Centos6.4下tar包安装最新版Mysql5.6
1.下载 mysql:http://www.mysql.com/downloads/ (须要注冊ORACLE账号) 版本号:mysql-advanced-5.6.21-linux-glibc2.5-x ...
- CKEditor和CKFinder整合实现上传下载功能
CKEditor与CKFinder整合并实现文件上传功能 事先说明:此整合的是java版本号的, 用到的有:jsp + ckeditor + ckfinder (没有servlet 及其他框架技术) ...
- iOS原生App与H5页面交互笔记
文/MikeZhangpy(简书作者)原文链接:http://www.jianshu.com/p/4ed3e5ed99c6著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 最近在做一个项 ...
- Ural 1149 - Sinus Dances
Let An = sin(1–sin(2+sin(3–sin(4+…sin(n))…)Let Sn = (…(A1+n)A2+n–1)A3+…+2)An+1For given N print SN I ...
- 鼠标滑轮一滚动Excel就停止工作
鼠标滑轮一滚动Excel就停止工作 问题签名: 问题事件名称:APPCRASH 应用程序名:EXCEL.EXE 应用程序版本:15.0.4420.1017 应用程序时间戳:50673286 故障模块名 ...
- Codeforces 331A2 - Oh Sweet Beaverette (70 points)
贪心搞就行,用map记录每个数出现的下标,每次都取首尾两个.将中间权值为负的删掉后取sum值最大的就行. #include<iostream> #include<algorithm& ...
- Ubuntu下编译Android JNI最靠谱的方法...
网上资料太杂乱,搞了大半天都还是没搞懂怎么系统的调用NDK.最后干脆放弃了Win改用Ubuntu编译JNI,虽然编译环境简单了,但是资料却少了不少.几乎没有一篇完整的文章.我想或许是能在Ubuntu下 ...