(运输层)TCP的流量控制
来源:互联网 发布:餐饮排队叫号软件 编辑:程序博客网 时间:2024/04/29 09:03
流量控制:让发送方的发送速率不要太快,要让接收方来得及接收。
TCP的窗口单位是字节,不是报文段。
如图所示,说明了利用可变窗口大小进行流量控制。设主机A向主机B发送数据。双方确定的窗口值是400.再设每一个报文段为100字节长,序号的初始值为seq=1。
接收方的主机B进行了三次流量控制。第一次把窗口设置为rwind=300,第二次减小到rwind=100最后减到rwind=0,即不允许发送方再发送过数据了。这种使发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。
假如,B向A发送了零窗口的报文段后不久,B的接收缓存又有了一些存储空间。于是B向A发送了rwind=400的报文段,然而这个报文段在传送中丢失了。A一直等待收到B发送的非零窗口的通知,而B也一直等待A发送的数据。这样就死锁了。为了解决这种死锁状态,TCP为每个连接设有一个持续计时器。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。
必须考虑传输效率:
如何控制TCP发送报文段的时机?
Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段。 所谓“小段”,指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。
Nagle算法的规则:
(1)如果包长度达到MSS,则允许发送;
(2)如果该包含有FIN,则允许发送;
(3)设置了TCP_NODELAY选项,则允许发送;
(4)未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;
(5)上述条件都未满足,但发生了超时(一般为200ms),则立即发送。
糊涂窗口综合症:
糊涂窗口综合症是指当发送端应用进程产生数据很慢、或接收端应用进程处理接收缓冲区数据很慢,或二者兼而有之;就会使应用进程间传送的报文段很小,特别是有效载荷很小; 极端情况下,有效载荷可能只有1个字节;传输开销有40字节(20字节的IP头+20字节的TCP头) 这种现象。
发送端引起的糊涂窗口综合症
如果发送端为产生数据很慢的应用程序服务(典型的有telnet应用),例如,一次产生一个字节。这个应用程序一次将一个字节的数据写入发送端的TCP的缓存。如果发送端的TCP没有特定的指令,它就产生只包括一个字节数据的报文段。结果有很多41字节的IP数据报就在互连网中传来传去。解决的方法是防止发送端的TCP逐个字节地发送数据。必须强迫发送端的TCP收集数据,然后用一个更大的数据块来发送。发送端的TCP要等待多长时间呢?如果它等待过长,它就会使整个的过程产生较长的时延。如果它的等待时间不够长,它就可能发送较小的报文段。Nagle找到了一个很好的解决方法,发明了Nagle算法。
接收端引起的糊涂窗口综合症
- (运输层)TCP的流量控制
- 运输层—TCP的流量控制
- (运输层)TCP的拥塞控制
- TCP/IP协议族之运输层(TCP流量控制和拥塞控制 [1])
- TCP/IP协议族之运输层(TCP流量控制和拥塞控制 )
- TCP/IP协议族之运输层(TCP流量控制和拥塞控制 [1])
- TCP/IP协议族之运输层(TCP流量控制和拥塞控制 [2])
- TCP/IP协议族之运输层(TCP流量控制和拥塞控制)
- TCP/IP协议族之运输层(TCP流量控制和拥塞控制 [1])
- TCP/IP协议族之运输层(TCP流量控制和拥塞控制 [2])
- 运输层—TCP的拥塞控制
- 运输层—TCP的拥塞控制
- TCP/IP协议族之运输层——TCP流量控制和拥塞控制 [1]
- TCP/IP笔记 三.运输层(2)——TCP 流量控制与拥塞控制
- TCP/IP笔记 三.运输层(2)——TCP 流量控制与拥塞控制
- 三 运输层(二)TCP传输控制协议(三)流量控制
- 数据链路层和运输层的流量控制及差错控制
- TCP的流量控制
- 素数环
- dos命令 设置环境变量
- window相关
- Linux:安装eclipse并添加到启动栏
- Activator
- (运输层)TCP的流量控制
- TensorFlow(五)TensorFlow Python API (nn模块)
- Python入门与实践笔记-02
- Oracle分组查询2-CUBE
- html5+Css3 做一个婚纱网页
- 虚幻4崩溃问题解决方案
- nginx安装不能下载pcre yum更新问题resolve host 'mirrors.vonline.vn'"
- 注意事项!机械行业ERP系统如何选型
- jQuery报错:Uncaught ReferenceError: $ is not defined