河北省唐山市建设规划局的网站,语言文字建设网站,artisteer 做的网站,一般做门户网站多少钱一、滑动窗口
rwnd#xff1a;
接收端窗口#xff0c;接收方在每次发送ACK确认报文时#xff0c;会包含一个 rwnd (Receive Window Size) 字段#xff0c;指明自己当前剩余的接收缓冲区大小#xff08;即可用窗口#xff09;#xff0c;这里是否是socket的接收缓冲区
接收端窗口接收方在每次发送ACK确认报文时会包含一个 rwnd (Receive Window Size) 字段指明自己当前剩余的接收缓冲区大小即可用窗口这里是否是socket的接收缓冲区如果未被即时会被覆盖那么何来缓冲区大小剩余一说。还是说它是系统的缓冲区还没提交给socket缓冲区的那个缓冲区。cwnd
发送方的拥塞控制窗口它根据renocubicbbr等算法来确认cwnd的窗口大小。
慢启动
拥塞避免
其中快重传它是对超时重传的优化等到超时已经很晚了。它是收到三次重复ACK则启动RTO即拥塞窗口减半。当发送端发送了5个tcp段时12345。接收端收到了1后发送了对2的期望ACK-2依次收到3 4 5后分别依次发送ACK-2。这样就有了四个ACK-2后面三个称为对第一个的重复ACK。
MTU(Maximum Transmission Unit)网络层传输的最大单元通常以太网为1500字节。
MSSMTU - IP头部(20字节) - TCP头部(20字节)。 //MSS 通常为 1460 字节
tcp段与序列号tcp把要传输的数据当成字节流从第一个字节开始给一个一开始商量号的序号number往后每个字节的序号都累加1。一个MSS为1460字节。那么一个tcp段序号范围可以为11460。例如发送端发送 5000 字节数据MSS 为 1000 字节数据可能被分割成 5 个 TCP 段
段 1序列号 1-10001000 字节
段 2序列号 1001-2000
段 3序列号 2001-3000
段 4序列号 3001-4000
段 5序列号 4001-5000超时重传也称为RTO超时重传说明网络已经很严重了它是最后一到保险因为快重传阶段服务器返回的三次重复ACK也可能丢失。1.发送端发送一个 TCP 段后启动一个重传定时器。
2.如果在 RTO 时间内未收到该段的 ACK发送端重传该段。
3.重传后TCP 通常将拥塞窗口cwnd重置为最小值例如1 MSS进入慢启动阶段。SRTT (1 - α) * SRTT α * 样本 RTT //通常 α 0.1251/8。
RTTVAR (1 - β) * RTTVAR β * |SRTT - 样本 RTT| //RTT 方差RTTVAR
RTO SRTT max(G, K * RTTVAR)
G时钟粒度通常为 100ms 或更小。
K常数通常为 4。
tcp中RTO 至少为 1 秒RFC 6298 建议某些实现可能设置最小值如 200ms。
如果超时重传失败RTO 会翻倍例如1s → 2s → 4s直到达到最大值通常 60 秒
QUICRFC 9002建议 RTO 最小值 100ms。
kGranularity 1ms符合 RFC 9002二、吞吐量的计算
吞吐量又称单位时间内有效传输数据量是被ACK确认已经到达对方的数据量。带宽是指实际的物理/硬件条件能提供的最高上限的吞吐量。因此吞吐量带宽。
吞吐量 ≤ MSS / RTT * C / sqrt(p)
其中MSS最大段大小Maximum Segment SizeRTT往返时延p丢包率C常数通常接近 1 在无丢包p≈0的情况下简化为
吞吐量 ≈ 窗口大小 / RTT这里这个窗口就是min(rwnd, cwnd)。
比如现在rtt为20ms吞吐量为20M如果现在突然执行以下命令
tc qdisc add dev eth0 root netem delay 200ms limit 10000由于窗口大小不变必定导致吞吐量减少为2M。这就像船载人过河如果河变宽2倍那么运输效率就会减少为1/2。这个时后需要提升的是船每批运送的人的数量。
那么由于这个命令只是把时间增加了并没有减少带宽这个时候由于tcp的拥塞避免会缓慢增加窗口大小直到丢包或超时。恢复到之前的吞吐量大小。
附录
picoquic的picoquic_internal.h中有如下定义
PICOQUIC_INITIAL_RTT: 初始 RTT 设置为 250ms250000 微秒。
PICOQUIC_INITIAL_RETRANSMIT_TIMER: 初始 RTO 设置为 250ms250000 微秒。
PICOQUIC_INITIAL_MAX_RETRANSMIT_TIMER: 最大初始 RTO 为 1 秒1000000 微秒。
PICOQUIC_MIN_RETRANSMIT_TIMER: 最小 RTO 为 50ms50000 微秒。
PICOQUIC_LARGE_RETRANSMIT_TIMER: 大型重传定时器为 2 秒2000000 微秒。
PICOQUIC_ACK_DELAY_MAX_DEFAULT: 默认最大 ACK 延迟为 25ms25000 微秒符合 RFC 9002。
PICOQUIC_ACK_DELAY_MIN: 最小 ACK 延迟为 1ms1000 微秒。
PICOQUIC_ACK_DELAY_MAX: 最大 ACK 延迟为 10ms10000 微秒具体值可由对端协商。如果rtt为20ms且有以下条件
RTTVAR ≈ 0ms网络稳定抖动极小假设初始 RTTVAR 为 1ms。
max_ack_delay 25ms使用 PICOQUIC_ACK_DELAY_MAX_DEFAULT。
kGranularity 1ms符合 RFC 9002。
计算quic的RTO为49ms。
RTO SRTT max(4 * RTTVAR, kGranularity) max_ack_delay 20ms max(4 * 1ms, 1ms) 25ms 20ms 4ms 25ms 49ms