TCP三次握手四次揮手詳解

TCP的運(yùn)輸連接管理

TCP是面向連接的協(xié)議。運(yùn)輸連接是用來(lái)傳送TCP報(bào)文的。TCP運(yùn)輸連接的建立和釋放是每一次面向連接的通信中必不可少的過(guò)程。因此,運(yùn)輸連接就有三個(gè)階段即連接建立,數(shù)據(jù)傳送和連接釋放。運(yùn)輸連接的管理就是使運(yùn)輸連接的簡(jiǎn)歷和釋放都能正常地進(jìn)行。
TCP連接建立過(guò)程中要解決以下三個(gè)問(wèn)題:
1)要使每一方能夠確知對(duì)方的存在。
2)要允許雙方協(xié)商一些參數(shù)(如最大窗口值,是否使用窗口擴(kuò)大選項(xiàng)和時(shí)間戳選項(xiàng)以及服務(wù)質(zhì)量等)
3)能夠?qū)\(yùn)輸實(shí)體資源(如緩存大小,連接表中的項(xiàng)目等)進(jìn)行分配。
TCP連接采用客戶服務(wù)器方式。即C/S。

TCP的連接建立

TCP建立連接的過(guò)程叫做握手。握手需要在客戶和服務(wù)器之間交換三個(gè)TCP報(bào)文段。

image.png

假定主機(jī)A運(yùn)行的是客戶端,B運(yùn)行服務(wù)端。最初兩端的TCP進(jìn)程都處于CLOESD狀態(tài)。圖中在主機(jī)下面的方框分別是TCP進(jìn)程所處的狀態(tài)。請(qǐng)注意,在本例中,A主動(dòng)打開(kāi)連接,而B(niǎo)被動(dòng)打開(kāi)連接。
B的TCP服務(wù)器進(jìn)程先創(chuàng)建傳輸控制塊TCB,準(zhǔn)備接受客戶進(jìn)程的連接請(qǐng)求。然后服務(wù)器進(jìn)程就處于LISTEN狀態(tài),等待客戶的連接請(qǐng)求。如有,則作出相應(yīng)。
現(xiàn)在開(kāi)始建立TCP連接。

連接建立的握手環(huán)節(jié)

  • 第一次握手:A將SYN置1,選擇一個(gè)seq=x(序號(hào),起始發(fā)送位)。SYN報(bào)文段不能攜帶數(shù)據(jù),但要消耗掉一個(gè)序號(hào)。這時(shí)TCP進(jìn)程進(jìn)入SYN-SENT(同步已發(fā)送)狀態(tài)。
  • 第二次握手:B收到請(qǐng)求報(bào)文段后,若同意則向A發(fā)送確認(rèn)。在確認(rèn)報(bào)文段中把SYN和ACK都置1,確認(rèn)號(hào)是ack = x+1,同時(shí)也為自己選擇一個(gè)初始序號(hào)seq=y。這個(gè)報(bào)文段也不能攜帶數(shù)據(jù),但同樣要消耗掉一個(gè)序號(hào)。TCP服務(wù)器進(jìn)程進(jìn)入SYN-RCVD(同步收到)狀態(tài)。
  • 第三次握手:TCP客戶進(jìn)程收到B的確認(rèn)后,還要向B給出確認(rèn)。確認(rèn)報(bào)文段的ACK置1(連接建立,兩邊ACK必須全部置1),確認(rèn)號(hào)ack = y+1,而自己的序號(hào)seq = x+1。TCP的標(biāo)準(zhǔn)規(guī)定,ACK報(bào)文段可以攜帶數(shù)據(jù)。但如果不攜帶數(shù)據(jù)則不消耗序號(hào)。在這種情況下,下一個(gè)數(shù)據(jù)報(bào)文段的序號(hào)仍是seq=x+1.這時(shí)TCP連接已經(jīng)建立,A進(jìn)入ESABLISHED(已建立連接)狀態(tài)。

A最后又發(fā)送一次確認(rèn)的原因:防止已經(jīng)失效的連接請(qǐng)求報(bào)文段突然又傳送到了B,因而產(chǎn)生錯(cuò)誤。
產(chǎn)生過(guò)程
1)A發(fā)出請(qǐng)求,但報(bào)文段丟失B未收到。
2)A重新傳輸,收到確認(rèn),建立了連接。數(shù)據(jù)傳輸完畢后釋放。A共發(fā)送了兩個(gè)連接請(qǐng)求報(bào)文段,其中第一個(gè)丟失,第二個(gè)到達(dá)了B。
3)那么此時(shí),有可能連接請(qǐng)求報(bào)文段并沒(méi)有丟失而是滯留在了網(wǎng)絡(luò)節(jié)點(diǎn)中,延誤后到達(dá)了B。此時(shí)它已經(jīng)失效,若B收到以后或許會(huì)誤認(rèn)為A又發(fā)送了一次新的連接請(qǐng)求。于是又第二次握手發(fā)出確認(rèn)報(bào)文段。同意建立連接。
4)由于現(xiàn)在A并沒(méi)有發(fā)出建立連接的請(qǐng)求,因此不會(huì)理睬B的確認(rèn),也不會(huì)向B發(fā)送數(shù)據(jù),但B卻以為新的連接建立了,并一直等待A發(fā)來(lái)數(shù)據(jù)。B的許多資源就這樣浪費(fèi)了。

連接釋放的揮手環(huán)節(jié)

