Content #
很多时候丢的包并不只一个。比如下图中2号和3号包丢失,但1、4、5、6、7、8
号都到达了接收方并触发Ack 2。对于发送方来说,只能通过Ack2知道2号包丢失了,但并不知道还有哪些包丢失。在重传了2号包之后,接下来应该传哪一个呢?

方案1. 不管三七二十一,把3、4、5、6、7、8号等6个包都重传一遍。这个方案简单直接,但是丢一个包的后果就是多个包被重传,效率较低。早期的TCP协议就是这样处理的。
方案2. 接收方收到重传过来的2号包之后,会回复一个Ack3,因此发送方可以推理出3号包也丢了,把它也重传一遍。当接收方收到重传的3号包之后,因为丢包的窟窿都补满了,所以回复一个Ack9,从此发送方就可以传新的包(包号9、10、 11、……)了。这个方案称为NewReno,由RFC2582和RFC3782定义。NewReno在本例中看上去很理想,但我们可以想见当丢包量很大的时候,就需要花费多个RTT (往返时间)来重传所有丢失的包。
方案3. 接收方在Ack 2号包的时候,顺便把收到的包号告诉发送方。所以这些 Ack包应该是这样的:收到4号包时,告诉发送方:“我已经收到4号,请给我2号。”收到5号包时,告诉发送方:“我已经收到4、5号,请给我2号。”收到6号包时,告诉发送方:“我已经收到4、5、6号,请给我2号。”……因此发送方对丢包细节了如指掌,在快速重传了2号包之后,它可以接着传3号,然后再传9号包。这个非常直观的方案称为SACK,由RFC2018定义
From #
Wireshark网络分析就这么简单