TCP/IP 爲何要三次握手

轉自:忘了地址了。

TCP 鏈接是經過三次握手進行初始化的。三次握手的目的是同步鏈接雙方的序列號和確認號並交換 TCP 窗口大小信息。如下步驟概述了一般狀況下客戶端計算機聯繫服務器計算機的過程:
  1. 客戶端向服務器發送一個SYN置位的TCP報文,其中包含鏈接的初始序列號x和一個窗口大小(表示客戶端上用來存儲從服務器發送來的傳入段的緩衝區的大小)。服務器

  2. 服務器收到客戶端發送過來的SYN報文後,向客戶端發送一個SYN和ACK都置位的TCP報文,其中包含它選擇的初始序列號y、對客戶端的序列號的確認x+1和一個窗口大小(表示服務器上用來存儲從客戶端發送來的傳入段的緩衝區的大小)。併發

  3. 客戶端接收到服務器端返回的SYN+ACK報文後,向服務器端返回一個確認號y+1和序號x+1的ACK報文,一個標準的TCP鏈接完成。
    TCP 使用相似的握手過程來結束鏈接。這可確保兩個主機均能完成傳輸並確保全部的數據均得以接收code

TCP Client
Flags
TCP Server
1 Send SYN (seq=x)
----SYN--->
SYN Received
2 SYN/ACK Received 
<---SYN/ACK----
Send SYN (seq=y), ACK (x+1) 
3 Send ACK (y+1)
----ACK--->
ACK Received, Connection Established 
w: ISN (Initial Sequence Number) of the Client
x: ISN of the Server

爲何要三次握手?

  1. TCP的三次握手最主要是防止已過時的鏈接再次傳到被鏈接的主機。同步

    • 若是採用兩次的話,會出現下面這種狀況。it

      1. 好比是A機要連到B機,結果發送的鏈接信息因爲某種緣由沒有到達B機;因而,A機又發了一次,結果此次B收到了,因而就發信息回來,兩機就鏈接。io

      2. 傳完東西后,斷開。服務器端

      3. 結果這時候,原先沒有到達的鏈接信息忽然又傳到了B機,因而B機發信息給A,而後B機就覺得和A連上了,這個時候B機就在等待A傳東西過去。請求

  2. 三次握手改爲僅須要兩次握手,死鎖是可能發生通信

  • 考慮計算機A和B之間的通訊,假定B給A發送一個鏈接請求分組,A收到了這個分組,併發送了確認應答分組。按照兩次握手的協定,A認爲鏈接已經成功地創建了,能夠開始發送數據分組。但是,B在A的應答分組在傳輸中被丟失的狀況下,將不知道A是否已準備好,不知道A建議什麼樣的序列號,B甚至懷疑A是否收到本身的鏈接請求分組。在這種狀況下,B認爲鏈接還未創建成功,將忽略A發來的任何數據分組,只等待鏈接確認應答分組。而A在發出的分組超時後,重複發送一樣的分組。這樣就造成了死鎖數據

相關文章
相關標籤/搜索