2018年4月29日 星期日

TCP學習筆記


ARQ

在傳輸層以下的底層通道可能會造成封包位元錯誤(由於封包傳輸,傳播,暫存在網路中的實體元件)的時候,我們可以和接電話一樣想像如何確保資訊正確:

使用肯定/否定確認(Positive Acknowledge),以此建立具重送機制的自動重複請求(Automatic Repeat Request, ARQ)協定。
因為這種機制的關係,ARQ協定需要三種額外的功能:

1.錯誤偵測:檢查位元錯誤(ex:UDP checksum欄位)。
2.接收端回饋:ACK, NAK,通常僅需要一個位元(ex: 0 for NAK, 1 for ACK)。
3.重送:經過以上的偵測後如果有問題,就要有重送的功能。

可靠連線

序號(sequence number)欄位可以用來編號封包,除了可以解決ACK/NAK封包可能損毀的問題,也讓協定的接收端可以確定封包是否為重送。

接收端送出重複的ACK(duplicate ACK)可以用來代替送出NAK,讓傳送端知道該ACK標註的封包序號之後的封包並未被接收到(P3-26, rdt2.2)。

計時器可以處理封包的逾時並重送。主要觸發條件可能是封包遺失,也可能是傳輸延遲過長。

TCP連線

連線狀態存在於終端系統上,而不會在中介網路元件(路由器, L2 switch..)上。
這種連線是一種點到點(point-to-point)的全雙工服務(full-duplex service)。

TCP連線管理

假設用戶端應用程式行程想跟伺服端上的某筆行程建立連線,以下為步驟:
  1. 用戶端TCP會先傳送一筆不含應用層資料的TCP區段,其SYN bit會被設為1,因此這種特殊區段又被稱作SYN區段。同時用戶端會隨機選擇一個初始序號(client_isn)並放入SYN區段的序號欄位。
  2. 當包含此區段的IP資料報抵達伺服端主機,伺服端就會取出SYN區段,配置TCP緩衝區與變數給這筆連線,然後送出一筆也不包含應用層資料的SYNACK區段,其標頭有3項重要資訊:

    • SYN bit被設為1
    • 確認欄位被設為client_isn+1
    • 序號欄位會設為伺服端自己的初始序號(server_isn)
    • 其意義為:「我已經收到要求開啟連線的SYN封包,其序號為client_isn。我同意建立此連線,並且決定我的初始序號為server_isn。
  3.  當用戶端收到SYNACK封包,也會配置TCP緩衝區與變數,並送出具以下標頭的確認區段:
  • SYN bit被設為0(因為連線已經建立)
  • 確認欄位被設為server_isn+1
  • 在此區段中可能就會有給伺服端的資料
在以上三步驟完成之後,未來所有的區段的SYN bit都會設為0。由於會互相傳送三份封包來建立連線,此程序又被稱為三向交握(three-way handshake)。





沒有留言:

張貼留言