TCP 重传 滑动窗口 流量控制 拥塞控制
所属分类 tcp
浏览量 1573
面向连接的可靠性传输
TCP 通过序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输
重传机制 滑动窗口 流量控制 拥塞控制
数据包丢失 重传
超时重传 快速重传 SACK D-SACK
重传机制的其中一个方式,就是在发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方的 ACK 确认应答报文,就重发该数据
超时重传两种情况:
数据包丢失
确认应答丢失
RTT Round-Trip Time 往返时延
RTO Retransmission Timeout 超时重传时间
RTO 略大于 RTT
RTO 是一个动态变化的值
采样 RTT ,加权平均,算出一个平滑 RTT 的值,这个值不断变化,因为网络状况不断地变化。
采样 RTT 的波动范围
快速重传(Fast Retransmit)机制,它不以时间为驱动,而是以数据驱动重传。
在定时器过期之前,重传丢失的报文段。
重传的时候,是重传之前的一个,还是重传所有的问题。
SACK Selective Acknowledgment 选择性确认
TCP 头部「选项」里加 SACK
这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据。
net.ipv4.tcp_sack Linux 2.4 后默认打开
D-SACK Duplicate SACK
告诉「发送方」有哪些数据被重复接收了
发出去的包丢了
回应的 ACK 包丢了
网络延迟
D-SACK 作用
可以让「发送方」知道,是发出去的包丢了,还是接收方回应的 ACK 包丢了;
可以知道是不是「发送方」的数据包被网络延迟了;
可以知道网络中是不是把「发送方」的数据包给复制了;
net.ipv4.tcp_dsack Linux 2.4 后默认打开
滑动窗口
窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。
TCP 头 Window,窗口大小
通常窗口的大小是由接收方的决定的
流量控制
让 发送方 根据 接收方 的实际接收能力控制发送的数据量
窗口关闭
如果窗口大小为 0 时,就会阻止发送方给接收方传递数据,直到窗口变为非 0 为止,这就是窗口关闭。
如何解决窗口关闭时,潜在的死锁现象
TCP 为每个连接设有一个持续定时器,只要 TCP 连接一方收到对方的零窗口通知,就启动持续计时器。
如果持续计时器超时,就会发送窗口探测 ( Window probe ) 报文,而对方在确认这个探测报文时,给出自己现在的接收窗口大小。
窗口探测
如果接收窗口仍然为 0,那么收到这个报文的一方就会重新启动持续计时器;
如果接收窗口不是 0,那么死锁的局面就可以被打破了。
窗口探查探测的次数一般为 3 次,每次次大约 30-60 秒。如果 3 次过后接收窗口还是 0 的话,有的 TCP 实现就会发 RST 报文来中断连接。
Nagle 算法
默认打开,对于 telnet 或 ssh 这样的交互性比较强的程序,需要关闭 Nagle 算法。
关闭 Nagle 算法没有全局参数,需要根据每个应用自己的特点来关闭
拥塞控制
拥塞控制,控制的目的就是避免 发送方 的数据填满整个网络。
拥塞窗口
拥塞窗口 cwnd 是发送方维护的一个 的状态变量,它会根据网络的拥塞程度动态变化的。
发送窗口 swnd 接收窗口 rwnd
拥塞控制 四个算法
慢启动
拥塞避免
拥塞发生
快速恢复
当发送方每收到一个 ACK,就拥塞窗口 cwnd 的大小就会加 1。
慢启动阈值 ssthresh slow start threshold 状态变量
cwnd < ssthresh 使用慢启动算法
cwnd >= ssthresh 使用 拥塞避免算法
https://www.cnblogs.com/xiaolincoding/p/12732052.html
上一篇
下一篇
java中创建对象的五种方式
java有意思的陷阱
synchronized知识点
tomcat 热加载 热部署
arthas 使用 ognl 设置日志级别
ThreadLocal 与 SimpleDateFormat