tcp keep-alive
tcp keep-alive提供的是一種鏈路有效檢測機(jī)制,當(dāng)鏈路建立之后,可能經(jīng)過很長時(shí)間應(yīng)用程序一直沒發(fā)送數(shù)據(jù)厚宰,這時(shí)有可能鏈路因?yàn)槟撤N原因已經(jīng)失效了递胧,如果對這種情況不做處理那肯定有問題,tcp對于這種情況提供了keep-alive機(jī)制叁怪,該機(jī)制在操作系統(tǒng)內(nèi)核有3個(gè)配置參數(shù):
- /proc/sys/net/ipv4/tcp_keepalive_time
- /proc/sys/net/ipv4/tcp_keepalive_intvl3
- /proc/sys/net/ipv4/tcp_keepalive_probes
當(dāng)tcp鏈路空閑超過tcp_keepalive_time時(shí)間后,服務(wù)器內(nèi)核會(huì)向客戶端發(fā)送探測報(bào)文深滚,來檢測tcp連接是否正常奕谭,如果收到客戶端的ack,那么在下次空閑時(shí)間再一次超過tcp_keepalive_time后再進(jìn)行檢測成箫;如果沒有收到客戶端的ack展箱,那么隔tcp_keepalive_intvl3時(shí)間后再發(fā)一次檢測鏈路的空報(bào)文,如果重試tcp_keepalive_probes次后依然沒有收到客戶端的ack蹬昌,則判定連接已失效混驰,關(guān)閉連接。
雖然tcp的keep-alive機(jī)制能夠定時(shí)清理失效的連接皂贩,但這個(gè)tcp_keepalive_time時(shí)間一般比較長栖榨,tcp默認(rèn)是2小時(shí),在關(guān)閉失效連接前如果客戶端發(fā)起通信則會(huì)失敗明刷,所以不能完全通過該機(jī)制解決鏈路有效性問題婴栽。
tcp的keep-alive機(jī)制發(fā)送的探測報(bào)文是將之前TCP報(bào)文的序列號減1,并設(shè)置1個(gè)字節(jié)辈末,內(nèi)容為“00”的應(yīng)用層數(shù)據(jù)愚争,這樣對端能識別這個(gè)報(bào)文是tcp keep-alive探測報(bào)文并進(jìn)行ack。
http keep-alive
http keep-alive是應(yīng)用層的機(jī)制挤聘,是http server端的一種長連接機(jī)制轰枝。該機(jī)制彌補(bǔ)了http請求每次請求都要?jiǎng)?chuàng)建連接的缺陷,只要客戶端在keep-alive時(shí)間內(nèi)發(fā)起下一次請求组去,就能復(fù)用之前的連接鞍陨。
在HTTP/1.0協(xié)議中,客戶端通過在http請求頭中添加一個(gè)字段 Connection: Keep-Alive从隆,當(dāng)服務(wù)器收到附帶有Connection: Keep-Alive的請求時(shí)诚撵,它也會(huì)在響應(yīng)頭中添加一個(gè)同樣的字段來使用Keep-Alive。這樣客戶端不會(huì)主動(dòng)斷開該連接键闺,在下次http請求直接用該連接寿烟,除非兩次請求的間隔超過了keep-alive的時(shí)間。當(dāng)http server端檢測到該連接超過了keep-alive時(shí)間還沒有收到請求辛燥,就會(huì)斷開該連接韧衣。
在HTTP/1.1協(xié)議中盅藻,keep-alive默認(rèn)實(shí)現(xiàn)购桑,不需要客戶端在http請求頭中添加Connection: Keep-Alive畅铭。