1. 程式人生 > >當 HTTP 連線池遇上 KeepAlive 時 http的keep-alive和tcp的keepalive區別

當 HTTP 連線池遇上 KeepAlive 時 http的keep-alive和tcp的keepalive區別

https://mp.weixin.qq.com/s?__biz=MzUzMTA2NTU2Ng==&mid=2247485891&idx=2&sn=82dd4786e38e23a10fa9210745c99130&chksm=fa497672cd3eff64fb06873ba909140f6f839f9565e2815eff5476102e91b60f46b67ea5acab&mpshare=1&scene=1&srcid=1224grAV7qLPEUdAheKysfbY&key=2839d46a2ccd1ada80a45616e1459f652a2d24283411ee5192afdf9e25742273e3831395db8536585af5fe7013dc05cc705f68ab85bda36bec98f5ebbd16eb072fb6615bfaaa25fdaefe047387efad61&ascene=0&uin=MTA2NzUxMDAyNQ%3D%3D&devicetype=iMac+MacBookAir6%2C2+OSX+OSX+10.10.5+build(14F2511)&version=11020012&lang=zh_CN&pass_ticket=NKOOH07PkTOF951qDy4B3Lw7qqHzzY35y1dPWQP56ICdSnZ6tBfyKRtR6PKeE1%2FM

 

1)該文有一個錯誤之處 :

http的keepalive:用於http協議。在http 1.1中,為了解決長連線提出的。

這個並不是http 1.1中提出的,1.0中已提出,但需要客戶端顯式描述keeplive,而在http 1.1中,預設開啟

 

2)http的keep-alive和tcp的keepalive區別

 

3)tomcat http 1.0實現

tomcat8中,如果傳送的是http1.0的協議。 tomcat8返回的均是1.1的協議。並且不管請求的header有沒有Connection:keepalive ,均會在返回的header中加上connection:close 。下面是訪問tomcat8的截圖:

  • GET請求是http 1.0,但是返回的是1.1的協議:

  • 返回的header裡面有Connection:close

 

4)tomcat http 1.1實現

tomcat8主要有兩個引數來控制keepalive的機制。keepAliveTimeout 和maxKeepAliveRequests

  • keepAliveTimeout: 預設和soTimeout 值保持一致,該值為20000ms,也就是在這麼長時間內沒有通訊,tomcat會關閉掉該連線。設定為-1 則代表不會關閉該連線。

  • maxKeepAliveRequests :預設為100,也就是在keepAliveTimeout時間內,如果使用次數超過100,則會關閉掉該連線。設定為-1,則代表不會關閉連線。在關閉後,會在返回的header上面加上Connection:close 。

如果需要tomcat保持長連線:可配置 maxKeepAliveRequests = "-1" keepAliveTimeout=-"-1" ,則tomcat8不會關閉掉該連線。