2020-11-13 通俗易懂的解釋--TCP三次握手四次揮手

來自:CSDN,作者:ThinkWon
l鏈接:https://blog.csdn.net/ThinkWon/article/details/104903925

TCP的三次握手四次揮手

TCP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,在發(fā)送數(shù)據(jù)前,通信雙方必須在彼此間建立一條連接。所謂的“連接”,其實是客戶端和服務(wù)端保存的一份關(guān)于對方的信息,如ip地址、端口號等。

TCP可以看成是一種字節(jié)流,它會處理IP層或以下的層的丟包、重復(fù)以及錯誤問題。在連接的建立過程中,雙方需要交換一些連接的參數(shù)。這些參數(shù)可以放在TCP頭部。

一個TCP連接由一個4元組構(gòu)成,分別是兩個IP地址和兩個端口號。一個TCP連接通常分為三個階段:連接、數(shù)據(jù)傳輸、退出(關(guān)閉)。通過三次握手建立一個鏈接,通過四次揮手來關(guān)閉一個連接。

當一個連接被建立或被終止時,交換的報文段只包含TCP頭部,而沒有數(shù)據(jù)。

TCP報文的頭部結(jié)構(gòu)

在了解TCP連接之前先來了解一下TCP報文的頭部結(jié)構(gòu)。

TCP報文的頭部結(jié)構(gòu)

上圖中有幾個字段需要重點介紹下:

(1)序號:seq序號,占32位,用來標識從TCP源端向目的端發(fā)送的字節(jié)流,發(fā)起方發(fā)送數(shù)據(jù)時對此進行標記。

(2)確認序號:ack序號,占32位,只有ACK標志位為1時,確認序號字段才有效,ack=seq+1。

(3)標志位:共6個,即URG、ACK、PSH、RST、SYN、FIN等,具體含義如下:

  • ACK:確認序號有效。

  • FIN:釋放一個連接。

  • PSH:接收方應(yīng)該盡快將這個報文交給應(yīng)用層。

  • RST:重置連接。

  • SYN:發(fā)起一個新連接。

  • URG:緊急指針(urgent pointer)有效。

需要注意的是:

  • 不要將確認序號ack標志位中的ACK搞混了。

  • 確認方ack=發(fā)起方seq+1,兩端配對。

三次握手

三次握手的本質(zhì)是確認通信雙方收發(fā)數(shù)據(jù)的能力

首先,我讓信使運輸一份信件給對方,對方收到了,那么他就知道了我的發(fā)件能力和他的收件能力是可以的。

于是他給我回信,我若收到了,我便知我的發(fā)件能力和他的收件能力是可以的,并且他的發(fā)件能力和我的收件能力是可以。

然而此時他還不知道他的發(fā)件能力和我的收件能力到底可不可以,于是我最后回饋一次,他若收到了,他便清楚了他的發(fā)件能力和我的收件能力是可以的。

這,就是三次握手,這樣說,你理解了嗎?

三次握手
  • 第一次握手:客戶端要向服務(wù)端發(fā)起連接請求,首先客戶端隨機生成一個起始序列號ISN(比如是100),那客戶端向服務(wù)端發(fā)送的報文段包含SYN標志位(也就是SYN=1),序列號seq=100。
  • 第二次握手:服務(wù)端收到客戶端發(fā)過來的報文后,發(fā)現(xiàn)SYN=1,知道這是一個連接請求,于是將客戶端的起始序列號100存起來,并且隨機生成一個服務(wù)端的起始序列號(比如是300)。然后給客戶端回復(fù)一段報文,回復(fù)報文包含SYN和ACK標志(也就是SYN=1,ACK=1)、序列號seq=300、確認號ack=101(客戶端發(fā)過來的序列號+1)。
  • 第三次握手:客戶端收到服務(wù)端的回復(fù)后發(fā)現(xiàn)ACK=1并且ack=101,于是知道服務(wù)端已經(jīng)收到了序列號為100的那段報文;同時發(fā)現(xiàn)SYN=1,知道了服務(wù)端同意了這次連接,于是就將服務(wù)端的序列號300給存下來。然后客戶端再回復(fù)一段報文給服務(wù)端,報文包含ACK標志位(ACK=1)、ack=301(服務(wù)端序列號+1)、seq=101(第一次握手時發(fā)送報文是占據(jù)一個序列號的,所以這次seq就從101開始,需要注意的是不攜帶數(shù)據(jù)的ACK報文是不占據(jù)序列號的,所以后面第一次正式發(fā)送數(shù)據(jù)時seq還是101)。當服務(wù)端收到報文后發(fā)現(xiàn)ACK=1并且ack=301,就知道客戶端收到序列號為300的報文了,就這樣客戶端和服務(wù)端通過TCP建立了連接。

