- 論壇徽章:
- 1
|
本帖最后由 goingstudy 于 2018-06-15 20:40 編輯
假設不用SACK和Timestamp選項,在發(fā)生RTO后,Linux 是把重傳隊列全標記為丟失:
- tcp_retransmit_timer()
- tcp_enter_loss()
- tcp_timeout_mark_lost()
復制代碼 如果隨后的ACK 應答了RTO的段,是會把重傳隊列全部恢復嗎(刪除重傳標記,進入Open狀態(tài)),這個代碼是在哪里做的?
這個我用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 ==> 發(fā)生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, 這里還有個問題,為什么沒有觸發(fā)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
- }%
復制代碼
|
|