天天看點

http1.0 http1.1 keepalive

1、背景

    keepalive是就是通常所稱的長連接配接。keepalive帶來的好處是可以減少tcp連接配接的開銷,這對于短response body的請求效果更加明顯。同時,可以為采用http協定的互動式應用提供良好的session支援。

    hapxoxy作為一款開源的loadbalance,其最新的1.3.22(stable版本)不能支援keepalive。(其中自從1.4.dev5開始也支援client端的keepalive)  

2、keepalive的原理

    在http1.0和http1.1協定中都有對keepalive的支援。其中http1.0需要在request中增加”connection: keep-alive“ header才能夠支援,而http1.1預設支援。

    http1.0 keepalive支援的資料互動流程如下:

    a)client發出request,其中該request的http版本号為1.0。同是在request中包含一個header:”connection: keep-alive“。

    b)web server收到request中的http協定為1.0及”connection: keep-alive“就認為是一個長連接配接請求,其将在response的header中也增加”connection: keep-alive“。同是不會關閉已建立的tcp連接配接。

    c)client收到web server的response中包含”connection: keep-alive“,就認為是一個長連接配接,不close tcp連接配接。并用該tcp連接配接再發送request。(跳轉到a))

http1.1 keepalive支援的資料互動流程如下:

    a)client發出request,其中該request的http版本号為1.1。

    b)web server收到request中的http協定為1.1就認為是一個長連接配接請求,其将在response的header中也增加”connection: keep-alive“。同是不會關閉已建立的tcp連接配接。

3、patch實作思路

   haproxy client keepalive支援的patch主要解決三個問題:

   a)”connection: keep-alive“ header處理問題

   參見keepalive的原理,client keepalive對于這個header的處理是在對開啟client keepalive的frontend上經過的response中增加”connection: keep-alive“ header;

   b)怎麼處理重新觸發client發過來的request的時機問題

   從keepalive的原理中可以得知,next request是在完成before request的response被client接收的情況下才發出。是以需要在向client寫完before request的response後才能觸發。而寫完response可以通過計算response中body的長度資訊得到(content-length或者chunk資訊)

   c)怎麼觸發not_first request

   在haproxy中對于對于連接配接的管理是通過session這個資料結構來實作的。觸發not_first request就通過重置session這個資料結構來實作。

4、patch的配置方式

    配置方式為在每個proxy的front中配置添加:

    option cli_keepalive

5、patch代碼

附件為基于該版本的client keepalive patch。

該patch隻支援client端的keepalive。

繼續閱讀