中國(guó)做網(wǎng)站推廣哪家好武漢外包seo公司
1.TCP?三次握手之為什么要三次呢?事不過(guò)三?
過(guò)程如下圖:
先來(lái)解釋下上述的各個(gè)標(biāo)志的含義
? ? ? 序列號(hào)seq:占4個(gè)字節(jié),用來(lái)標(biāo)記數(shù)據(jù)段的順序,TCP把連接中發(fā)送的所有數(shù)據(jù)字節(jié)都編上一個(gè)序號(hào),第一個(gè)字節(jié)的編號(hào)由本地隨機(jī)產(chǎn)生;給字節(jié)編上序號(hào)后,就給每一個(gè)報(bào)文段指派一個(gè)序號(hào);序列號(hào)seq就是這個(gè)報(bào)文段中的第一個(gè)字節(jié)的數(shù)據(jù)編號(hào)。
? ? ?確認(rèn)號(hào)ack:占4個(gè)字節(jié),期待收到對(duì)方下一個(gè)報(bào)文段的第一個(gè)數(shù)據(jù)字節(jié)的序號(hào);序列號(hào)表示報(bào)文段攜帶數(shù)據(jù)的第一個(gè)字節(jié)的編號(hào);而確認(rèn)號(hào)指的是期望接收到下一個(gè)字節(jié)的編號(hào);因此當(dāng)前報(bào)文段最后一個(gè)字節(jié)的編號(hào)+1即為確認(rèn)號(hào)。
? ? ?確認(rèn)ACK:占1位,僅當(dāng)ACK=1時(shí),確認(rèn)號(hào)字段才有效。ACK=0時(shí),確認(rèn)號(hào)無(wú)效
? ? ?同步SYN:連接建立時(shí)用于同步序號(hào)。當(dāng)SYN=1,ACK=0時(shí)表示:這是一個(gè)連接請(qǐng)求報(bào)文段。若同意連接,則在響應(yīng)報(bào)文段中使得SYN=1,ACK=1。因此,SYN=1表示這是一個(gè)連接請(qǐng)求,或連接接受報(bào)文。SYN這個(gè)標(biāo)志位只有在TCP建產(chǎn)連接時(shí)才會(huì)被置1,握手完成后SYN標(biāo)志位被置0。
? ? ?終止FIN:用來(lái)釋放一個(gè)連接。FIN=1表示:此報(bào)文段的發(fā)送方的數(shù)據(jù)已經(jīng)發(fā)送完畢,并要求釋放運(yùn)輸連接
? ? ?ACK、SYN和FIN這些大寫(xiě)的單詞表示標(biāo)志位,其值要么是1,要么是0;ack、seq小寫(xiě)的單詞表示序號(hào)。
?
三次握手避免歷史連接
當(dāng)客戶(hù)端連續(xù)發(fā)送多次建立連接的?SYN?報(bào)文,然后在網(wǎng)絡(luò)擁堵的情況,就會(huì)發(fā)生客戶(hù)端收到不正確的 ack 的情況。
具體過(guò)程如下:
? ? ? ?客戶(hù)端先發(fā)送了 SYN(seq = 90) 報(bào)文,但是被網(wǎng)絡(luò)阻塞了,服務(wù)端并沒(méi)有收到,接著客戶(hù)端又重新發(fā)送了 SYN(seq = 100) 報(bào)文,注意不是重傳 SYN,重傳的 SYN 的序列號(hào)是一樣的。
舊 SYN 報(bào)文比最新的 SYN ?報(bào)文早到達(dá)了服務(wù)端,那么此時(shí)服務(wù)端就會(huì)回一個(gè) SYN + ACK 報(bào)文給客戶(hù)端,此報(bào)文的確認(rèn)號(hào)是 91(90+1)。
? ? ? ?客戶(hù)端收到后,發(fā)行自己期望收到的確認(rèn)號(hào)應(yīng)該是 100+1,而不是 90 + 1,于是就會(huì)回 RST 文。
? ? ? ? 服務(wù)端收到 RST 報(bào)文后,就會(huì)中止連接。后續(xù)最新的 SYN 抵達(dá)了服務(wù)端后,客戶(hù)端與服務(wù)端就可以正常的完成三次握手了。
? ? ? ?上述中的舊 SYN 報(bào)文稱(chēng)為歷史連接,TCP 使用三次握手建立連接的最主要原因就是防止歷史連接初始化了連接。
? ? ? ?簡(jiǎn)單來(lái)說(shuō),三次握手的首要原因是為了防止舊的重復(fù)連接初始化造成混亂。
2.如果是兩次握手連接,就無(wú)法阻止歷史連接,那為什么 TCP 兩次握手為什么無(wú)法阻止歷史連接呢?
? ? ? ?因?yàn)樵趦纱挝帐值那闆r下,被動(dòng)發(fā)起方?jīng)]有中間狀態(tài)給主動(dòng)發(fā)起方來(lái)阻止歷史連接,導(dǎo)致被動(dòng)發(fā)起方可能建立一個(gè)歷史連接,造成資源浪費(fèi)。
? ? ? ?兩次握手的情況下,被動(dòng)發(fā)起方在收到 SYN 報(bào)文后,就進(jìn)入 ESTABLISHED 狀態(tài),意味著這時(shí)可以給對(duì)方發(fā)送數(shù)據(jù)給,但是主動(dòng)發(fā)起方此時(shí)還沒(méi)有進(jìn)入 ESTABLISHED 狀態(tài),假設(shè)這次是歷史連接,主動(dòng)發(fā)起方判斷到此次連接為歷史連接,那么就會(huì)回 RST 報(bào)文來(lái)斷開(kāi)連接,而被動(dòng)發(fā)起方在第一次握手的時(shí)候就進(jìn)入 ESTABLISHED 狀態(tài),所以它可以發(fā)送數(shù)據(jù)的,但是它并不知道這個(gè)是歷史連接,它只有在收到 RST 報(bào)文后,才會(huì)斷開(kāi)連接。
兩次握手無(wú)法阻止歷史連接
? ? ? ?上面這種場(chǎng)景下,被動(dòng)發(fā)起方在向主動(dòng)發(fā)起方發(fā)送數(shù)據(jù)前,并沒(méi)有阻止掉歷史連接,導(dǎo)致被動(dòng)發(fā)起方建立了一個(gè)歷史連接,又白白發(fā)送了數(shù)據(jù),妥妥地浪費(fèi)了被動(dòng)發(fā)起方的資源。
????????因此,要解決這種現(xiàn)象,最好就是在被動(dòng)發(fā)起方發(fā)送數(shù)據(jù)前,也就是建立連接之前,要阻止掉歷史連接,這樣就不會(huì)造成資源浪費(fèi),而要實(shí)現(xiàn)這個(gè)功能,就需要三次握手。
????????客戶(hù)端在 SYN_SENT 狀態(tài)下,收到不正確的確認(rèn)號(hào)的 syn+ack 報(bào)文會(huì)回 RST 報(bào)文。
3.TCP 三次握手中,客戶(hù)端收到的第二次握手中 ack 確認(rèn)號(hào)不是自己期望的,會(huì)發(fā)生什么?是直接丟棄 or 回 RST 報(bào)文?
回 RST 報(bào)文。
4.什么情況下會(huì)收到不正確的 ack(第二次握手中的 ack) 呢?
????????當(dāng)客戶(hù)端發(fā)起多次 SYN 報(bào)文,然后網(wǎng)絡(luò)擁堵的情況下,舊的 SYN 報(bào)文比新的 SYN 報(bào)文早抵達(dá)服務(wù)端,此時(shí)服務(wù)端就會(huì)按照收到的舊的 SYN 報(bào)文回復(fù) syn+ack 報(bào)文,而此報(bào)文的確認(rèn)號(hào)并不是客戶(hù)端期望收到的,于是客戶(hù)端就會(huì)回 RST 報(bào)文。
5.四次揮手
????????客戶(hù)端發(fā)送FIN包詢(xún)問(wèn)服務(wù)器端是否能斷開(kāi),客戶(hù)端進(jìn)入FIN_WAIT_1狀態(tài)
????????服務(wù)器端收到客戶(hù)端發(fā)送的包并返回ACK包,服務(wù)器端進(jìn)入CLOSE_WAIT狀態(tài)
????????服務(wù)器端準(zhǔn)備好斷開(kāi)后,發(fā)送FIN包給客戶(hù)端,服務(wù)器端進(jìn)入LAST_ACK狀態(tài)
????????客戶(hù)端收到服務(wù)器端發(fā)送的包后返回ACK包,客戶(hù)端進(jìn)入TIME_WAIT狀態(tài),服務(wù)器端收到包后進(jìn)入CLOSED狀態(tài)
????????客戶(hù)端狀態(tài):FIN_WAIT_1 FIN_WAIT_2 TIME_WAIT
????????服務(wù)器端狀態(tài):CLOSE_WAIT LAST_ACKC LOSED
6.為什么A在TIME-WAIT狀態(tài)必須等待2MSL(最大報(bào)文生存時(shí)間)的時(shí)間?
????????首先保證A發(fā)送的最后一個(gè)ACK報(bào)文段能夠到達(dá)B,保證A、B正常進(jìn)入CLOSED狀態(tài)。
? ? ? ? 這個(gè)ACK報(bào)文段有可能丟失,使得處于LAST-ACK狀態(tài)的B收不到對(duì)已發(fā)送的FIN+ACK報(bào)文段的確認(rèn),B超時(shí)重傳FIN+ACK報(bào)文段,A能2MSL時(shí)間內(nèi)收到這個(gè)重傳的FIN+ACK報(bào)文段,接著A重傳一次確認(rèn),同時(shí)重啟2MSL計(jì)數(shù)器,2MSL時(shí)間后A和B進(jìn)入CLOSE狀態(tài),如果A在TIME-WAIT狀態(tài)時(shí)接收到B的FIN+ACK報(bào)文段之后向B發(fā)出確認(rèn)報(bào)文段,而不再確認(rèn)B是否收到立即進(jìn)入CLOSED狀態(tài),如若B并沒(méi)有正常收到A 的確認(rèn)報(bào)文段,則B無(wú)法正正常進(jìn)入到CLOSED狀態(tài)。
????????其次防止“已經(jīng)失效的連接請(qǐng)求報(bào)文段”出現(xiàn)在本連接中。
????????A在發(fā)送完最后一個(gè)ACK報(bào)文段并經(jīng)過(guò)2MSL,會(huì)使本次連接持續(xù)時(shí)間內(nèi)所有產(chǎn)生的報(bào)文段消失,保證在下一次新連接中不會(huì)出現(xiàn)舊連接遺留的請(qǐng)求報(bào)文段。