最近在做api開發(fā),http無狀態(tài)是眾所周知的,但是剛才突然想到了http的keep-alive模式,心里有些不解,于是找了些資料,挑選了比較容易理解的摘出來,和大家分享一下.
一些詞匯的基礎(chǔ)概念:
Http協(xié)議
TCP協(xié)議
以下內(nèi)容并非原創(chuàng).
首先Http協(xié)議是建立在TCP協(xié)議的基礎(chǔ)上的,TCP是傳輸層的協(xié)議,Http是應(yīng)用層協(xié)議。Http底層也是通過TCP傳輸?shù)摹?/p>
HTTP keep-alive
Http是一個”請求-響應(yīng)”協(xié)議,它的keep-alive主要是為了讓多個http請求共享一個Tcp連接,以避免每個Http又新建一個TCP連接。每個Http服務(wù)器默認的keep-alive時間可能是不一樣的。
TCP keep-alive
Tcp的keep-alive是Tcp協(xié)議的一種保鮮裝置,當Tcp請求響應(yīng)結(jié)束后,經(jīng)過tcp_keep-alive_time時間后,服務(wù)器會發(fā)出監(jiān)測包去看看改Tcp連接是否還是繼續(xù)連接的,是否已經(jīng)出現(xiàn)了網(wǎng)絡(luò)問題,是否客戶端崩潰了等等問題。如果發(fā)現(xiàn)出現(xiàn)了問題,那么服務(wù)端就會去關(guān)閉該TCP連接。
關(guān)于TCP心跳
在目前這兩年的移動互聯(lián)網(wǎng)火熱的環(huán)境下,推送應(yīng)用的非常多。推送實現(xiàn)的就是通過TCP長連接實現(xiàn)的,因為移動網(wǎng)絡(luò)很多時候都會不穩(wěn)定,另外NAT過一段時間就會刷新,所以而要如何保證客戶端和服務(wù)器端連接就成了一個問題。TCP心跳包就是客戶端監(jiān)測連接的,它先發(fā)送一個心跳包到服務(wù)器,服務(wù)器再Ask,通過這種方式判斷是否目前的長連接是否可用,如果斷了,則通知上層應(yīng)用,并關(guān)閉連接,另外發(fā)送心跳包也是避免一段時間都沒有通信,NAT超時,NAT表被刷新,導(dǎo)致連接失效。
HTTP與TCP keep-alive聯(lián)系
直接介紹一個場景就可能更容易明白了。客戶端發(fā)送了一個Http請求,服務(wù)器響應(yīng)后,判斷這個Http是否是keep-alive模式的,如果不是則關(guān)閉連接,如果是keep-alive,則等待keep-alive time后再關(guān)閉,如果這期間再收到一個http 請求,則繼續(xù)等待最后一個請求的keep-alive time時間,直到keep-alive time時間內(nèi)沒有收到請求,則關(guān)閉。
上面是HTTP keep-alive的,而TCP是它下一層的協(xié)議,本身TCP是長連接的,除非主動關(guān)閉。HTTP的keep-alive time一般是15ms, 30ms之類的,如果是超過了HTTP的keep-alive time時間,則HTTP會關(guān)閉TCP連接。本身TCP是不會關(guān)閉連接的,TCP的keep alive是TCP的保鮮裝置,在keep alive timeout 后服務(wù)端發(fā)送一個監(jiān)測包來判斷連接是否仍保持著,如果還是可連接,則繼續(xù)保持,它不會主動關(guān)閉連接的。而心跳包是為了防止NAT超時。