四次揮手

四次揮手的目的是關(guān)閉一個連接

四次揮手

比如客戶端初始化的序列號ISA=100,服務(wù)端初始化的序列號ISA=300。TCP連接成功后客戶端總共發(fā)送了1000個字節(jié)的數(shù)據(jù),服務(wù)端在客戶端發(fā)FIN報文前總共回復(fù)了2000個字節(jié)的數(shù)據(jù)。

  • 第一次揮手:當客戶端的數(shù)據(jù)都傳輸完成后,客戶端向服務(wù)端發(fā)出連接釋放報文(當然數(shù)據(jù)沒發(fā)完時也可以發(fā)送連接釋放報文并停止發(fā)送數(shù)據(jù)),釋放連接報文包含F(xiàn)IN標志位(FIN=1)、序列號seq=1101(100+1+1000,其中的1是建立連接時占的一個序列號)。需要注意的是客戶端發(fā)出FIN報文段后只是不能發(fā)數(shù)據(jù)了,但是還可以正常收數(shù)據(jù);另外FIN報文段即使不攜帶數(shù)據(jù)也要占據(jù)一個序列號。
  • 第二次揮手:服務(wù)端收到客戶端發(fā)的FIN報文后給客戶端回復(fù)確認報文,確認報文包含ACK標志位(ACK=1)、確認號ack=1102(客戶端FIN報文序列號1101+1)、序列號seq=2300(300+2000)。此時服務(wù)端處于關(guān)閉等待狀態(tài),而不是立馬給客戶端發(fā)FIN報文,這個狀態(tài)還要持續(xù)一段時間,因為服務(wù)端可能還有數(shù)據(jù)沒發(fā)完。
  • 第三次揮手:服務(wù)端將最后數(shù)據(jù)(比如50個字節(jié))發(fā)送完畢后就向客戶端發(fā)出連接釋放報文,報文包含F(xiàn)IN和ACK標志位(FIN=1,ACK=1)、確認號和第二次揮手一樣ack=1102、序列號seq=2350(2300+50)。
  • 第四次揮手:客戶端收到服務(wù)端發(fā)的FIN報文后,向服務(wù)端發(fā)出確認報文,確認報文包含ACK標志位(ACK=1)、確認號ack=2351、序列號seq=1102。注意客戶端發(fā)出確認報文后不是立馬釋放TCP連接,而是要經(jīng)過2MSL(最長報文段壽命的2倍時長)后才釋放TCP連接。而服務(wù)端一旦收到客戶端發(fā)出的確認報文就會立馬釋放TCP連接,所以服務(wù)端結(jié)束TCP連接的時間要比客戶端早一些。

常見面試題

為什么TCP連接的時候是3次?2次不可以嗎?

因為需要考慮連接時丟包的問題,如果只握手2次,第二次握手時如果服務(wù)端發(fā)給客戶端的確認報文段丟失,此時服務(wù)端已經(jīng)準備好了收發(fā)數(shù)(可以理解服務(wù)端已經(jīng)連接成功)據(jù),而客戶端一直沒收到服務(wù)端的確認報文,所以客戶端就不知道服務(wù)端是否已經(jīng)準備好了(可以理解為客戶端未連接成功),這種情況下客戶端不會給服務(wù)端發(fā)數(shù)據(jù),也會忽略服務(wù)端發(fā)過來的數(shù)據(jù)。

