1. 程式人生 > >網路通訊協議筆記(四)

網路通訊協議筆記(四)

可靠傳輸的工作原理

1.超時重傳:

每次傳送完一個分組,設定一個超時計時器。如果超時計時器到期之前收到對方的確認,就撤銷已設定的超時計時器。

note:

  • 傳送方在傳送完一個分組,必須暫時保留已傳送的分組的副本(為發生超時重傳使用)。只有收到相應確認才清除暫存的分組副本。
  • 分組和確認分組都必須進行編號。這樣才知道哪一個傳送出去的分組收到了確認。
  • 超時計時器設定的重傳時間應該比資料在分組傳輸的平均往返時間長一點。

還可能出現確認丟失和確認遲到,

有了上述確認和重傳機制,我們可以在不可靠的傳輸網路實現可靠通訊。這種稱為自動重傳請求ARQ。重傳是自動進行,接收方不需請求傳送方重傳某個出錯的分組。

2.滑動視窗

視窗是快取的一部分,用來暫時存放位元組流。傳送方和接收方各有一個視窗,接收方通過 TCP 報文段中的視窗欄位告訴傳送方自己的視窗大小,傳送方根據這個值和其它資訊設定自己的視窗大小。

傳送視窗內的位元組都允許被髮送,接收視窗內的位元組都允許被接收。如果傳送視窗左部的位元組已經發送並且收到了確認,那麼就將傳送視窗向右滑動一定距離,直到左部第一個位元組不是已傳送並且已確認的狀態;接收視窗的滑動類似,接收視窗左部位元組已經發送確認並交付主機,就向右滑動接收視窗。

接收視窗只會對視窗內最後一個按序到達的位元組進行確認,例如接收視窗已經收到的位元組為 {31, 34, 35},其中 {31} 按序到達,而 {34, 35} 就不是,因此只對位元組 31 進行確認。傳送方得到一個位元組的確認之後,就知道這個位元組之前的所有位元組都已經被接收。

傳送方應用程式把位元組流寫入TCP快取,接收方應用程式從TCP接受快取讀取位元組流

TCP流量控制

利用滑動視窗實現。

當rwnd=0時,採用持續計時器打破死鎖。

TCP 擁塞控制

如果網路出現擁塞,分組將會丟失,此時傳送方會繼續重傳,從而導致網路擁塞程度更高。因此當出現擁塞時,應當控制傳送方的速率。這一點和流量控制很像,但是出發點不同。流量控制是為了讓接收方能來得及接收,而擁塞控制是為了降低整個網路的擁塞程度。

TCP 主要通過四個演算法來進行擁塞控制:慢開始、擁塞避免、快重傳、快恢復。

傳送方需要維護一個叫做擁塞視窗(cwnd)的狀態變數,注意擁塞視窗與傳送方視窗的區別:擁塞視窗只是一個狀態變數,實際決定傳送方能傳送多少資料的是傳送方視窗。

1. 慢開始與擁塞避免

傳送的最初執行慢開始,令 cwnd = 1,傳送方只能傳送 1 個報文段;當收到確認後,將 cwnd 加倍,因此之後傳送方能夠傳送的報文段數量為:2、4、8 ...

注意到慢開始每個輪次都將 cwnd 加倍,這樣會讓 cwnd 增長速度非常快,從而使得傳送方傳送的速度增長速度過快,網路擁塞的可能性也就更高。設定一個慢開始門限 ssthresh,當 cwnd >= ssthresh 時,進入擁塞避免,每個輪次只將 cwnd 加 1。

如果出現了超時,則令 ssthresh = cwnd / 2,然後重新執行慢開始。

2. 快重傳與快恢復

在接收方,要求每次接收到報文段都應該對最後一個已收到的有序報文段進行確認。例如已經接收到 M1 和 M2,此時收到 M4,應當傳送對 M2 的確認。

在傳送方,如果收到三個重複確認,那麼可以知道下一個報文段丟失,此時執行快重傳,立即重傳下一個報文段。例如收到三個 M2,則 M3 丟失,立即重傳 M3。

在這種情況下,只是丟失個別報文段,而不是網路擁塞。因此執行快恢復,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注意到此時直接進入擁塞避免。

慢開始和快恢復的快慢指的是 cwnd 的設定值,而不是 cwnd 的增長速率。慢開始 cwnd 設定為 1,而快恢復 cwnd 設定為 ssthresh。