TCP三次握手&四次揮手


TCP概述

網絡分為IOS七層協議:物理層、數據鏈路層、網絡層、傳輸層、會話層、表現層、應用層

TCP協議屬於傳輸層的協議

TCP數據包結構圖

在進行握手時,就依賴着結構中的序號確認號

TCP中的標識符

SYN:同步標志

同步序列編號(Synchronize Sequence Numbers)欄有效。該標志僅在三次握手建立TCP連接時有效。它提示TCP連接的服務端檢查序列編號,該序列編號為TCP連接初始端(一般是客戶端)的初始序列編號。在這里,可以把TCP序列編號看作是一個范圍從0到4,294,967,295的32位計數器。通過TCP連接交換的數據中每一個字節都經過序列編號。在TCP報頭中的序列編號欄包括了TCP分段中第一個字節的序列編號

ACK:確認標志

確認編號(Acknowledgement Number)欄有效。大多數情況下該標志位是置位的。TCP報頭內的確認編號欄內包含的確認編號(w+1,Figure-1)為下一個預期的序列編號,同時提示遠端系統已經成功接收所有數據

URG:緊急標志

緊急(The urgent pointer) 標志有效,緊急標志置位

FIN:結束標志

帶有該標志置位的數據包用來結束一個TCP會話,但對應端口仍處於開放狀態,准備接收后續數據
三次握手Three-way Handshake

三次握手

一個虛擬連接的建立是通過三次握手實現的

示意圖

三次握手流程

  1. B的TCP服務器進程先創建傳輸模塊TCB,准備接受客戶進程的連接請求。然后服務器進程就處於LISTEN(收聽)狀態,等待客戶的連接請求
  2. 第一次握手:A的TCP客戶進程也是首先創建傳輸控制模塊TCB,然后向B發出連接請求報文段,此時首部中的同部位SYN = 1,同時選擇一個初始序號seq = x(這個指令的意思就是告訴B客戶機自己的序號是多少,要接着這個序號發送數據報)。TCP規定,SYN報文段(即SYN = 1的報文段)不能攜帶數據,但是要消耗一個需要。此時TCP客戶進程進入SYN-SENT(同步已發送)狀態
  3. 第二次握手:B收到連續請求報文段后,如同意建立連接,則向A發送確認。在確認報文段中應把SYN位和ACK位都置為1,確認號是ack = x + 1,同時自己也為自己選擇一個初始序號 seq = y。(注意:這個報文段也不能攜帶數據,但同樣需要消耗掉一個序號)。這時TCP服務器進程進入SYN-REVD(同步收到)狀態
  4. 第三次握手:TCP客戶進程收到B的確認后,還要向B給出確認。確認報文段的ACK置1,確認號ack = y + 1,而自己的序號seq = x + 1。TCP的標准規定,ACK報文段可以攜帶數據。但如果不攜帶數據則不消耗序號,在這種情況下,下一個數據報文段的序號仍是 seq = x + 1。這時,TCP連接建立,A進入ESTABLISHED(已建立連接)狀態,當B收到A的確認消息后,也進入ESTABLISHED狀態

注:最后一次握手在默認不攜帶數據的情況下,由於SYN不是1,是不消耗序列號的。所以三次握手結束后,客戶端下一個發送的報文中seq依舊是x + 1

為什么需要三次握手,而非兩次?

  • 為了實現可靠數據傳輸, TCP 協議的通信雙方, 都必須維護一個序列號, 以標識發送出去的數據包中, 哪些是已經被對方收到的。 三次握手的過程即是通信雙方相互告知序列號起始值, 並確認對方已經收到了序列號起始值的必經步驟
  • 如果只是兩次握手, 至多只有連接發起方的起始序列號能被確認, 另一方選擇的序列號則得不到確認

四次揮手

一個虛擬連接的斷開是通過四次揮手實現的

示意圖:

四次揮手流程:

  1. 第一次揮手:A數據傳輸關閉,需要斷開連接,A應用進程向其TCP發出連接釋放報文段(FIN = 1, seq = u),並停止在發送數據,主動關閉TCP連接,進入FIN-WAIT-1狀態,等待B的確認
  2. 第二次揮手:B收到連接釋放報文后即發出確認報文段(ACK = 1,確認號ack = u + 1,序列號seq = v),B進入CLOSE-WAIT關閉等待狀態,此時的TCP處於半關閉狀態,A到B的連接釋放。而A收到B的確認后,進入FIN-WAIT-2狀態,等待B發出的連接釋放報文段
  3. 第三次揮手:當B數據傳輸完畢,B發出連接釋放報文段(FIN = 1ACK = 1,序號seq = u + 1,確認號 ack = u + 1),B進入LAST-ACK(最后確認)狀態,等待A的最后確認
  4. 第四次揮手:A收到B的連接釋放報文段后,對此發出確認報文段(ACK = 1seq = u + 1ack = w + 1),A進入TIME-WAIT(時間等待)狀態,此時TCP未釋放掉,需要經過時間等待計時器設置的時間2MSL后,A才進入CLOSE狀態

為什么A在TIME-WAIT狀態必須等待2MSL(最大報文生存時間)的時間?

為了保證A發送的最后一個ACK報文段能夠到達B,保證A、B正常進入CLOSED狀態

這個ACK報文段有可能丟失,使得處於LAST-ACK狀態的B收不到對已發送的FIN+ACK報文段的確認,B超時重傳FIN+ACK報文段,A能2MSL時間內收到這個重傳的FIN+ACK報文段,接着A重傳一次確認,同時重啟2MSL計數器,2MSL時間后A和B進入CLOSE狀態,如果A在TIME-WAIT狀態時接收到B的FIN+ACK報文段之后向B發出確認報文段,而不再確認B是否收到立即進入CLOSED狀態,如若B並沒有正常收到A 的確認報文段,則B無法正正常進入到CLOSED狀態


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM