面試必備TCP三次握手

概念

在進入本篇文章正題之前,需要先了解一下關於TCP連接過程中使用的關鍵字含義。
序列號seq:標記數據段的順序。
TCP把連接中發送的所有數據字節都編上一個序號,第一個字節的編號由本地隨機產生;
給字節編上序號後,就給每一個報文段指派一個序號;序列號seq就是這個報文段中的第一個字節的數據編號。
確認號ack:期待收到對方下一個報文段的第一個數據字節的序號;
序列號表示報文段攜帶數據的第一個字節的編號;而確認號指的是期望接收到下一個字節的編號;因此當前報文段最後一個字節的編號+1即爲確認號。
同步SYN:連接建立時用於同步序號。
當SYN=1,ACK=0時表示:這是一個連接請求報文段。若同意連接,則在響應報文段中使得SYN=1,ACK=1。
SYN=1表示這是一個連接請求,或連接接受報文。
SYN這個標誌位只有在TCP建產連接時纔會被置1,握手完成後SYN標誌位被置0

確認ACK:僅當ACK=1時,確認號字段纔有效。ACK=0時,確認號無效。
終止FIN:表示釋放一個連接。FIN=1,則表示發送方的報文段數據已經發送完畢,並請求斷開連接。

TCP三次握手

在這裏插入圖片描述
第一次握手:客戶端發送syn報文段;該報文段中不包含任何應用層數據,客戶端將SYN置爲1,隨機產生報文段中第一個字節序列號seq=client_seq,並將該報文段封裝到IP數據報中,發送到服務器,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到syn數據報;從該IP數據中提取SYN報文段。服務器將SYN置爲1,ACK=1;其次,服務器設置確認號ack=client_seq+1;最後,服務器隨機產生自己的初始序列號seq=server_seq,即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK數據報;客戶端檢查是否ack,ACK;如果正確,則客戶端將ACK置爲1,確認號ack=server_seq+1;序列號seq=client_seq+1;此時數據連接已經建立完成,將SYN=0;此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。
握手過程中傳送的包裏不包含數據,三次握手完畢後,客戶端與服務器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP連接都將被一直保持下去。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章