- 论坛徽章:
- 1
|
本帖最后由 goingstudy 于 2018-06-15 20:40 编辑
假设不用SACK和Timestamp选项,在发生RTO后,Linux 是把重传队列全标记为丢失:
- tcp_retransmit_timer()
- tcp_enter_loss()
- tcp_timeout_mark_lost()
复制代码 如果随后的ACK 应答了RTO的段,是会把重传队列全部恢复吗(删除重传标记,进入Open状态),这个代码是在哪里做的?
这个我用packetdrill 确认了,但是有疑问,而且没找到代码在哪里做的- +0.000 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
- +0.000 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
- +0.000 setsockopt(3, SOL_SOCKET, SO_SNDBUF, [131072], 4) = 0
- +0.000 bind(3, ..., ...) = 0
- +0.000 listen(3, 1) = 0
- +0.100 < S 0:0(0) win 40000 <mss 1000>
- +0.000 > S. 0:0(0) ack 1 <mss 1460>
- +0.100 < . 1:1(0) ack 1 win 40000
- +0.000 accept(3, ..., ...) = 4
- +0.100 write(4, ..., 10000) = 10000 ==> 发生10个段
- +0.100 < . 1:1(0) ack 4001 win 30000 ==> ACK 4个
- +0.500 %{ ==> 500ms,强制RTO
- print "ca_state:", tcpi_ca_state ==> 4(Loss)
- print "reordering:", tcpi_reordering ==> 3
- print "lost:", tcpi_lost ==> 6(重传队列全部被标记为 Loss)
- print "retrans:", tcpi_retrans ==> 1,4000-5000被重传
- }%
- +0.000 < . 1:1(0) ack 6001 win 30000 ==> Ack 6001, 这里还有个问题,为什么没有触发Reno的partial Ack后的重传?
- +0.100 %{
- print "ca_state:", tcpi_ca_state ==> 0(立刻离开进入Open???)
- print "reordering:", tcpi_reordering ==> 3
- print "lost:", tcpi_lost ==> 0(重传队列的Loss标记全部被清除,即使还有没被Ack的)
- print "retrans:", tcpi_retrans ==> 0
- }%
复制代码
|
|