第一次握手:Client將標誌位SYN置爲1,隨機產生一個值seq=J,並將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。服務器
第二次握手: Server 收到數據包後由標誌位 SYN=1 知道 Client 請求創建鏈接, Server 將標誌位 SYN 和 ACK 都置爲 1 , ack=J+1 ,隨機產生一個值 seq=K ,並將該數據包發送給 Client 以確認鏈接請求, Server 進入 SYN_RCVD 狀態。spa
第三次握手: Client 收到確認後,檢查 ack 是否爲 J+1 , ACK 是否爲 1 ,若是正確則將標誌位 ACK 置爲 1 , ack=K+1 ,並將該數據包發送給 Server , Server 檢查 ack 是否爲 K+1 , ACK 是否爲 1 ,若是正確則鏈接創建成功, Client 和 Server 進入 ESTABLISHED 狀態,完成三次握手,隨後 Client 與 Server 之間能夠開始傳輸數據了。3d
簡單來講,就是blog
創建鏈接時,客戶端發送SYN包(SYN=i)到服務器,並進入到SYN-SEND狀態,等待服務器確認。it
服務器收到 SYN 包,必須確認客戶的 SYN ( ack=i+1 ) , 同時本身也發送一個 SYN 包( SYN=k ) , 即 SYN+ACK 包,此時服務器進入 SYN-RECV 狀態。請求
客戶端收到服務器的 SYN+ACK 包,向服務器發送確認報 ACK ( ack=k+1 ) , 此包發送完畢,客戶端和服務器進入 ESTABLISHED 狀態,完成三次握手,客戶端與服務器開始傳送數據。im
第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。數據
第二次揮手: Server 收到 FIN 後,發送一個 ACK 給 Client ,確認序號爲收到序號 +1 (與 SYN 相同,一個 FIN 佔用一個序號), Server 進入 CLOSE_WAIT 狀態。客戶端
第三次揮手: Server 發送一個 FIN ,用來關閉 Server 到 Client 的數據傳送, Server 進入 LAST_ACK 狀態。db
第四次揮手: Client 收到 FIN 後, Client 進入 TIME_WAIT 狀態,接着發送一個 ACK 給 Server ,確認序號爲收到序號 +1 , Server 進入 CLOSED 狀態,完成四次揮手。