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 ...
随机推荐
- python的二维数组操作
需要在程序中使用二维数组,网上找到一种这样的用法: ? 1 2 3 4 5 6 #创建一个宽度为3,高度为4的数组 #[[0,0,0], # [0,0,0], # [0,0,0], # [0,0,0] ...
- python 模块BeautifulSoup使用
BeautifulSoup是一个专门用于解析html/xml的库.官网:http://www.crummy.com/software/BeautifulSoup/ 说明,BS有了4.x的版本了.官方说 ...
- perl学习(5) 输入和输出
1.1. 从标准输入设备输入 <STDIN> 行输入操作在到达文件的结尾时将返回undef,在while循环的条件中不能使用chomp: while (defined($line = &l ...
- C 语言统计关键字出现次数
#include <stdio.h> #include <ctype.h> #include <string.h> #define NKEYS (sizeof ke ...
- LibSVM笔记系列(3)——初学移植libsvm的C/C++版本
在LibSVM笔记系列(1)中已经提到在g++环境中编译LibSVM只需要一个make命令那样简单. 本文将介绍 (1)LibSVM的编译文件结构 (2)svm.h中重要数据结构及函数分析 (3)sv ...
- 技术贴:解码时AVC1和H264的差别
我一直疑问为什么有些视频解码时显示格式是:H264,大部分又是:AVC1 我在搜索编程资料时在微软的msdn上发现的: 原文:http://msdn.microsoft.com/en-us/libra ...
- uVa 714 (二分法)
Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Description Before th ...
- 小猪猪逆袭成博士之C++基础篇(二) 常量、处理类型、自定义头文件
小猪猪逆袭成博士之C++基础篇(二) const .auto. decltype 上一章我们介绍了一些常用的类型和常见的问题,下面再介绍一些学习的时候不是特别常用但是在实际工程中很有用的一些东西. 一 ...
- BZOJ 2101: [Usaco2010 Dec]Treasure Chest 藏宝箱( dp )
dp( l , r ) = sum( l , r ) - min( dp( l + 1 , r ) , dp( l , r - 1 ) ) 被卡空间....我们可以发现 l > r 是无意义的 ...
- 我的Python成长之路---第四天---Python基础(16)---2016年1月23日(寒风刺骨)
四.正则表达式 字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和 ...