日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

tcp状态机-三次握手-四次挥手以及常见面试题

發(fā)布時(shí)間:2024/8/23 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tcp状态机-三次握手-四次挥手以及常见面试题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

TCP狀態(tài)機(jī)介紹

在網(wǎng)絡(luò)協(xié)議棧中,目前只有TCP提供了一種面向連接的可靠性數(shù)據(jù)傳輸。而可靠性,無(wú)非就是保證,我發(fā)給你的,你一定要收到。確保中間的通信過(guò)程中,不會(huì)丟失數(shù)據(jù)和亂序。在TCP保證可靠性數(shù)據(jù)傳輸?shù)膶?shí)現(xiàn)來(lái)看,超時(shí)重傳、序列號(hào)及數(shù)據(jù)的應(yīng)答 這三個(gè)特征 就是實(shí)現(xiàn)可靠性的最基本保證,而對(duì)于tcp窗口大小等等設(shè)置,也是保證可靠性的一個(gè)方面。所有的目的只為一個(gè),保證傳輸數(shù)據(jù)的完整性。為了解決傳輸線路的不穩(wěn)定性造成數(shù)據(jù)包的丟失情況,tcp 使用了發(fā)送方超時(shí)重傳和接收方數(shù)據(jù)應(yīng)答的策略。概括而言,就是一種“狀態(tài)協(xié)議“,保證通信雙方數(shù)據(jù)收發(fā)的一致性。

  • TCP_CLOSE:關(guān)閉狀態(tài),一個(gè)新建的TCP socket 會(huì)處于該狀態(tài)。
  • TCP_LISTEN: 監(jiān)聽(tīng)狀態(tài),一般服務(wù)器端套接字在調(diào)用Listen系統(tǒng)調(diào)用后即處于該狀態(tài)。
  • TCP_SYN_SENT:同步信號(hào)已經(jīng)發(fā)送狀態(tài),這個(gè)狀態(tài)一般是指客戶端發(fā)送SYN(建立連接的同步)數(shù)據(jù)包后所處的狀態(tài)(tcp三次握手的第一個(gè)包)。在接收到遠(yuǎn)端服務(wù)器端的應(yīng)答后,即從該狀態(tài)進(jìn)入TCP_ESTABLISHED狀態(tài)。
  • TCP_SYN_RECEIVED:同步信號(hào)已經(jīng)接受狀態(tài),服務(wù)器端在接受到遠(yuǎn)端客戶端SYN數(shù)據(jù)包后,進(jìn)行相應(yīng)的處理(創(chuàng)建通信套接字等),然后發(fā)送應(yīng)答數(shù)據(jù)包(tcp三次握手的第二個(gè)包),并將新創(chuàng)建的通信套接字狀態(tài)設(shè)置為TCP_SYN_RECEIVED,在接受到客戶端的應(yīng)答后,即進(jìn)入TCP_ESTABLISED狀態(tài)。
  • TCP_ESTABLISED:建立連接狀態(tài),這是雙方進(jìn)行正常通信所處的狀態(tài)。
  • TCP_FIN_WAIT_1:本地發(fā)送FIN(用于結(jié)束連接的)數(shù)據(jù)包后即可進(jìn)入該狀態(tài),等待對(duì)方的應(yīng)答。一般一端發(fā)送完其所要發(fā)送的數(shù)據(jù)后,即可發(fā)送FIN數(shù)據(jù)包,此時(shí)發(fā)送通道被關(guān)閉,但仍可繼續(xù)接受遠(yuǎn)端發(fā)送的數(shù)據(jù)包。在接受到遠(yuǎn)端發(fā)送的對(duì)于FIN數(shù)據(jù)包的應(yīng)答后,將進(jìn)入TCP_FIN_WAIT_2狀態(tài)。
  • TCP_FIN_WAIT_2:進(jìn)入該狀態(tài)表示本地已經(jīng)接受到遠(yuǎn)端發(fā)送的對(duì)于本地之前發(fā)送的FIN數(shù)據(jù)包的應(yīng)答。進(jìn)入該狀態(tài)后,本地仍然可以繼續(xù)接受遠(yuǎn)端發(fā)送給本地的數(shù)據(jù)包。在接受到遠(yuǎn)端發(fā)送的FIN數(shù)據(jù)包后(表示遠(yuǎn)端也已經(jīng)發(fā)送完數(shù)據(jù)),本地將發(fā)送一個(gè)應(yīng)答數(shù)據(jù)包,并進(jìn)入TCP_TIME_WAIT狀態(tài)。TCP_TIME_WAIT狀態(tài)存在的時(shí)間被稱為2MSL時(shí)間,這一方面是為避免本地發(fā)送的應(yīng)答數(shù)據(jù)包丟失,另一方面避免一個(gè)新創(chuàng)建的套接字接收到舊套接字中遺留的數(shù)據(jù)包。
  • TCP_TIME_WAIT:該轉(zhuǎn)狀態(tài)唄稱為2MSL等待狀態(tài)。如果在此期間接收到遠(yuǎn)端發(fā)送的FIN數(shù)據(jù)包,則表示之前在TCP_FIN_WAIT_2狀態(tài)發(fā)送的ACK應(yīng)答數(shù)據(jù)包在傳輸中丟失或者長(zhǎng)時(shí)間被延遲,從而造成了遠(yuǎn)端重新發(fā)送了FIN數(shù)據(jù)包,此時(shí)重復(fù)ACK應(yīng)答數(shù)據(jù)包。一旦2MSL時(shí)間到期,則將進(jìn)入TCP_CLOSED狀態(tài),即完成關(guān)閉操作。
  • TCP_CLOSE_WAIT:該狀態(tài)存在于后關(guān)閉的一端。當(dāng)接收到遠(yuǎn)端發(fā)送的FIN數(shù)據(jù)包后,本地發(fā)送一個(gè)ACK應(yīng)答數(shù)據(jù)包,并將該套接字狀態(tài)從TCP_ESTABLISED設(shè)置為TCP_CLOSE_WAIT。本地可以繼續(xù)向遠(yuǎn)端發(fā)送數(shù)據(jù)包,在發(fā)送完所有的數(shù)據(jù)后,本地將發(fā)送一個(gè)FIN數(shù)據(jù)包關(guān)閉本地發(fā)送通道,并將狀態(tài)設(shè)置為TCP_LAST_ACK狀態(tài),等待遠(yuǎn)端對(duì)FIN數(shù)據(jù)包的應(yīng)答數(shù)據(jù)包。
  • TCP_CLOSING:如果通信雙方同時(shí)發(fā)送FIN數(shù)據(jù)包,則同時(shí)進(jìn)行關(guān)閉操作,則雙方將同時(shí)進(jìn)入TCP_CLOSING狀態(tài)。具體的,本地發(fā)送一個(gè)FIN數(shù)據(jù)包以結(jié)束本地?cái)?shù)據(jù)包發(fā)送,如果在等待應(yīng)答期間,接收到遠(yuǎn)端發(fā)送的FIN數(shù)據(jù)包,則本地將狀態(tài)設(shè)置為TCP_CLOSING狀態(tài)。在接收到應(yīng)答后,再繼續(xù)裝入到TCP_CLOSE_WAIT狀態(tài)。
  • TCP_LAST_ACK:作為后關(guān)閉的一方,在發(fā)送FIN數(shù)據(jù)包后,即進(jìn)入TCP_LAST_ACK狀態(tài)。此時(shí)等待遠(yuǎn)端發(fā)送應(yīng)答數(shù)據(jù)包,在接收到應(yīng)答數(shù)據(jù)包后,即完成關(guān)閉操作,進(jìn)入TCP_CLOSE狀態(tài)。
  • 三次握手

    三次握手過(guò)程

    三次握手過(guò)程是客戶端主動(dòng)向正在監(jiān)聽(tīng)的服務(wù)發(fā)起交換序號(hào)、建立連接的過(guò)程,三次握手過(guò)程如下:

  • 第一次握手
    客戶端主動(dòng)發(fā)送SYN包到服務(wù)器,其中包含客戶端的初始序號(hào)seq=x,并進(jìn)入SYN_SENT狀態(tài),等待服務(wù)器確認(rèn)。(其中,SYN=1,ACK=0,表示這是一個(gè)TCP連接請(qǐng)求數(shù)據(jù)報(bào)文;序號(hào)seq=x,x是隨機(jī)數(shù),表明傳輸數(shù)據(jù)時(shí)的第一個(gè)數(shù)據(jù)字節(jié)的序號(hào)是x)。
  • 第二次握手
    服務(wù)器收到請(qǐng)求后,必須確認(rèn)客戶的數(shù)據(jù)包,同時(shí)自己也發(fā)送一個(gè)SYN包,即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)。(其中確認(rèn)報(bào)文段中,標(biāo)識(shí)位SYN=1,ACK=1,表示這是一個(gè)TCP連接響應(yīng)數(shù)據(jù)報(bào)文,并含服務(wù)端的初始序號(hào)seq=y,y是隨機(jī)數(shù),以及服務(wù)器對(duì)客戶端初始序號(hào)的確認(rèn)號(hào)ack(服務(wù)器)=seq(客戶端)+1=x+1)。
  • 第三次握手
    客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包(seq=x+1,ack=y+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTAB_LISHED(TCP連接成功)狀態(tài),完成三次握手。
  • 三次握手交換各自的序號(hào),建立起連接。

    握手過(guò)程為什么是三次而不是兩次、四次?

    TCP作為一種可靠傳輸控制協(xié)議,其核心思想:既要保證數(shù)據(jù)可靠傳輸,又要提高傳輸?shù)男?#xff0c;而用三次恰恰可以滿足以上兩方面的需求!

    為了實(shí)現(xiàn)可靠數(shù)據(jù)傳輸, TCP 協(xié)議的通信雙方, 都必須維護(hù)一個(gè)序列號(hào), 以標(biāo)識(shí)發(fā)送出去的數(shù)據(jù)包中, 哪些是已經(jīng)被對(duì)方收到的。 三次握手的過(guò)程即是通信雙方相互告知序列號(hào)起始值, 并確認(rèn)對(duì)方已經(jīng)收到了序列號(hào)起始值的必經(jīng)步驟

    兩次握手的場(chǎng)景

    兩次握手過(guò)程其實(shí)只有三次握手的前兩次握手,沒(méi)有第三次握手

    兩次握手至多只有連接發(fā)起方的起始序列號(hào)能被確認(rèn), 另一方選擇的序列號(hào)則得不到確認(rèn)。

    想象一個(gè)場(chǎng)景,client向server發(fā)送一個(gè)連接請(qǐng)求,由于一些原因,導(dǎo)致client發(fā)出的連接請(qǐng)求在一個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)逗留了比較多的時(shí)間。此時(shí)client會(huì)將此連接請(qǐng)求作為無(wú)效處理 又重新向server發(fā)起了一次新的連接請(qǐng)求,server正常收到此連接請(qǐng)求后建立了連接,數(shù)據(jù)傳輸完成后釋放了連接。如果此時(shí)client發(fā)出的第一次請(qǐng)求又到達(dá)了server,server會(huì)以為client又發(fā)起了一次連接請(qǐng)求。如果是兩次握手:此時(shí)連接就建立了,server會(huì)維持連接一直等待client發(fā)送數(shù)據(jù),從而白白浪費(fèi)server的資源。 如果是三次握手:由于client沒(méi)有發(fā)起連接請(qǐng)求,也就不會(huì)理會(huì)server的連接響應(yīng),server沒(méi)有收到client的確認(rèn)連接,就會(huì)關(guān)閉掉本次連接。如果第一次握手大量延時(shí)或者第二次握手大量丟失 ,就會(huì)造成“SYN的洪水攻擊”效果。

    四次握手的場(chǎng)景

    四次握手其實(shí)就是將第二次握手發(fā)送ACK與SYN分開(kāi)進(jìn)行,這樣子有違高效的原則。

    序列號(hào)與確認(rèn)號(hào)

    • wireshark中序列號(hào)默認(rèn)顯示相對(duì)序列號(hào),序列號(hào)是從0開(kāi)始,實(shí)際序列號(hào)是在三次握手過(guò)程雙方隨機(jī)選取的??梢酝ㄟ^(guò)設(shè)置來(lái)顯示真實(shí)的序列號(hào),【編輯】->【首選項(xiàng)】->【Protocols】->【TCP】->【Relative sequence numbers(Requires “Analyer TCP sequence numbers”)】復(fù)選框去掉
    • 通過(guò)流量圖來(lái)分析序列號(hào)與確認(rèn)號(hào)。【統(tǒng)計(jì)】->【流量圖】->【流類型】選擇【TCP Flows】

    通過(guò)HTTP請(qǐng)求的TCP流量圖分析序列號(hào)與確認(rèn)號(hào)

  • 第一次握手,client發(fā)送SYN包請(qǐng)求建立TCP連接,初始化序列號(hào)seq = 4129057982,隨機(jī)生成的, 確認(rèn)號(hào)ack = 0,一般都是0;
  • 第二次握手,server對(duì)請(qǐng)求進(jìn)行確認(rèn),ack = 4129057982 + 1(SYN雖沒(méi)負(fù)載數(shù)據(jù),但消耗一個(gè)序列號(hào)),同時(shí)進(jìn)行SYN,seq = 4200111240(隨機(jī))
  • 第三次握手,client對(duì)server的SYN包發(fā)送ACK包,ack = 4200111240 + 1,seq = 4129057983
  • 第四個(gè)包,client發(fā)送負(fù)載725字節(jié)的HTTP請(qǐng)求包,seq = 4129057983(注意ACK沒(méi)有消耗seq序號(hào),跟第三次握手的seq一樣), ack = 4200111241
  • 第五個(gè)包,server響應(yīng)tcp確認(rèn)包,seq = 4200111241, ack = 4129057983 + 725 = 4129058708
  • 四次揮手

    四次揮手主要是關(guān)閉tcp建立起來(lái)的連接,釋放相關(guān)資源

    四次揮手過(guò)程

    在實(shí)際應(yīng)用中,客戶端主動(dòng)關(guān)閉到服務(wù)器的連接,服務(wù)器在檢測(cè)到客戶端關(guān)閉連接后,關(guān)閉對(duì)應(yīng)的連接。

    • 第一次揮手: 客戶端發(fā)送一個(gè)FIN,用來(lái)關(guān)閉客戶端到服務(wù)器的數(shù)據(jù)傳送服務(wù)器的確認(rèn)。其中終止標(biāo)志位FIN=1,序列號(hào)seq=u.
    • 第二次揮手: 服務(wù)器收到這個(gè)FIN,它發(fā)送一個(gè)ACK,確認(rèn)ack為收到的序號(hào)加一。
    • 第三次揮手: 關(guān)閉服務(wù)器到客戶端的連接,發(fā)送一個(gè)FIN給客戶端。
    • 第四次揮手: 客戶端收到FIN后,并發(fā)回一個(gè)ACK報(bào)文確認(rèn),并將確認(rèn)序號(hào)seq設(shè)置為收到序號(hào)加一。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉,而另一方執(zhí)行被動(dòng)關(guān)閉。

    客戶端發(fā)送FIN后,進(jìn)入終止等待狀態(tài),服務(wù)器收到客戶端連接釋放報(bào)文段后,就立即給客戶端發(fā)送確認(rèn),服務(wù)器就進(jìn)入CLOSE_WAIT狀態(tài),此時(shí)TCP服務(wù)器進(jìn)程就通知高層應(yīng)用進(jìn)程,因而從客戶端到服務(wù)器的連接就釋放了。此時(shí)是“半關(guān)閉狀態(tài)”,即客戶端不可以發(fā)送給服務(wù)器,服務(wù)器可以發(fā)送給客戶端。
    此時(shí),如果服務(wù)器沒(méi)有數(shù)據(jù)報(bào)發(fā)送給客戶端,其應(yīng)用程序就通知TCP釋放連接,然后發(fā)送給客戶端連接釋放數(shù)據(jù)報(bào),并等待確認(rèn)??蛻舳税l(fā)送確認(rèn)后,進(jìn)入TIME_WAIT狀態(tài),但是此時(shí)TCP連接還沒(méi)有釋放,然后經(jīng)過(guò)等待計(jì)時(shí)器設(shè)置的2MSL后,才進(jìn)入到CLOSED狀態(tài)。

    2.為什么需要2MSL時(shí)間?
    首先,MSL即Maximum Segment Lifetime,就是最大報(bào)文生存時(shí)間,是任何報(bào)文在網(wǎng)絡(luò)上的存在的最長(zhǎng)時(shí)間,超過(guò)這個(gè)時(shí)間報(bào)文將被丟棄?!禩CP/IP詳解》中是這樣描述的:MSL是任何報(bào)文段被丟棄前在網(wǎng)絡(luò)內(nèi)的最長(zhǎng)時(shí)間。RFC 793中規(guī)定MSL為2分鐘,實(shí)際應(yīng)用中常用的是30秒、1分鐘、2分鐘等。

    TCP的TIME_WAIT需要等待2MSL,當(dāng)TCP的一端發(fā)起主動(dòng)關(guān)閉,三次揮手完成后發(fā)送第四次揮手的ACK包后就進(jìn)入這個(gè)狀態(tài),等待2MSL時(shí)間主要目的是:防止最后一個(gè)ACK包對(duì)方?jīng)]有收到,那么對(duì)方在超時(shí)后將重發(fā)第三次握手的FIN包,主動(dòng)關(guān)閉端接到重發(fā)的FIN包后可以再發(fā)一個(gè)ACK應(yīng)答包。在TIME_WAIT狀態(tài)時(shí)兩端的端口不能使用,要等到2MSL時(shí)間結(jié)束才可以繼續(xù)使用。當(dāng)連接處于2MSL等待階段時(shí)任何遲到的報(bào)文段都將被丟棄。

    3.為什么是四次揮手,而不是三次或是五次、六次?
    雙方關(guān)閉連接要經(jīng)過(guò)雙方都同意。所以,首先是客服端給服務(wù)器發(fā)送FIN,要求關(guān)閉連接,服務(wù)器收到后會(huì)發(fā)送一個(gè)ACK進(jìn)行確認(rèn)。服務(wù)器然后再發(fā)送一個(gè)FIN,客戶端發(fā)送ACK確認(rèn),并進(jìn)入TIME_WAIT狀態(tài)。等待2MSL后自動(dòng)關(guān)閉。

    總結(jié):
    (1)為了保證客戶端發(fā)送的最后一個(gè)ACK報(bào)文段能夠到達(dá)服務(wù)器。即最后一個(gè)確認(rèn)報(bào)文可能丟失,服務(wù)器會(huì)超時(shí)重傳,然后服務(wù)器發(fā)送FIN請(qǐng)求關(guān)閉連接,客戶端發(fā)送ACK確認(rèn)。一個(gè)來(lái)回是兩個(gè)報(bào)文生命周期。

    如果沒(méi)有等待時(shí)間,發(fā)送完確認(rèn)報(bào)文段就立即釋放連接的話,服務(wù)器就無(wú)法重傳,因此也就收不到確認(rèn),就無(wú)法按步驟進(jìn)入CLOSED狀態(tài),即必須收到確認(rèn)才能close。
    (2)防止已經(jīng)失效的連接請(qǐng)求報(bào)文出現(xiàn)在連接中。經(jīng)過(guò)2MSL,在這個(gè)連續(xù)持續(xù)的時(shí)間內(nèi),產(chǎn)生的所有報(bào)文段就可以都從網(wǎng)絡(luò)消失。

    參考

    • TCP狀態(tài)機(jī)-狀態(tài)解析
    • TCP 為什么三次握手而不是兩次握手(正解版)
    • TCP 為什么是三次握手,而不是兩次或四次?
    • TCP為什么是三次握手和四次揮手
    • SDN手冊(cè)

    總結(jié)

    以上是生活随笔為你收集整理的tcp状态机-三次握手-四次挥手以及常见面试题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。