HTTP 是無(wú)連接的沪哺,所以作為下層的 TCP 協(xié)議也是無(wú)連接的阿迈,雖然看似 TCP 將兩端連接了起來(lái)典蜕,但是其實(shí)只是兩端共同維護(hù)了一個(gè)狀態(tài)畦韭。
建立連接三次握手
在 TCP 協(xié)議中疼蛾,主動(dòng)發(fā)起請(qǐng)求的一端為客戶端,被動(dòng)連接的一端稱為服務(wù)端艺配。不管是客戶端還是服務(wù)端察郁,TCP 連接建立完后都能發(fā)送和接收數(shù)據(jù),所以 TCP 也是一個(gè)全雙工的協(xié)議转唉。
起初皮钠,兩端都為 CLOSED 狀態(tài)。在通信開始前赠法,雙方都會(huì)創(chuàng)建 TCB麦轰。 服務(wù)器創(chuàng)建完 TCB 后遍進(jìn)入 LISTEN 狀態(tài),此時(shí)開始等待客戶端發(fā)送數(shù)據(jù)。
-
第一次握手
客戶端向服務(wù)端發(fā)送連接請(qǐng)求報(bào)文段款侵。該報(bào)文段中包含自身的數(shù)據(jù)通訊初始序號(hào)末荐。請(qǐng)求發(fā)送后,客戶端便進(jìn)入 SYN-SENT 狀態(tài)新锈,x 表示客戶端的數(shù)據(jù)通信初始序號(hào)甲脏。 -
第二次握手
服務(wù)端收到連接請(qǐng)求報(bào)文段后,如果同意連接妹笆,則會(huì)發(fā)送一個(gè)應(yīng)答剃幌,該應(yīng)答中也會(huì)包含自身的數(shù)據(jù)通訊初始序號(hào),發(fā)送完成后便進(jìn)入 SYN-RECEIVED 狀態(tài)晾浴。 -
第三次握手
當(dāng)客戶端收到連接同意的應(yīng)答后负乡,還要向服務(wù)端發(fā)送一個(gè)確認(rèn)報(bào)文〖够耍客戶端發(fā)完這個(gè)報(bào)文段后便進(jìn)入ESTABLISHED 狀態(tài)抖棘,服務(wù)端收到這個(gè)應(yīng)答后也進(jìn)入 ESTABLISHED 狀態(tài),此時(shí)連接建立成功狸涌。
第三次握手可以包含數(shù)據(jù)切省,通過(guò) TCP 快速打開(TFO)技術(shù)。其實(shí)只要涉及到握手的協(xié)議帕胆,都可以使用類似 TFO 的方式朝捆,客戶端和服務(wù)端存儲(chǔ)相同 cookie,下次握手時(shí)發(fā)出 cookie 達(dá)到減少 RTT 的目的懒豹。
-
為何兩次握手即可建立鏈接芙盘,還需要第三次握手?
為了防止失效的連接請(qǐng)求報(bào)文段被服務(wù)端接收脸秽,從而產(chǎn)生錯(cuò)誤儒老。
斷開鏈接四次揮手
TCP 是全雙工的,在斷開連接時(shí)兩端都需要發(fā)送 FIN 和 ACK记餐。
-
第一次揮手
若客戶端 A 認(rèn)為數(shù)據(jù)發(fā)送完成驮樊,則它需要向服務(wù)端 B 發(fā)送連接釋放請(qǐng)求。 -
第二次揮手
B 收到連接釋放請(qǐng)求后片酝,會(huì)告訴應(yīng)用層要釋放 TCP 鏈接囚衔。然后會(huì)發(fā)送 ACK 包,并進(jìn)入 CLOSE_WAIT 狀態(tài)雕沿,表示 A 到 B 的連接已經(jīng)釋放练湿,不接收 A 發(fā)的數(shù)據(jù)了。但是因?yàn)?TCP 連接時(shí)雙向的晦炊,所以 B 仍舊可以發(fā)送數(shù)據(jù)給 A鞠鲜。 -
第三次揮手
B 如果此時(shí)還有沒(méi)發(fā)完的數(shù)據(jù)會(huì)繼續(xù)發(fā)送宁脊,完畢后會(huì)向 A 發(fā)送連接釋放請(qǐng)求,然后 B 便進(jìn)入 LAST-ACK 狀態(tài)贤姆。 -
第四次揮手
A 收到釋放請(qǐng)求后榆苞,向 B 發(fā)送確認(rèn)應(yīng)答,此時(shí) A 進(jìn)入 TIME-WAIT 狀態(tài)霞捡。該狀態(tài)會(huì)持續(xù) 2MSL(最大段生存期坐漏,指報(bào)文段在網(wǎng)絡(luò)中生存的時(shí)間,超時(shí)會(huì)被拋棄) 時(shí)間碧信,若該時(shí)間段內(nèi)沒(méi)有 B 的重發(fā)請(qǐng)求的話赊琳,就進(jìn)入 CLOSED 狀態(tài)。當(dāng) B 收到確認(rèn)應(yīng)答后砰碴,也便進(jìn)入 CLOSED 狀態(tài)躏筏。
第三次揮手通過(guò)延遲確認(rèn)的技術(shù)(通常有時(shí)間限制,否則對(duì)方會(huì)誤認(rèn)為需要重傳)呈枉,可以將第二次和第三次揮手合并趁尼,延遲 ACK 包的發(fā)送。
-
為什么 A 要進(jìn)入 TIME-WAIT 狀態(tài)猖辫,等待 2MSL 時(shí)間后才進(jìn)入 CLOSED 狀態(tài)酥泞?
為了保證 B 能收到 A 的確認(rèn)應(yīng)答。若 A 發(fā)完確認(rèn)應(yīng)答后直接進(jìn)入 CLOSED 狀態(tài)啃憎,如果確認(rèn)應(yīng)答因?yàn)榫W(wǎng)絡(luò)問(wèn)題一直沒(méi)有到達(dá)芝囤,那么會(huì)造成 B 不能正常關(guān)閉。