http長(zhǎng)連接和短連接機(jī)制



點(diǎn)擊上方藍(lán)色“邁莫coding”,選擇“設(shè)為星標(biāo)”
今天咱們聊一聊http的連接機(jī)制【長(zhǎng)連接、短連接】。為什么在http1.0后支持長(zhǎng)連接機(jī)制,它究竟解決了什么困惑?它又帶來(lái)了什么問(wèn)題?又是通過(guò)什么方式解決的?通過(guò)這篇文章,這些疑惑通通消滅掉~~~
計(jì)網(wǎng)以往文章
短連接
客戶(hù)端與服務(wù)端進(jìn)行交互時(shí),首先會(huì)進(jìn)行tcp三次握手建立通信連接,建立成功后才會(huì)進(jìn)行數(shù)據(jù)傳輸。當(dāng)服務(wù)端返回響應(yīng)報(bào)文后會(huì)斷開(kāi)連接,這種連接方式被稱(chēng)為短連接。
短連接也可以理解為每次進(jìn)行http請(qǐng)求時(shí)都會(huì)創(chuàng)建tcp連接,傳輸完成后斷開(kāi)連接。但短連接沒(méi)有弊端嗎?
舉個(gè)例子,現(xiàn)在要加載某個(gè)網(wǎng)站,網(wǎng)站需要加載js、css、html、數(shù)據(jù)請(qǐng)求等等,會(huì)向服務(wù)端發(fā)送多個(gè)http請(qǐng)求,此時(shí)如果使用短連接的話,每個(gè)請(qǐng)求都會(huì)重復(fù)建立三次握手、四次揮手,加載時(shí)間大大延遲,影響性能。為了改進(jìn)這一缺點(diǎn),引進(jìn)了"長(zhǎng)連接"特性。
下圖就是以短連接方式進(jìn)行http請(qǐng)求,從圖中可以看出,每次http請(qǐng)求都會(huì)建立tcp三次握手,服務(wù)端響應(yīng)后進(jìn)行tcp四次揮手?jǐn)嚅_(kāi)連接。

長(zhǎng)連接
http針對(duì)短連接暴露出來(lái)的問(wèn)題,提出了一種解決方案:長(zhǎng)連接。
長(zhǎng)連接:tcp三次握手建立起通信后,可以在一次tcp連接上傳輸多個(gè)http請(qǐng)求,這樣減少了tcp建立和關(guān)閉的消耗和延遲。
下圖表示短連接和長(zhǎng)連接的對(duì)比圖:

從圖中可知,使用短連接進(jìn)行通信時(shí),在每次http請(qǐng)求完成后都會(huì)經(jīng)歷四次握手?jǐn)嚅_(kāi)連接;而長(zhǎng)連接在建立起tcp通信時(shí),在一次tcp傳輸上可以進(jìn)行多個(gè)http請(qǐng)求。就以圖中http請(qǐng)求次數(shù)為例,使用短連接通信需要經(jīng)歷三次tcp建立和關(guān)閉,使用長(zhǎng)連接通信只需經(jīng)歷一次tcp建立和關(guān)閉。相比之下,使用長(zhǎng)連接大大減少了tcp的建立和關(guān)閉所帶來(lái)的時(shí)間延遲和資源消耗問(wèn)題。
剛剛說(shuō)了長(zhǎng)連接的優(yōu)勢(shì),那么問(wèn)題來(lái)了,http使用長(zhǎng)連接的話,它如何進(jìn)行設(shè)置操作?
http連接機(jī)制
由于長(zhǎng)連接對(duì)性能的改善效果非常顯著,所以在 HTTP/1.1中的連接都會(huì)默認(rèn)啟用長(zhǎng)連接。不需要用什么特殊的頭字段指定,只要向服務(wù)器發(fā)送了第一次請(qǐng)求,后續(xù)的請(qǐng)求都會(huì)重復(fù)利用第一次打開(kāi)的 TCP 連接,也就是長(zhǎng)連接,在這個(gè)連接上收發(fā)數(shù)據(jù)。
當(dāng)然,我們也可以在請(qǐng)求頭里明確地要求使用長(zhǎng)連接機(jī)制,使用的字段是Connection,值是“keep-alive”。
不過(guò)不管客戶(hù)端是否顯式要求長(zhǎng)連接,如果服務(wù)器支持長(zhǎng)連接,它總會(huì)在響應(yīng)報(bào)文里放一個(gè)“Connection: keep-alive”字段,告訴客戶(hù)端:“我是支持長(zhǎng)連接的,接下來(lái)就用這個(gè) TCP 一直收發(fā)數(shù)據(jù)吧”。
如果對(duì)http頭報(bào)文不熟悉的話,可以看一下我之前寫(xiě)的文章<<揭開(kāi)http報(bào)文的神秘面紗>>,這里面有解釋Connection頭字段屬性以及取值含義。
隊(duì)頭阻塞
隊(duì)頭阻塞
看完了短連接和長(zhǎng)連接,接下來(lái)就要說(shuō)到著名的“隊(duì)頭阻塞”(Head-of-line blocking,也叫“隊(duì)首阻塞”)了。
“隊(duì)頭阻塞”與短連接和長(zhǎng)連接無(wú)關(guān),而是由 HTTP 基本的“請(qǐng)求 - 應(yīng)答”模型所導(dǎo)致的。
因?yàn)?HTTP 規(guī)定報(bào)文必須是“一發(fā)一收”,這就形成了一個(gè)先進(jìn)先出的“串行”隊(duì)列。隊(duì)列里的請(qǐng)求沒(méi)有輕重緩急的優(yōu)先級(jí),只有入隊(duì)的先后順序,排在最前面的請(qǐng)求被最優(yōu)先處理。
如果隊(duì)首的請(qǐng)求因?yàn)樘幚淼奶⒄`了時(shí)間,那么隊(duì)列里后面的所有請(qǐng)求也不得不跟著一起等待,結(jié)果就是其他的請(qǐng)求承擔(dān)了不應(yīng)有的時(shí)間成本。

性能優(yōu)化
針對(duì)http的"隊(duì)頭阻塞"問(wèn)題,到底如何進(jìn)行優(yōu)化呢?
并發(fā)連接:可以對(duì)一個(gè)域名并發(fā)發(fā)送多個(gè)連接,一個(gè)隊(duì)頭阻塞,將其后面的請(qǐng)求掛載到其他隊(duì)列上,以此緩減"隊(duì)頭阻塞問(wèn)題"。用數(shù)量解決質(zhì)量問(wèn)題
總結(jié)
早期的 HTTP 協(xié)議使用短連接,收到響應(yīng)后就立即關(guān)閉連接,效率很低
HTTP/1.1 默認(rèn)啟用長(zhǎng)連接,在一個(gè)連接上收發(fā)多個(gè)請(qǐng)求響應(yīng),提高了傳輸效率
服務(wù)器會(huì)發(fā)送“Connection: keep-alive”字段表示啟用了長(zhǎng)連接
報(bào)文頭里如果有“Connection: close”就意味著長(zhǎng)連接即將關(guān)閉
分割線
往期推薦
文章也會(huì)持續(xù)更新,可以微信搜索「 邁莫coding 」第一時(shí)間閱讀。每天分享優(yōu)質(zhì)文章、大廠經(jīng)驗(yàn)、大廠面經(jīng),助力面試,是每個(gè)程序員值得關(guān)注的平臺(tái)。

你點(diǎn)的每個(gè)贊,我都認(rèn)真當(dāng)成了喜歡
