最近在做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是一個(gè)”請求-響應(yīng)”
協(xié)議吟逝,它的keep-alive主要是為了讓多個(gè)http請求共享一個(gè)Tcp連接耻涛,以避免每個(gè)Http又新建一個(gè)TCP連接铺浇。每個(gè)Http服務(wù)器默認(rèn)的keep-alive時(shí)間可能是不一樣的叛赚。
TCP keep-alive
Tcp的keep-alive是Tcp協(xié)議的一種保鮮裝置夹厌,當(dāng)Tcp請求響應(yīng)結(jié)束后匪煌,經(jīng)過tcp_keep-alive_time時(shí)間后责蝠,服務(wù)器會(huì)發(fā)出監(jiān)測包去看看改Tcp連接是否還是繼續(xù)連接的,是否已經(jīng)出現(xiàn)了網(wǎng)絡(luò)問題萎庭,是否客戶端崩潰了等等問題霜医。如果發(fā)現(xiàn)出現(xiàn)了問題,那么服務(wù)端就會(huì)去關(guān)閉該TCP連接驳规。
關(guān)于TCP心跳
在目前這兩年的移動(dòng)互聯(lián)網(wǎng)火熱的環(huán)境下支子,推送應(yīng)用的非常多。推送實(shí)現(xiàn)的就是通過TCP長連接實(shí)現(xiàn)的达舒,因?yàn)橐苿?dòng)網(wǎng)絡(luò)很多時(shí)候都會(huì)不穩(wěn)定值朋,另外NAT過一段時(shí)間就會(huì)刷新,所以而要如何保證客戶端和服務(wù)器端連接就成了一個(gè)問題。TCP心跳包就是客戶端監(jiān)測連接的巩搏,它先發(fā)送一個(gè)心跳包到服務(wù)器昨登,服務(wù)器再Ask,通過這種方式判斷是否目前的長連接是否可用贯底,如果斷了丰辣,則通知上層應(yīng)用,并關(guān)閉連接禽捆,另外發(fā)送心跳包也是避免一段時(shí)間都沒有通信笙什,NAT超時(shí),NAT表被刷新胚想,導(dǎo)致連接失效琐凭。
HTTP與TCP keep-alive聯(lián)系
直接介紹一個(gè)場景就可能更容易明白了∽欠客戶端發(fā)送了一個(gè)Http請求统屈,服務(wù)器響應(yīng)后胚吁,判斷這個(gè)Http
是否是keep-alive
模式的,如果不是則關(guān)閉連接,如果是keep-alive愁憔,則等待keep-alive time后再關(guān)閉腕扶,如果這期間再收到一個(gè)http 請求,則繼續(xù)等待最后一個(gè)請求的keep-alive time
時(shí)間吨掌,直到keep-alive time
時(shí)間內(nèi)沒有收到請求半抱,則關(guān)閉。
上面是HTTP keep-alive的膜宋,而TCP是它下一層的協(xié)議代虾,本身TCP是長連接的,除非主動(dòng)關(guān)閉激蹲。HTTP的keep-alive time一般是15ms, 30ms之類的棉磨,如果是超過了HTTP的keep-alive time
時(shí)間,則HTTP會(huì)關(guān)閉TCP連接学辱。本身TCP是不會(huì)關(guān)閉連接的乘瓤,TCP的keep alive是TCP的保鮮裝置,在keep alive timeout 后服務(wù)端發(fā)送一個(gè)監(jiān)測包來判斷連接是否仍保持著策泣,如果還是可連接衙傀,則繼續(xù)保持,它不會(huì)主動(dòng)關(guān)閉連接的萨咕。而心跳包是為了防止NAT超時(shí)统抬。