客戶端向服務器發送一個SYN置位的TCP報文,其中包含鏈接的初始序列號x和一個窗口大小(表示客戶端上用來存儲從服務器發送來的傳入段的緩衝區的大小)。服務器
服務器收到客戶端發送過來的SYN報文後,向客戶端發送一個SYN和ACK都置位的TCP報文,其中包含它選擇的初始序列號y、對客戶端的序列號的確認x+1和一個窗口大小(表示服務器上用來存儲從客戶端發送來的傳入段的緩衝區的大小)。併發
客戶端接收到服務器端返回的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
TCP的三次握手最主要是防止已過時的鏈接再次傳到被鏈接的主機。同步
若是採用兩次的話,會出現下面這種狀況。it
好比是A機要連到B機,結果發送的鏈接信息因爲某種緣由沒有到達B機;因而,A機又發了一次,結果此次B收到了,因而就發信息回來,兩機就鏈接。io
傳完東西后,斷開。服務器端
結果這時候,原先沒有到達的鏈接信息忽然又傳到了B機,因而B機發信息給A,而後B機就覺得和A連上了,這個時候B機就在等待A傳東西過去。請求
三次握手改爲僅須要兩次握手,死鎖是可能發生通信
考慮計算機A和B之間的通訊,假定B給A發送一個鏈接請求分組,A收到了這個分組,併發送了確認應答分組。按照兩次握手的協定,A認爲鏈接已經成功地創建了,能夠開始發送數據分組。但是,B在A的應答分組在傳輸中被丟失的狀況下,將不知道A是否已準備好,不知道A建議什麼樣的序列號,B甚至懷疑A是否收到本身的鏈接請求分組。在這種狀況下,B認爲鏈接還未創建成功,將忽略A發來的任何數據分組,只等待鏈接確認應答分組。而A在發出的分組超時後,重複發送一樣的分組。這樣就造成了死鎖數據