新聞中心
TCP(Transmission Control Protocol,傳輸控制協(xié)議) 是計(jì)算機(jī)網(wǎng)絡(luò)的的重要組成部分,也是網(wǎng)絡(luò)編程的重要內(nèi)容,還有我們平時(shí)接觸最多的 HTTP 也是基于 TCP 實(shí)現(xiàn)的。TCP 可以說(shuō)是最重要的傳輸層協(xié)議,既然如此,作為開發(fā)人員,就有必要把 TCP 的核心概念和原理搞清楚,本篇文章重點(diǎn)為大家講解一下TCP經(jīng)典面試題。

1. 為什么連接的時(shí)候是三次握手,關(guān)閉的時(shí)候卻是四次握手?
因?yàn)楫?dāng)Server端收到Client端的SYN連接請(qǐng)求報(bào)文后,可以直接發(fā)送SYN+ACK報(bào)文。其中ACK報(bào)文是用來(lái)應(yīng)答的,SYN報(bào)文是用來(lái)同步的。但是關(guān)閉連接時(shí),當(dāng)Server端收到FIN報(bào)文時(shí),很可能并不會(huì)立即關(guān)閉SOCKET,所以只能先回復(fù)一個(gè)ACK報(bào)文,告訴Client端,”你發(fā)的FIN報(bào)文我收到了”。只有等到我Server端所有的報(bào)文都發(fā)送完了,我才能發(fā)送FIN報(bào)文,因此不能一起發(fā)送。故需要四步握手。
2. 為什么不能用兩次握手進(jìn)行連接?
這主要是為了防止已失效的連接請(qǐng)求報(bào)文段突然又傳到了B,因而產(chǎn)生錯(cuò)誤。
現(xiàn)假定一種異常情況,即A發(fā)出的第一個(gè)連接請(qǐng)求報(bào)文段并沒(méi)有丟失,而是在某些網(wǎng)絡(luò)節(jié)點(diǎn)長(zhǎng)時(shí)間滯留了,以致延誤到連接釋放后的某個(gè)時(shí)間才到達(dá)B。本來(lái)這是一個(gè)早已失效的報(bào)文段。但B受到此失效的連接請(qǐng)求報(bào)文段后,就誤以為是A又發(fā)出一次新的連接請(qǐng)求,于是就向A發(fā)出確認(rèn)報(bào)文段,同意建立連接。假定不采用第三次報(bào)文握手,那么只要B發(fā)出確認(rèn),新的連接就建立了。
由于現(xiàn)在A并沒(méi)有發(fā)出建立連接的請(qǐng)求,因此不會(huì)理睬B的確認(rèn),也不會(huì)向B發(fā)送數(shù)據(jù),但B卻以為新的運(yùn)輸連接已經(jīng)建立了,并一直等待A發(fā)來(lái)的數(shù)據(jù)。B的許多資源就這樣白白浪費(fèi)了。
采用三次握手連接,可以防止上述現(xiàn)象的發(fā)生。例如在剛才的異常情況下,A不會(huì)向B的確認(rèn)發(fā)出確認(rèn),B由于收不到確認(rèn),就知道A并沒(méi)有要求建立連接,于是B就不會(huì)再建立連接。
3. 為什么TIME_WAIT狀態(tài)需要經(jīng)過(guò)2MSL才能返回到CLOSE狀態(tài)?
-
第一,為了保證A發(fā)送的最后一個(gè)ACK報(bào)文段能夠到達(dá)B。假設(shè)網(wǎng)絡(luò)是不可靠的,有可以最后一個(gè)ACK丟失。所以TIME_WAIT狀態(tài)就是用來(lái)重發(fā)可能丟失的ACK報(bào)文。在Client發(fā)送出最后的ACK回復(fù),但該ACK可能丟失。Server如果沒(méi)有收到ACK,將不斷重復(fù)發(fā)送FIN片段。所以Client不能立即關(guān)閉,它必須確認(rèn)Server接收到了該ACK。Client會(huì)在發(fā)送出ACK之后進(jìn)入到TIME_WAIT狀態(tài)。Client會(huì)設(shè)置一個(gè)計(jì)時(shí)器,等待2MSL的時(shí)間。如果在該時(shí)間內(nèi)再次收到FIN,那么Client會(huì)重發(fā)ACK并再次等待2MSL。所謂的2MSL是兩倍的MSL(Maximum Segment Lifetime)。MSL指一個(gè)片段在網(wǎng)絡(luò)中最大的存活時(shí)間,2MSL就是一個(gè)發(fā)送和一個(gè)回復(fù)所需的最大時(shí)間。如果直到2MSL,Client都沒(méi)有再次收到FIN,那么Client推斷ACK已經(jīng)被Server成功接收,則結(jié)束TCP連接。
-
第二,防止“已失效的連接請(qǐng)求報(bào)文段”出現(xiàn)在本連接中。A在發(fā)送完最后一個(gè)ACK報(bào)文段后,再經(jīng)過(guò)時(shí)間2MSL,就可以使本連接持續(xù)的時(shí)間內(nèi)所產(chǎn)生的所有報(bào)文段都從網(wǎng)絡(luò)中消失。這樣就可以使下一個(gè)新的連接中不會(huì)出現(xiàn)這種舊的連接請(qǐng)求報(bào)文段。
4. 如果已經(jīng)建立了連接,但是客戶端突然出現(xiàn)故障了怎么辦?
TCP還設(shè)有一個(gè)保活計(jì)時(shí)器,顯然,客戶端如果出現(xiàn)故障,服務(wù)器不能一直等下去,白白浪費(fèi)資源。服務(wù)器每收到一次客戶端的請(qǐng)求后都會(huì)重新復(fù)位這個(gè)計(jì)時(shí)器,時(shí)間通常是設(shè)置為2小時(shí),若兩小時(shí)還沒(méi)有收到客戶端的任何數(shù)據(jù),服務(wù)器就會(huì)發(fā)送一個(gè)探測(cè)報(bào)文段,以后每隔75分鐘發(fā)送一次。若一連發(fā)送10個(gè)探測(cè)報(bào)文仍然沒(méi)反應(yīng),服務(wù)器就認(rèn)為客戶端出了故障,接著就關(guān)閉連接。
當(dāng)前名稱:TCP經(jīng)典面試題
轉(zhuǎn)載注明:http://m.fisionsoft.com.cn/article/ccchhdj.html


咨詢
建站咨詢
