上一篇 Introduction to Computer Networks - Reliable Transmission (上) 中提到了為什麼會需要使用 Reliable Transmission
和 Reliable Transmission
有哪些方式,但任何方式都有好有壞,雖然 Reliable Transmission
可以提供穩定且可靠的傳輸,但也會遇到不少的挑戰,詳細內容就持續望下看吧。
雖然使用 Sliding Window Protocol 可以一次發送多個封包且確保封包能正確收到(Reliable Transmission),但也會有他自己的問題存在。
Negative Acknowledgement (NAK)
Additional Acknowledgement
Selective Acknowledgement
傳統 Ack 模式是當 Receiver 接收到正確的封包時才會發送,如果今天 Receiver 接收到的是損毀的封包,那他也只會拋棄這個封包而持續等待 Sender 發生 Timeout 後的重發,而 Negative Acknowledgement
則是變成當 Receiver 接收到錯誤或是損毀的封包時,也會回傳一個 Ack 給 Sender,帶這個 Ack 代表 Receiver 沒有接收到正確的封包
,當 Sender 接收到表示錯誤的 Ack 後就可以提早重送該封包而不用等到 Timeout。
傳統 Ack 模式下 Receiver 只會發送一個 Ack 表示收到某個 SeqNum
的封包,而 Additional Acknowledgement
則會發送多個 Ack 給 Sender,比如說如果封包 2 遺失了但 Receiver 端只收到了封包 3 那麼 Receiver 就會發送 一組
Ack 表示 Receiver 接收到封包 3 並且 還沒收到封包2
,簡單來說就是 Receiver 不只會發送已收到指定封包的 Ack 還會多送一個用於表示目前接收狀況的 Ack。
如果 Sender 連續發送封包 2, 3, 4, 5, 6,而 Receiver 端只接收到了 3, 4, 5, 6 的話,Receiver 端就只會 選擇性
的發送 Ack 3, 4, 5, 6,而當 Sender 端發現只有封包 2 沒有回傳 Ack 的話,就可以知道封包 2 可能已經損毀或遺失。
要決定適當的 Window size 也是 Sliding window protocol 重要的一點,設定良好的 window size 可以使資料傳輸更順暢
Bandwidth
計算
SeqNum
必須要按照順序(落在非 RWS 中的 SeqNum
皆不會接收),雖然 Receiver 端會丟棄非按照順序的封包,但由於 Sender 端遲遲沒到被 Receiver 端丟棄的風包的 Ack 時也會重送一次(Timeout),所以即使 Receiver 端的 window size 只設定為 1 一樣可以正常工作,只是傳輸速率會比較差。即使 Receiver 端的 window size 設定的比 Sender 端大其實是沒有用的,因為即使 Receiver 端可以接收更多的封包但 Sender 卻沒辦法發送這麽多封包。
封包的 header 中會添加 Sequence Number 作為驗證封包的 id,如果設計的 Sequence Number 小於 Sender 可以發送的封包數量(小於 Sender 端的 window size)那 Sequence Number 就需要 重複使用
為了避免重複使用 Sequence Number 導致 Receiver 端無法辨認封包的問題,那就需要 正在傳遞的封包數量要小於 sequence number 的大小
,為了達到這個目的而定義了一個變數稱為 MaxSeqNum
就適用於設定最多可以使用多少 sequence number,其大小為
雖然以上面的公式設定 MaxSeqNum
可以滿足 RWS = 1 的狀況(Stop and Wait Protocol),但如果一次傳送多個封包的話就會發生問題,比如說如果 sequence number = 0 ~ 7 而 RWS = SWS = 8 - 1 = 7 這樣的條件下會發生什麼
所以如果只把 MaxSeqNum 設定為 SWS + 1 的話就不夠安全可能會發生上述的問題,而比較嚴謹的方式是
如果這樣設定後碰到剛剛的情況會發生什麼?