tcp状态机-三次握手-四次挥手以及常见面试题
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ā)的一致性。
三次握手
三次握手過(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)
四次揮手
四次揮手主要是關(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)題。
- 上一篇: try代码块中出现异常后try内程序会继
- 下一篇: 常用的限流算法学习