數(shù)據(jù)傳輸結(jié)束雙方都可釋放連接,現(xiàn)在A和B都處于ESTABLISHED(已建立連接)狀態(tài)。


四次揮手.png
  • 第一次揮手:A的應(yīng)用進(jìn)程先向其TCP發(fā)出連接釋放報(bào)文段,并停止再發(fā)送數(shù)據(jù),主動(dòng)關(guān)閉TCP連接(注意此時(shí)關(guān)閉的是與自己客戶端的連接)。FIN置1,序號(hào)seq=u,它等于前面已傳送過(guò)的數(shù)據(jù)的最后一個(gè)字節(jié)的序號(hào)加1。這時(shí)A進(jìn)入FIN-WAIT-1(終止等待1)狀態(tài),等待B的確認(rèn)。請(qǐng)注意,TCP規(guī)定,F(xiàn)IN報(bào)文段即使不攜帶數(shù)據(jù),它也會(huì)消耗掉一個(gè)序號(hào)。(與SYN相同)
  • 第二次揮手:B收到連接釋放報(bào)文段即發(fā)出確認(rèn)。確認(rèn)號(hào)是ack=u+1。而這個(gè)報(bào)文段自己的序號(hào)是v,等于B前面已傳送過(guò)的數(shù)據(jù)的最后一個(gè)字節(jié)的序號(hào)加1.然后B就進(jìn)入CLOSE-WAIT(關(guān)閉等待)狀態(tài)。TCP服務(wù)器進(jìn)程這時(shí)應(yīng)通知高層應(yīng)用進(jìn)程,因而從A到B這個(gè)方向的連接就釋放了,這時(shí)TCP連接處于半關(guān)閉狀態(tài)。即A已經(jīng)沒(méi)有數(shù)據(jù)要發(fā)送了,但B若發(fā)送數(shù)據(jù),A仍然需要接收。也就是說(shuō),從B到A這個(gè)方向的連接并未關(guān)閉。
  • 第三次揮手:A收到來(lái)自B的確認(rèn)后,就進(jìn)入FIN-WAIT2(終止等待2)狀態(tài),等待B發(fā)出的連接釋放報(bào)文段。若B已經(jīng)沒(méi)有要向A發(fā)送的數(shù)據(jù),其應(yīng)用進(jìn)程就通知TCP釋放連接。這時(shí)B發(fā)出的連接釋放報(bào)文段必須FIN=1?,F(xiàn)假定B的序號(hào)為w(在半關(guān)閉狀態(tài)下B可能又發(fā)送了一些數(shù)據(jù),因此與v有一定距離)。B還必須重復(fù)上次已發(fā)送過(guò)的確認(rèn)號(hào)ack=u+1.這時(shí)B就進(jìn)入LAST-ACK(最后確認(rèn))狀態(tài),等待A的確認(rèn)。
  • 第四次揮手:A在收到B的連接釋放報(bào)文段后,必須對(duì)此發(fā)出確認(rèn)。在確認(rèn)報(bào)文段中把ACK置1,確認(rèn)號(hào)為ack=w+1,而自己的序號(hào)是seq=u+1(根據(jù)TCP標(biāo)準(zhǔn),前面發(fā)送過(guò)的FIN報(bào)文段要消耗一個(gè)序號(hào))。然后進(jìn)入到TIME-WAIT(時(shí)間等待)狀態(tài)?,F(xiàn)在TCP還沒(méi)有釋放掉。必須經(jīng)過(guò)時(shí)間等待計(jì)時(shí)器設(shè)置的時(shí)間2MSL后,A才能進(jìn)入到CLOSED狀態(tài)。時(shí)間MSL叫做最長(zhǎng)報(bào)文段壽命。

為什么A在TIME-WAIT狀態(tài)必須等待2MSL的時(shí)間呢?

有兩個(gè)理由:
1)為了保證A發(fā)送的最后一個(gè)ACK報(bào)文段能夠到達(dá)B。這個(gè)ACK報(bào)文段有可能丟失,因而使處在LAST-ACK狀態(tài)的收不到對(duì)己發(fā)送的FIN+ACK報(bào)文段的確認(rèn)。B會(huì)超時(shí)重傳這個(gè)FIN+ACK報(bào)文段,而A就能在2MSL時(shí)間內(nèi)收到這個(gè)重傳的FIN+ACK報(bào)文段。接著A重傳一次確認(rèn),重新啟動(dòng)2MSL計(jì)時(shí)器。
捯飭一下這里面的時(shí)間:

  • A發(fā)送ACK報(bào)文段確認(rèn),丟失,B等待時(shí)間=MSL。
  • B超時(shí)重傳FIN+ACK報(bào)文段,報(bào)文段必在2MSL之內(nèi)傳完,因此A就在時(shí)間等待計(jì)時(shí)器之內(nèi)收到了B的重傳報(bào)文段,此時(shí)再重置時(shí)間等待計(jì)時(shí)器。

如若ACK報(bào)文段無(wú)法傳達(dá),則B服務(wù)器TCP無(wú)法釋放。

2)防止“已失效的連接請(qǐng)求報(bào)文段”出現(xiàn)在本連接中。A在發(fā)送完最后一個(gè)ACK報(bào)文段后,再經(jīng)過(guò)時(shí)間2MSL,就可以使得本連接持續(xù)的時(shí)間所產(chǎn)生的的所有報(bào)文段都從網(wǎng)絡(luò)中消失。這樣下一個(gè)新的連接不會(huì)出現(xiàn)舊的失效的報(bào)文段。

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

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

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