1. 程式人生 > >360服務端開發工程師面試題:TCP的三次握手

360服務端開發工程師面試題:TCP的三次握手

TCP是面向連線的協議。運輸連線是用來傳送TCP報文的。TCP運輸連線的建立與釋放是每一次面向連線的通訊中必不可少的過程。因此,運輸連線就有三個階段,即連線建立、資料傳送、連線釋放

在TCP連線建立過程中要解決以下幾個問題:

(1)要使每一方能夠確知對方的存在。

(2)要允許雙方協商一些引數(如最大視窗值、是否使用視窗擴大選項和時間戳選項及服務質量等)。

(3)能夠對運輸實體資源(如快取大小、連線表中的專案等)進行分配。

TCP連線的建立採用客戶伺服器方式。主動發起連線建立的程序叫做客戶。被動等待連線建立的應用程序叫做伺服器。

TCP建立連線的過程叫做握手,握手需要在客戶和伺服器之間交換三個TCP報文段。

假定A主機執行的是TCP客戶程式,而B執行TCP伺服器程式。最初兩端的TCP程序都處於CLOSED(關閉)狀態。在本例中,A主動開啟連線,而B被動開啟連線。

一開始,B的TCP伺服器程序先建立傳輸控制塊TCB,準備接受客戶程序的連線請求。然後伺服器程序就處於LISTEN(收聽)狀態,等待客戶程序的連線請求,如有,即作出響應。

A的TCP客戶程序也是首先建立傳輸控制塊TCB,然後在打算建立TCP連線時,向B發出連線請求報文段。這時首部中的同步位SYN=1,同時選擇一個初始序號seq=x,TCP規定,SYN報文段(即SYN=1的報文段)不能攜帶資料,但要消耗掉一個序號。這時,TCP客戶程序進入SYN-SENT(同步已傳送)狀態

B收到連線請求報文段後,如同意建立連線,則向A傳送確認,在確認報文段中應把SYN位和ACK位都置1,確認號是ack=x+1,同時也為自己選擇一個序號seq=y,這個報文段也不能攜帶資料,但同樣要消耗掉一個序號,這時TCP伺服器程序進入SYN-RCVD(同步收到)狀態。

TCP客戶程序收到B的確認之後,還要向B給出確認,確認報文段的ACK置1,確認號ACK=y+1,而自己的序號seq=x+1。TCP的標準規定,ACK報文段可以攜帶資料,但如果不攜帶資料則不消耗序號。在這種情況下,下一個資料報文段的序號仍是seq=x+1。這時TCP連線已經建立,A進入ESTABLISHED(已建立連線)狀態。

當B收到A的確認後,也進入ESTABLISHED狀態。

以上的連線建立過程叫做三報文握手。