為什么把連接管理單獨(dú)寫出來呢?三次握手四次揮手塔淤,相信都已經(jīng)很耳熟能詳了。但是過程發(fā)生了什么速妖?到底是如何發(fā)生的高蜂?持久連接又是如何斷開的?
建立連接過程
URL解析:第 (1) ~ (3) 步會(huì)將服務(wù)器的 IP 地址和端口號(hào)從 URL 中分離出來罕容。
(4) 步中建立到 Web 服務(wù)器的 TCP 連接
(5) 步通過這條連接發(fā)送一條請(qǐng)求報(bào)文
(6) 步讀取響應(yīng)
(7) 步關(guān)閉連接备恤。
TCP流是分段的、由IP分組傳送
TCP/IP協(xié)議簇是一組不同層次上的多個(gè)協(xié)議的組合锦秒,通常被認(rèn)為是一個(gè)四層協(xié)議系統(tǒng)露泊,與OSI的七層模型相對(duì)應(yīng)。
HTTP over TCP over IP
HTTP 要傳送一條報(bào)文時(shí)旅择,會(huì)以流的形式將報(bào)文數(shù)據(jù)的內(nèi)容通過一條打開的 TCP 連 接按序傳輸惭笑。TCP 收到數(shù)據(jù)流之后,會(huì)將數(shù)據(jù)流砍成被稱作段的小數(shù)據(jù)塊生真,并將段 封裝在 IP 分組中沉噩,通過因特網(wǎng)進(jìn)行傳輸。
3次握手和4次揮手 ——TCP連接的建立和斷開
3次握手
說到http連接汇歹,就跳不過連接的建立和斷開屁擅,三次握手也算是說得頻繁的一個(gè)點(diǎn)了,其實(shí)斷開跟建立一樣重要产弹。
首先說三次握手
1.首先派歌,客戶端會(huì)發(fā)送一個(gè)小的TCP分組弯囊,帶有SYN標(biāo)記,說明是一個(gè)連接請(qǐng)求胶果。
2.服務(wù)端接受連接匾嘱,則進(jìn)行一些計(jì)算,將SYN和ACK位數(shù)據(jù)置位發(fā)送響應(yīng)早抠,表示接受連接請(qǐng)求霎烙。
3.客戶端再回送一條數(shù)據(jù)來表示連接已經(jīng)建立。
建立連接蕊连,接著就可以請(qǐng)求數(shù)據(jù)了悬垃。
持久連接
在事務(wù)處理結(jié)束之后仍然保持在打開狀態(tài)的 TCP 連接被稱為持久連接。
一個(gè)頁面需要請(qǐng)求的文件一般都很多甘苍,總不能每一個(gè)文件都從頭建立一次TCP連接尝蠕,僅僅握手時(shí)延就是很大的消耗。還有各種慢啟動(dòng)等問題载庭。
所以持久連接是很必須的看彼,http1.0有keep-alive,到了1.1就是默認(rèn)支持了囚聚。
持久連接需要清楚的是靖榕,客戶端是無法知道響應(yīng)的文件是否已經(jīng)傳輸完畢從而發(fā)起下一個(gè)請(qǐng)求的,所以content-length字段(文件內(nèi)容長)就顯得尤為重要顽铸。
在事務(wù)處理完畢之后茁计,需要斷開連接。
然而跋破,持久連接是怎么知道該什么時(shí)候斷開連接呢簸淀?
4次揮手
什么時(shí)候數(shù)據(jù)請(qǐng)求完不再需要,那就是斷開連接的時(shí)候毒返。媽的租幕,這不是廢話嘛~
怎么知道不再請(qǐng)求?
TCP 連接是雙向的拧簸。TCP 連接的每一端都有一個(gè)輸入隊(duì)列和一個(gè) 輸出隊(duì)列劲绪,用于數(shù)據(jù)的讀或?qū)憽7湃胍欢溯敵鲫?duì)列中的數(shù)據(jù)最終會(huì)出現(xiàn)在另一端的 輸入隊(duì)列中盆赤。
由于TCP連接是全雙工的贾富,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉。這原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN來終止這個(gè)方向的連接牺六。收到一個(gè) FIN只意味著這一方向上沒有數(shù)據(jù)流動(dòng)颤枪,一個(gè)TCP連接在收到一個(gè)FIN后仍能發(fā)送數(shù)據(jù)。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉淑际,而另一方執(zhí)行被動(dòng)關(guān)閉畏纲。
(1) 第一次: TCP客戶端發(fā)送一個(gè)FIN扇住,連同最后的一個(gè)請(qǐng)求,用來關(guān)閉客戶到服務(wù)器的數(shù)據(jù)傳送盗胀。FIN-WAIT
(2) 第二次: 服務(wù)器收到這個(gè)FIN艘蹋,它發(fā)回一個(gè)ACK和文件,客戶端接受文件無誤票灰,繼續(xù)等待服務(wù)器發(fā)來的FIN關(guān)閉通知女阀。
在這之后,服務(wù)器關(guān)閉隊(duì)列屑迂,做好關(guān)閉連接的準(zhǔn)備浸策,確認(rèn)序號(hào)為收到的序號(hào)加1。和SYN一樣屈糊,一個(gè)FIN將占用一個(gè)序號(hào)的榛。WAIT CLOSE琼了。準(zhǔn)備好逻锐。發(fā)送FIN關(guān)閉連接信息。
(4) 第三次: 接收FIN雕薪,第四次: 回復(fù)一個(gè)ACK昧诱,告訴服務(wù)器可以關(guān)閉了。然后開始倒計(jì)時(shí)狀態(tài)TIME-WAIT