
image.png
三次握手
三次握手和兩次握手相比,優(yōu)勢在哪里?
第一步: 他要發(fā)送一條建立連接的消息告訴對方咱兩要通信了
第二步: 對方收到這個(gè)消息后,要回復(fù)他一個(gè)確認(rèn)消息
上面兩步(兩次握手)做完了,兩人才能夠通信。
如果a發(fā)給b的請求信息。被阻塞,a收不到b的回信,會(huì)再次發(fā)送b一個(gè)請求通信的信息。
某一個(gè)時(shí)間段過后。b收到了a那個(gè)阻塞的信息。
b發(fā)送了給a一個(gè)確認(rèn)的信息
由于此時(shí),a并沒有連接請求。所以,a并不會(huì)給b通信。
但是b會(huì)一直等待a的信息。。這回浪費(fèi)cpu資源。
所以tcp連接中三次握手有其必要性。
四次揮手
1.客戶端向服務(wù)器發(fā)送連接釋放報(bào)文。
2.服務(wù)器接收到后,立刻回一個(gè)接收到的請求
3.等服務(wù)器發(fā)送完所有數(shù)據(jù)后,再向服務(wù)器發(fā)送連接釋放報(bào)文
4.客戶端收到后,發(fā)送最后確認(rèn),服務(wù)器收到后,進(jìn)入關(guān)閉狀態(tài)。
問題1】為什么連接的時(shí)候是三次握手,關(guān)閉的時(shí)候卻是四次握手?
答:因?yàn)楫?dāng)Server端收到Client端的SYN連接請求報(bào)文后,可以直接發(fā)送
SYN+ACK報(bào)文。其中ACK報(bào)文是用來應(yīng)答的,SYN報(bào)文是用來同步的。
但是關(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】為什么TIME_WAIT狀態(tài)需要經(jīng)過2MSL(最大報(bào)文段生存時(shí)間)才能返回到CLOSE狀態(tài)?
答:雖然按道理,四個(gè)報(bào)文都發(fā)送完畢,我們可以直接進(jìn)入CLOSE狀態(tài)
了,但是我們必須假象網(wǎng)絡(luò)是不可靠的,有可以最后一個(gè)ACK丟失。所以
TIME_WAIT狀態(tài)就是用來重發(fā)可能丟失的ACK報(bào)文。在Client發(fā)送出最后
的ACK回復(fù),但該ACK可能丟失。Server如果沒有收到ACK,超時(shí)后將會(huì)重發(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都沒有再次收到FIN,那么Client推斷ACK已經(jīng)被成功接收,則結(jié)束
TCP連接。
【問題4】如果已經(jīng)建立了連接,但是客戶端突然出現(xiàn)故障了怎么辦?
TCP還設(shè)有一個(gè)?;钣?jì)時(shí)器,顯然,客戶端如果出現(xiàn)故障,服務(wù)器不能一
直等下去,白白浪費(fèi)資源。服務(wù)器每收到一次客戶端的請求后都會(huì)重新復(fù)
位這個(gè)計(jì)時(shí)器,時(shí)間通常是設(shè)置為2小時(shí),若兩小時(shí)還沒有收到客戶端的
任何數(shù)據(jù),服務(wù)器就會(huì)發(fā)送一個(gè)探測報(bào)文段,以后每隔75分鐘發(fā)送一次。
若一連發(fā)送10個(gè)探測報(bào)文仍然沒反應(yīng),服務(wù)器就認(rèn)為客戶端出了故障,接
著就關(guān)閉連接。