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 在上一篇博客中,已经连带 ...
随机推荐
- php版本:实现过滤掉广告、色情、政治相关的敏感词
现在网络上还是很乱,尤其充斥着各种广告.色情.政治相关的内容,很明显这是不符合我们国家的法律的,所以为了一个产品能够健康长久的活下去,最好还是采用一定的策略过滤或者提醒用户不要发这种内容.不过说起来容 ...
- Cell中实现多图展示
实现的效果如下: 主要实现代码如下: // // DetailCell.m // Floral // // Created by 思 彭 on 16/9/21. // Copyright © 2016 ...
- Linux三种SSH协议登陆方式
在实际工作中遇到了三种不同SSH协议登陆Linux服务器的方式,由简单到复杂分别阐述:一.最简单也是最不安全的root账号密码登陆通过root账号+root密码登陆Linux服务器. 二.普通用户登陆 ...
- 配置nova-compute在不同的hypervisors上使用不同的存储后端
说明:主参考:https://www.sunmite.com/openstack/use-local-storage-for-different-hypervisors.html 在控制节点上执行 1 ...
- K/3 Cloud 中FID和FMasterID的区别
经常会用到,例如物料在多组织情况下. 例如一个物料分配不同组织后,内码FID肯定是不同的,但FMaterId还是一样的,因为是用一个物料. FMASTERID是和物料编码对应的内码,即一个物料编码对应 ...
- kubernetes的namespaces总是Terminating
0.尝试强制删除不行 删除时带上–force --grace-period=0参数 ,无法删除:kubectl delete namespace rook-ceph --force --grace-p ...
- Android MVC MVP MVVM (一)
示例效果 一共三个控件,EditText,Button,TextView 成功显示账号信息,查询失败显示错误信息. <?xml version="1.0" encoding= ...
- C语言Ⅰ博客作业10
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-3/homework/10097 我在这个课程的 ...
- 批量删除redis的数据
批量删除redis的数据 # redis-cli -h 192.168.1.17 -p 6379 keys "xiaolang_*"|xargs redis-cli -h 192. ...
- Intellj Idea 快捷键入门
Intellj IDEA快捷键入门 时间: 2019/11/29 系统: Win10系统 版本 :Intellj Idea 2018.3 背景: 入手Intellj idea 两个月了,总结一下一些常 ...