網絡信道不可靠的點
1. 數據在傳輸的過程中有可能會受損(上一篇文章說明了如何解決這個問題)
2. 數據在傳輸的過程中有可能會丟失(本文說明如何解決這個問題)
傳輸層的可靠性協議就是解決上面兩個問題的。
消除NAK,用ACK代替NAK
在上一篇文章中如果接收方檢測數據有失真,直接回復一個NAK給發送方,當發送方收到NAK之后對數據進行重新傳遞,從而實現可靠性傳輸,如下圖所示。
在上一篇文章的最后對每一次發送的數據引入了序列號,在序列號的基礎上可以用ACK來代替NAK,徹底在數據傳輸過程中移除NAK。
- 如果接收方檢查數據沒有損失,則直接ack當前數據的序列號
- 如果接收方檢查數據有損失,則直接ack上次成功接受的數據的序列號。
- 發送方如果收到的ack序列號和期望的不一致,則說明數據有損,直接重傳
具體如下圖所示。
數據在傳輸過程中丟失怎么處理
信道不穩定,或者路由器的緩存滿了等都有可能導致傳輸的數據丟失。、
具體到可靠性傳輸有兩種類型的數據丟失:
- 數據本身丟失
- ACK丟失
這兩種丟失都可以交給發送方進行處理:重傳。
具體實現是在發送方設置一個定時器,當數據發送出去后,開啟定時器,在給定的實際內(比如一個RTT)如果沒有收到ACK,則認為超時,這個時候發送方啟動重傳。
數據本身丟失
數據再傳輸過程中丟失了,超時沒有收到ack后發送方進行重新傳遞。
ACK丟失
ack丟失對於發送方來說和數據本身丟失是一樣的,都是重新傳送。
但是對於接收方來說,因為已經收到了數據,需要做冗余檢測,只需要簡單返回ack即可。
提前超時
提前超時,對於接收方來說,需要做冗余檢測 ,只需返回ack。對發送方,也會收到一個冗余的ack,直接忽略。