綜上,http連接保持時間是由服務(wù)端的消息頭connection字段和keep-alive字段定的。 在上面前兩種情況,請求的是同一個服務(wù)端,那么為什么一個返回的是短連接,一個返回的是長連接呢?這里轉(zhuǎn)一下 這篇文章的解釋: 不論request還是response的header中包含了值為close的connection,都表明當(dāng)前正在使用的tcp鏈接在請求處理完畢后會被斷掉。以后client再進(jìn)行新的請求時就必須創(chuàng)建新的tcp鏈接了。 HTTP Connection的 close設(shè)置允許客戶端或服務(wù)器中任何一方關(guān)閉底層的連接,雙方都會要求在處理請求后關(guān)閉它們的TCP連接。 補(bǔ)充 · TCP長短連接 在網(wǎng)上搜資料的時候,看到很多“HTTP協(xié)議的長連接和短連接,實(shí)質(zhì)上是TCP協(xié)議的長連接和短連接”。 HTTP和TCP是不同兩層的東西,它們怎么會是一樣的呢?HTTP是請求/響應(yīng)模式的,就是說我們發(fā)一個請求一定要有一個回應(yīng)。最直觀的就是,瀏覽器上發(fā)請求,得不到響應(yīng)就會一直轉(zhuǎn)圈圈。 而TCP并不是一定要有響應(yīng)。大家以前使用socket模擬一個IM聊天,A跟B打完招呼,完全可以不用等待B的回應(yīng),就自己關(guān)掉連接的。 · TCP keep-alive 另外還有HTTP協(xié)議的keep-alive和TCP的keep-alive含義是有差別的。HTTP的keep-alive是為了維持連接,以便復(fù)用連接。通過使用keep-alive機(jī)制,可以減少tcp連接建立次數(shù),也意味著可以減少TIME_WAIT狀態(tài)連接,以此提高性能和提高h(yuǎn)ttpd服務(wù)器的吞吐率(更少的tcp連接意味著更少的系統(tǒng)內(nèi)核調(diào)用,socket的accept()和close()調(diào)用)。但是,長時間的tcp連接容易導(dǎo)致系統(tǒng)資源無效占用。配置不當(dāng)?shù)膋eep-alive,有時比重復(fù)利用連接帶來的損失還更大。 而tcp keep-alive是TCP的一種檢測TCP連接狀況的機(jī)制,涉及到三個參數(shù)tcp_keepalive_time, tcp_keepalive_intvl, tcp_keepalive_probes。 當(dāng)網(wǎng)絡(luò)兩端建立了TCP連接之后,閑置(雙方?jīng)]有任何數(shù)據(jù)流往來)了tcp_keepalive_time后,服務(wù)器內(nèi)核就會嘗試向客戶端發(fā)送偵測包,來判斷TCP連接狀況(有可能客戶端崩潰、強(qiáng)制關(guān)閉了應(yīng)用、主機(jī)不可達(dá)等等)。如果沒有收到對方的回答(ack包),則會在 tcp_keepalive_intvl后再次嘗試發(fā)送偵測包,直到收到對方的ack。如果一直沒有收到對方的ack,一共會嘗試 tcp_keepalive_probes次。如果嘗試tcp_keepalive_probes,依然沒有收到對方的ack包,則會丟棄該TCP連接。TCP連接默認(rèn)閑置時間是2小時,一般設(shè)置為30分鐘足夠了。
|
|
來自: liang1234_ > 《http》