如果是三次握手,即便發(fā)生丟包也不會有問題,比如如果第三次握手客戶端發(fā)的確認ack報文丟失,服務(wù)端在一段時間內(nèi)沒有收到確認ack報文的話就會重新進行第二次握手,也就是服務(wù)端會重發(fā)SYN報文段,客戶端收到重發(fā)的報文段后會再次給服務(wù)端發(fā)送確認ack報文。

為什么TCP連接的時候是3次,關(guān)閉的時候卻是4次?

因為只有在客戶端和服務(wù)端都沒有數(shù)據(jù)要發(fā)送的時候才能斷開TCP。而客戶端發(fā)出FIN報文時只能保證客戶端沒有數(shù)據(jù)發(fā)了,服務(wù)端還有沒有數(shù)據(jù)發(fā)客戶端是不知道的。而服務(wù)端收到客戶端的FIN報文后只能先回復(fù)客戶端一個確認報文來告訴客戶端我服務(wù)端已經(jīng)收到你的FIN報文了,但我服務(wù)端還有一些數(shù)據(jù)沒發(fā)完,等這些數(shù)據(jù)發(fā)完了服務(wù)端才能給客戶端發(fā)FIN報文(所以不能一次性將確認報文和FIN報文發(fā)給客戶端,就是這里多出來了一次)。

為什么客戶端發(fā)出第四次揮手的確認報文后要等2MSL的時間才能釋放TCP連接?

這里同樣是要考慮丟包的問題,如果第四次揮手的報文丟失,服務(wù)端沒收到確認ack報文就會重發(fā)第三次揮手的報文,這樣報文一去一回最長時間就是2MSL,所以需要等這么長時間來確認服務(wù)端確實已經(jīng)收到了。

如果已經(jīng)建立了連接,但是客戶端突然出現(xiàn)故障了怎么辦?

TCP設(shè)有一個保活計時器,客戶端如果出現(xiàn)故障,服務(wù)器不能一直等下去,白白浪費資源。服務(wù)器每收到一次客戶端的請求后都會重新復(fù)位這個計時器,時間通常是設(shè)置為2小時,若兩小時還沒有收到客戶端的任何數(shù)據(jù),服務(wù)器就會發(fā)送一個探測報文段,以后每隔75秒鐘發(fā)送一次。若一連發(fā)送10個探測報文仍然沒反應(yīng),服務(wù)器就認為客戶端出了故障,接著就關(guān)閉連接。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最近在惡補計算機網(wǎng)絡(luò)方面的知識,之前對于TCP的三次握手和四次分手也是模模糊糊,對于其中的細節(jié)更是渾然不知,最近看...
    秀蘿卜閱讀 293評論 0 0
  • 最近在惡補計算機網(wǎng)絡(luò)方面的知識,之前對于TCP的三次握手和四次分手也是模模糊糊,對于其中的細節(jié)更是渾然不知,最近看...
    微醺歲月閱讀 9,665評論 4 128
  • 久違的晴天,家長會。 家長大會開好到教室時,離放學(xué)已經(jīng)沒多少時間了。班主任說已經(jīng)安排了三個家長分享經(jīng)驗。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,825評論 16 22
  • 創(chuàng)業(yè)是很多人的夢想,多少人為了理想和不甘選擇了創(chuàng)業(yè)來實現(xiàn)自我價值,我就是其中一個。 創(chuàng)業(yè)后,我由女人變成了超人,什...
    亦寶寶閱讀 2,011評論 4 1
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開了第一次的黨會,身份的轉(zhuǎn)變要...
    余生動聽閱讀 10,870評論 0 11

友情鏈接更多精彩內(nèi)容