我們都知道tcp發(fā)送的消息,如果沒收到ack是會(huì)重傳的澈蟆。
具體是怎么重傳的呢
比如發(fā)送1墨辛,2,3趴俘,4睹簇,5 這5個(gè)包,只有2這個(gè)包沒收到哮幢,發(fā)送端要怎么重傳呢带膀?
沒收到2的時(shí)候,接受方ack一直都是2橙垢,從這個(gè)角度來說垛叨,發(fā)送方其實(shí)是不知道3,4柜某,5這個(gè)幾個(gè)包的情況的嗽元,所以都會(huì)重傳。
答:重傳2喂击,3剂癌,4,5這些包
但是這個(gè)很浪費(fèi)啊翰绊,明明3佩谷,4旁壮,5都收到了的,發(fā)送方還要重傳一遍谐檀。
所以tcp有個(gè)sack機(jī)制
接受方會(huì)返回收到了哪些包抡谐,發(fā)送方就只是發(fā)送2這個(gè)包就可以了。
答:開啟sack的情況下桐猬,只是重傳2這個(gè)包
還有個(gè)問題麦撵,tcp的重傳默認(rèn)是要等一段時(shí)間的,這個(gè)時(shí)間就是RTO溃肪,RTO的計(jì)算比較復(fù)雜免胃,可以大概認(rèn)為和rtt相關(guān),是個(gè)相對(duì)比較長(zhǎng)的時(shí)間了惫撰。
有不有更快的解決方法呢羔沙,畢竟丟包是比較低概率的事情。
快速重傳:
發(fā)送方連續(xù)收到3次相同的ack润绎,這個(gè)時(shí)候即使超時(shí)定時(shí)器還沒有超時(shí)撬碟,也開始啟動(dòng)重傳诞挨。