TCP三次握手與四次揮手過程解析

TCP三次握手和四次揮手的全過程

     TCP是主機對主機層的傳輸控制協議,提供可靠的連接服務,採用三次握手確認建立一個連接:

位碼即tcp標誌位,6種表示:

SYN(synchronous建立連接)

ACK(acknowledgement 表示響應、確認)

PSH(push表示有DATA數據傳輸)

FIN(finish關閉連接)

RST(reset表示連接重置)

URG(urgent緊急指針字段值有效)


三次握手:


第一次握手:客戶端發送syn(syn=x)到服務器,並進入SYN_SEND狀態,等待服務器確認;

第二次握手:服務器收到syn包,必須確認客戶的SYNack=x+1),同時自己也發送一個SYN包(syn=y),即SYN+ACK包,此時服務器進入SYN_RECV狀態;

第三次握手:客戶端收到服務器的SYNACK包,向服務器發送確認包ACK(ack=y+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。

      握手過程中傳送的包裏不包含數據,三次握手完畢後,客戶端與服務器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP 連接都將被一直保持下去。

      確認號:其數值等於發送方的發送序號+1(即接收方期望接收的下一個序列號)


四次揮手:


與建立連接的三次握手類似,斷開一個TCP連接則需要四次揮手

第一次揮手:主動關閉方發送一個FIN,用來關閉主動方到被動關閉方的數據傳送,也就是主動關閉方告訴被動關閉方:我已經不會再給你發數據了(當然,在fin包之前發送出去的數據,如果沒有收到對應的ack確認報文,主動關閉方依然會重發這些數據),但是,此時主動關閉方還可以接受數據。

第二次揮手:被動關閉方收到FIN包後,發送一個ACK給對方,確認序號爲收到序號+1(與SYN相同,一個FIN佔用一個序號)。
第三次揮手:被動關閉方發送一個FIN,用來關閉被動關閉方到主動關閉方的數據傳送,也就是告訴主動關閉方,我的數據也發送完了,不會再給你發數據了。

第四次揮手:主動關閉方收到FIN後,發送一個ACK給被動關閉方,確認序號爲收到序號+1,至此,完成四次揮手。


爲什麼要三次握手?

  • 如果只有一次握手,Client不能確定與Server的單向連接,更加不能確定Server與Client的單向連接;
  • 如果只有兩次握手,Client確定與Server的單向連接,但是Server不能確定與Client的單向連接;
  • 只有三次握手,Client與Server才能相互確認雙向連接,實現雙工數據傳輸。

爲什麼要四次揮手?

“三次握手”的第二次握手發送SYN+ACK迴應第一次握手的SYN,但是“四次揮手”的第二次揮手只能發送ACK迴應第一次揮手的FIN,因爲此時Server可能還有數據傳輸給Client,所以Server傳輸數據完成後才能發起第三次揮手發送FIN給Client,等待Client的第四次揮手ACK。

發佈了71 篇原創文章 · 獲贊 76 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章