TCP-三次握手和四次揮手簡單理解
背景:TCP,即傳輸控制協(xié)議,是一種面向連接的可靠的,基于字節(jié)流的傳輸層協(xié)議。作用是在不可靠的互聯(lián)網(wǎng)絡(luò)上提供一個可靠的端到端的字節(jié)流服務(wù),為了準(zhǔn)確無誤的將數(shù)據(jù)送達(dá)目的地,TCP協(xié)議采納三次握手策略。
一、TCP報文
TCP報文格式圖:

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

PS:ACK、SYN和FIN這些大寫的單詞表示標(biāo)志位,其值要么是1,要么是0;ack、seq小寫的單詞表示序號。
標(biāo)志位:

注意:不要將確認(rèn)序號ack與標(biāo)志位中的ACK搞混了。
二、三次握手(Three-Way Handshake)
原理:
第一次握手:建立連接是,客戶端發(fā)送syn包(syn=x)到服務(wù)器,并進(jìn)入SYN_SENT狀態(tài),等待服務(wù)器確認(rèn);SYN:同步序列號。
第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=x+1),同時自己也發(fā)送一個SYN包(syn=y),即SYN+ACK包,此時服務(wù)器進(jìn)入SYN_RECV狀態(tài)。
第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=y+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED(TCP連接成功)狀態(tài),完成三次握手。

為什么要三次握手?
三次握手的最主要目的是「雙方確認(rèn)自己與對方的發(fā)送與接收是正常的」。
第一次握手:Client什么都不能確認(rèn);Server確認(rèn)了對方發(fā)送正常。
第二次握手:Client確認(rèn)了:自己發(fā)送、接收正常,對方發(fā)送、接收正常;Server確認(rèn)了:自己接受正常,對方發(fā)送正常。
第三次握手:Client確認(rèn)了:自己發(fā)送、接受正常,對方發(fā)送,接受正常;Server確認(rèn)了:自己發(fā)送了、接受正常,對方發(fā)送、接受正常。
所以三次握手就能確認(rèn)雙方收發(fā)功能是否正常。
通俗的說法:
Client:喂!聽的到嗎?
Server:可以,我聽的到。
Client:好的,我們都能互相聽的對方的話,可以開始通信了。
三次握手為什么不用兩次,或者四次?
因為只有三次才最合適,三次通信是最小值,兩次通信無法確認(rèn)雙方收發(fā)功能的正常,而四次通信則顯得有些冗余。
三、四次揮手(Four-Way Wavehand)
意義:所謂四次揮手,即終止TCP連接,就是指斷開一個TCP連接時,需要客戶端和服務(wù)的總共發(fā)送4個包以確認(rèn)連接到斷開。在socket編程中,這一過程由客戶端或服務(wù)的任意一方執(zhí)行close來觸發(fā),流程如下圖所示:

由于TCP連接時是全雙工的,因此,每個方向都必須要單獨進(jìn)行關(guān)閉,這一原則是主動方完成數(shù)據(jù)發(fā)送任務(wù)后,發(fā)送一個FIN來終止主動方發(fā)送數(shù)據(jù)的連接,收到一個FIN只是意味著這一方向上沒有數(shù)據(jù)流動來,即不會再收到主動方的數(shù)據(jù),但是在這個TCP連接上被動方仍然能夠發(fā)送數(shù)據(jù),直到被動方也發(fā)送了FIN。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動關(guān)閉,而另一方則執(zhí)行被動關(guān)閉。
原理:
第一次揮手:Client發(fā)送一個FIN,用來關(guān)閉CIient到Server的數(shù)據(jù)傳輸,Client進(jìn)入FIN_WAIT_1狀態(tài)。
第二次揮手:Server收到FIN后,發(fā)送一個ACK給Client,確認(rèn)序號為收到,序號+1(與SYN相同,一個FIN占用一個序號),Server進(jìn)入CLOSE_WAIT狀態(tài)。
第三次揮手:Server發(fā)送一個FIN,用來關(guān)閉Server到Client的數(shù)據(jù)傳輸,Server進(jìn)入LAST_ACK狀態(tài)。
第四次揮手:Client收到FIN后,Client進(jìn)入TIME_WAIT狀態(tài),接著發(fā)送一個ACK給Server,確認(rèn)序號為收到,序號+1,Server進(jìn)入CLOSED狀態(tài),完成四次揮手。

通俗的說法:
Client:我已經(jīng)說完了。
Server:我收到了,等等我,我還沒說完。
Server:好了,我也說完了。
Client:好的,那我們通信結(jié)束。
上面是一方主動關(guān)閉,另一方被動關(guān)閉的情況,實際中還會出現(xiàn)同時發(fā)起關(guān)閉的情況,如下圖所示:

為什么建立連接是三次握手,而關(guān)閉連接卻是四次揮手呢?
這是因為服務(wù)端在LISTEN狀態(tài)下,收到建立連接請求的SYN報文后,把ACK和SYN放在一個報文里發(fā)送給客戶端。而關(guān)閉連接是,當(dāng)收到對方的FIN報文是,僅僅表示對方不再發(fā)送數(shù)據(jù)了,但是還能接收數(shù)據(jù),已方也未必全部數(shù)據(jù)都發(fā)送給對方了,所以已方可以立即close,也可以發(fā)送一些數(shù)據(jù)給對方后,再發(fā)送FIN報文給對方來表示同意現(xiàn)在關(guān)閉連接,因此,已方ACK和FIN一般都會分開發(fā)送。
原文鏈接:https://www.cnblogs.com/Monste/p/13396333.html#/