TCP的三次握手和四次揮手實質(zhì)就是TCP通信的連接和斷開。
三次握手:為了對每次發(fā)送的數(shù)據(jù)量進行跟蹤與協(xié)商,確保數(shù)據(jù)段的發(fā)送和接收同步,根據(jù)所接收到的數(shù)據(jù)量而確認數(shù)據(jù)發(fā)送、接收完畢后何時撤消聯(lián)系,并建立虛連接。
四次揮手:即終止TCP連接,就是指斷開一個TCP連接時,需要客戶端和服務端總共發(fā)送4個包以確認連接的斷開。
?TCP三次握手、四次揮手時序圖
1、三次握手 ? ? ? ?
? ? ? ?TCP協(xié)議位于傳輸層,作用是提供可靠的字節(jié)流服務,為了準確無誤地將數(shù)據(jù)送達目的地,TCP協(xié)議采納三次握手策略。?
三次握手原理:
第1次握手:客戶端發(fā)送一個帶有SYN(synchronize)標志的數(shù)據(jù)包給服務端;
第2次握手:服務端接收成功后,回傳一個帶有SYN/ACK標志的數(shù)據(jù)包傳遞確認信息,表示我收到了;
第3次握手:客戶端再回傳一個帶有ACK標志的數(shù)據(jù)包,表示我知道了,握手結(jié)束。
其中:SYN標志位數(shù)置1,表示建立TCP連接;ACK標志表示驗證字段。
可通過以下趣味圖解理解三次握手:
?
三次握手過程詳細說明:
1、客戶端發(fā)送建立TCP連接的請求報文,其中報文中包含seq序列號,是由發(fā)送端隨機生成的,并且將報文中的SYN字段置為1,表示需要建立TCP連接。(SYN=1,seq=x,x為隨機生成數(shù)值);
2、服務端回復客戶端發(fā)送的TCP連接請求報文,其中包含seq序列號,是由回復端隨機生成的,并且將SYN置為1,而且會產(chǎn)生ACK字段,ACK字段數(shù)值是在客戶端發(fā)送過來的序列號seq的基礎上加1進行回復,以便客戶端收到信息時,知曉自己的TCP建立請求已得到驗證。(SYN=1,ACK=x+1,seq=y,y為隨機生成數(shù)值)這里的ack加1可以理解為是確認和誰建立連接;
3、客戶端收到服務端發(fā)送的TCP建立驗證請求后,會使自己的序列號加1表示,并且再次回復ACK驗證請求,在服務端發(fā)過來的seq上加1進行回復。(SYN=1,ACK=y+1,seq=x+1)。
2、四次揮手
?
? ? ? ? 由于TCP連接是全雙工的,因此每個方向都必須單獨進行關(guān)閉。這原則是當一方完成它的數(shù)據(jù)發(fā)送任務后就能發(fā)送一個FIN來終止這個方向的連接。收到一個 FIN只意味著這一方向上沒有數(shù)據(jù)流動,一個TCP連接在收到一個FIN后仍能發(fā)送數(shù)據(jù)。首先進行關(guān)閉的一方將執(zhí)行主動關(guān)閉,而另一方執(zhí)行被動關(guān)閉。
四次揮手原理:
第1次揮手:客戶端發(fā)送一個FIN,用來關(guān)閉客戶端到服務端的數(shù)據(jù)傳送,客戶端進入FIN_WAIT_1狀態(tài);
第2次揮手:服務端收到FIN后,發(fā)送一個ACK給客戶端,確認序號為收到序號+1(與SYN相同,一個FIN占用一個序號),服務端進入CLOSE_WAIT狀態(tài);
第3次揮手:服務端發(fā)送一個FIN,用來關(guān)閉服務端到客戶端的數(shù)據(jù)傳送,服務端進入LAST_ACK狀態(tài);
第4次揮手:客戶端收到FIN后,客戶端t進入TIME_WAIT狀態(tài),接著發(fā)送一個ACK給Server,確認序號為收到序號+1,服務端進入CLOSED狀態(tài),完成四次揮手。
其中:FIN標志位數(shù)置1,表示斷開TCP連接。
可通過以下趣味圖解理解四次揮手:
?
四次揮手過程詳細說明:
1、客戶端發(fā)送斷開TCP連接請求的報文,其中報文中包含seq序列號,是由發(fā)送端隨機生成的,并且還將報文中的FIN字段置為1,表示需要斷開TCP連接。(FIN=1,seq=x,x由客戶端隨機生成);
2、服務端會回復客戶端發(fā)送的TCP斷開請求報文,其包含seq序列號,是由回復端隨機生成的,而且會產(chǎn)生ACK字段,ACK字段數(shù)值是在客戶端發(fā)過來的seq序列號基礎上加1進行回復,以便客戶端收到信息時,知曉自己的TCP斷開請求已經(jīng)得到驗證。(FIN=1,ACK=x+1,seq=y,y由服務端隨機生成);
3、服務端在回復完客戶端的TCP斷開請求后,不會馬上進行TCP連接的斷開,服務端會先確保斷開前,所有傳輸?shù)紸的數(shù)據(jù)是否已經(jīng)傳輸完畢,一旦確認傳輸數(shù)據(jù)完畢,就會將回復報文的FIN字段置1,并且產(chǎn)生隨機seq序列號。(FIN=1,ACK=x+1,seq=z,z由服務端隨機生成);
4、客戶端收到服務端的TCP斷開請求后,會回復服務端的斷開請求,包含隨機生成的seq字段和ACK字段,ACK字段會在服務端的TCP斷開請求的seq基礎上加1,從而完成服務端請求的驗證回復。(FIN=1,ACK=z+1,seq=h,h為客戶端隨機生成)
至此TCP斷開的4次揮手過程完畢。
為什么要三次握手?
? ? ? ? 三次握手的目的是建立可靠的通信信道,說到通訊,簡單來說就是數(shù)據(jù)的發(fā)送與接收,而三次握手最主要的目的就是雙方確認自己與對方的發(fā)送與接收是正常的。
? ? ? ? 第一次握手:Client 什么都不能確認;Server 確認了對方發(fā)送正常
? ? ? ? 第二次握手:Client 確認了:自己發(fā)送、接收正常,對方發(fā)送、接收正常;Server 確認了:自己接收正常,對方發(fā)送正常
? ? ? ? 第三次握手:Client 確認了:自己發(fā)送、接收正常,對方發(fā)送、接收正常;Server 確認了:自己發(fā)送、接收正常,對方發(fā)送接收正常
? ? ? ? 所以三次握手就能確認雙發(fā)收發(fā)功能都正常,缺一不可。文章來源:http://www.zghlxwxcb.cn/news/detail-675990.html
為什么連接的時候是三次握手,關(guān)閉的時候卻是四次握手?
? ? ? ? 因為當Server端收到Client端的SYN連接請求報文后,可以直接發(fā)送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關(guān)閉連接時,當Server端收到FIN報文時,很可能并不會立即關(guān)閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,“你發(fā)的FIN報文我收到了”。只有等到我Server端所有的報文都發(fā)送完了,我才能發(fā)送FIN報文,因此不能一起發(fā)送。故需要四步握手。文章來源地址http://www.zghlxwxcb.cn/news/detail-675990.html
到了這里,關(guān)于TCP的三次握手四次揮手的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!