TCP坚持定时器
窗口探查(window probe)
当接收方TCP缓冲区没有剩余空间后,在ACK中会通知发送方window=0,此时发送方就暂停发送数据。当接收方TCP缓冲区又有空间后,会再次发送一个ACK,告知其剩余缓冲区大小,可以接受新的数据包了,这个ACK叫做窗口更新。TCP接收方则等待新的数据包过来。但是如果这个窗口更新的ACK丢失了,那么则会两端互相等待:接收方等待新的数据包,因为他已经通知对端新的window大小了,而发送方则还在等待窗口更新,因为它还认为对端窗口为0。
坚持定时器(Persist Timer)就是为了解决这个问题而设计的。发送方使用一个坚持定时器来周期性的向接收方查询,以便发现窗口已经增大。这些从发送方发出的查询报文段被称为窗口探查(window probe)。窗口探查包含一个字节,TCP总是允许发送已关闭窗口之后一个字节的数据。发送方在收到window=0的通知后就开启这个定时器,如果这个定时器的时间到还没收到接收方的窗口更新,那么它就探查这个空的窗口以决定窗口是否丢失。
窗口探查的时间间隔为5,6,12,24,48,60秒,然后每60秒发一次,这个过程会一直持续到窗口更新或者连接断开。
糊涂窗口综合症(silly window syndrome)
滑动窗口用于流量控制,会导致少量的数据将通过连接进行交换,而不是满长度的报文段。该现象可放生在两端中的任何一端:接收方可以通告发送方一个小的窗口(而不是一直等到大的窗口时才通告),而发送发也可以发送少量数据(而不是等待其他的数据以便发送一个大的报文段)。该现象被称为“糊涂窗口综合症(SWS)”。可以在两端中的任何一端采取措施避免SWS。
1)接收方不通告小窗口。通常的算法是接受发不通告一个比当前窗口大的窗口(可以为0),除非窗口可以增加一个报文段大小(也就是要接收的MSS)或者可以增加接收方缓存空间的一半。
2)发送方只有满足以下条件之一才发送数据:(Nagle算法)
(a)可以发送一个MSS;
(b)可以发送至少接收方缓存大小一半的数据大小;
(c)能够发送手头所有数据并且不希望接收ACK(也就是说我们没有还未被确认的数据)或者给该连接禁止了Nagle算法。
Nagle算法伪代码如下:
if there is new data to send
if the window size >= MSS and available data is >= MSS
send complete MSS segment now
else
if there is unconfirmed data still in the pipe
enqueue data in the buffer until an acknowledge is received
else
send data immediately
end if
end if
end if
方法b要求发送方一直监视另一方通告的最大窗口大小,这是一种发送方猜测接收方缓存空间的企图。虽然在连接建立时接受缓存的大小可能减小,但是在实际中这种情况很少见。
TCP坚持定时器的更多相关文章
- TCP的定时器
TCP的定时器 在TCP协议中有的时候需要定期或者按照某个算法对某个事件进行触发,那么这个时候,TCP协议是使用定时器进行实现的.在TCP中,会有四种定时器: 重传定时器 坚持定时器 保活定时器 2M ...
- tcp 保活定时器分析 & Fin_WAIT_2 定时器
tcp keepalive定时器 http server 和client端需要防止"僵死"链接过多!也就是建立了tcp链接,但是没有报文交互, 或者client 由于主机突然掉电! ...
- TCP/IP详解学习笔记(13)-TCP坚持定时器,TCP保活定时器
TCP一共有四个主要的定时器,前面已经讲到了一个--超时定时器--是TCP里面最复杂的一个,另外的三个是: 坚持定时器 保活定时器 2MSL定时器 其中坚持定时器用于防止通告窗口为0以后双方互相等待死 ...
- TCP的定时器系列 — 零窗口探测定时器
主要内容:零窗口探测定时器的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 出现以下情况时,TCP接收方的接收缓冲区将被塞满数据: 发送方的发送速 ...
- TCP的定时器系列 — 保活定时器
主要内容:保活定时器的实现,TCP_USER_TIMEOUT选项的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 原理 HTTP有Keepaliv ...
- TCP的定时器系列 — 超时重传定时器
主要内容:TCP定时器概述,超时重传定时器.ER延迟定时器.PTO定时器的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd Q:一条TCP连接会使用 ...
- TCP保活定时器
TCP有Keepalive功能,它和HTTP的Keepalive功能目的不一样.TCP服务器希望知道客户端是否崩溃.重新启动或者中间路由不通.保活定时器就提供这种功能. 在进一步介绍TCP的保活定时器 ...
- linux tcp协议定时器
1 连接建立定时器:75秒 2 保活定时器:2小时又10分钟 3 重传定时器:根据RTT计算 4 2MSL定时器:最大报文段存活时间 5 持续定时器
- TCP的定时器系列 — SYNACK定时器
主要内容:SYNACK定时器的实现,TCP_DEFER_ACCPET选项的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 在上一篇博客中,已经连带 ...
随机推荐
- RedHat Enterprise7 修改为CentOS的yum源
报错 解决 1.将自带的yum卸载掉 2.下载centos的yum并安装 wget http://mirrors.163.com/centos/7/os/x86_64/Packages/yum-met ...
- Scala面向对象03
- (转)Linux用户登录记录日志和相关查看命令汇总
原文地址:http://www.cnblogs.com/lizhaoxian/p/5981029.html # 1 utmp.wtmp.btmp文件 Linux用户登录信息放在三个文件中: 1 /va ...
- 视图push和presentViewController注意点
presentViewController: - (void)publishClick{ NSLog(@"发布按钮被点击"); PublishViewController *pub ...
- Java集合(7):散列与散列码
散列的价值在于速度.我们使用数组来保存键的信息,这个信息并不是键本身,而是通过键对象生成一个数字(散列码),作为数组下标.由于数组的容量是固定的,而散列容器的大小是可变的,所以不同的键可以产生相同的数 ...
- LOGIT REGRESSION
Version info: Code for this page was tested in SPSS 20. Logistic regression, also called a logit mod ...
- 李宏毅 Keras2.0演示
李宏毅 Keras2.0演示 不得不说李宏毅老师讲课的风格我真的十分喜欢的. 在keras2.0中,李宏毅老师演示的是手写数字识别(这个深度学习框架中的hello world) 创建网络 首先我们需要 ...
- realpython教程之机器学习之Windows下的环境配置
不得不说,realPython的教程确实写的仔细,准确,有逻辑.果然高质量的学习材料还是更利于学的. 反观我们学校,似乎就有些急功近利了.连Python语言基础都没学,就直接讲深度学习.完全不符合学习 ...
- struts框架之环境搭建(一)
一.首先,我们需要做一些准备工作: 1.1. 下载struts:https://struts.apache.org/download.cgi#struts2520 1.2. 下载tomcat:ht ...
- SQL Server 下载与安装
1.首先去Microsoft官网下载对应的安装程序,下载地址:https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.运行安 ...