[t:/]$ 지식_

keepalive

2015/06/05

일반적으로 http 1.0 을 사용하면 … req-res 한 턴이 끝나면 서버 측에서 close 해버린다.

그 다음에 클라쪽에서 req를 보내면 돌아오는 것은 eof다.

eof 인 경우 소켓을 새로 열어야 한다.

이는 tcp keepalive 와 관계없이 http 1.0 이 한 턴 종료 후 close 하기 때문임. (아파치 기준)

그렇다면 http 1.1 헤더에 keepalive를 실어서 보내면 어찌되나.

아파치 쪽도 keepalive를 활성화 시켜놓은 경우..

지정한 시간 내에는 closing이 일어나지 않는다.

HTTP/1.1 200 OK\r\n
Date: Fri, 05 Jun 2015 07:09:10 GMT\r\n
Server: Apache/2.4.7 (Ubuntu)\r\n
Last-Modified: Tue, 02 Jun 2015 06:07:49 GMT\r\n
ETag: “e-51782c315cc09″\r\n
Accept-Ranges: bytes\r\n
Content-Length: 14\r\n
Keep-Alive: timeout=100, max=1\r\n
Connection: Keep-Alive\r\n
Content-Type: text/html\r\n
\r\n
hello worldi2\n\n\n\x01

keepalive max 값은 순차적으로 줄어서 0이 되면 keepalive 헤더가 보이지 않는다.

max=1 이후 마지막 패킷을 받으면 역시 아파치가 소켓을 닫는다.

이 때 클라 측에서 req하면 역시 돌아오는 것은 eof..

수십~ 수백대 수준의 소수 서버 개체와 S2S 킵얼라이브 통신을 하려면 이렇게 하는 쪽이 좋겠다.

생활가전에서 롱폴링 처리하던 것이랑 맥락상 비슷한데.. (매번 헤더부터 통으로 날아간다는 점은 다름)

  1. http 1.1을 사용함.
  2. 매 리퀘스트 마다 소켓 오픈 하지 않고, 최초에만 생성함.
  3. res 를 처리한 다음 소켓을 닫지 않음.
  4. eof 를 만나면 소켓을 다시 열어둠.. (다음 턴에 빠르게 하려고)

즉… http req-res 짝은 http 1.1 keepalive의 지배를 받고..

미리 소켓을 열어두는 것은 tcp keepalive의 지배를 받는다.

포크 할 때 소켓을 dup 처리 하려고 했더니 아파치는 좀 다른 것 같네…

libCurl 쓰기 싫어서 보니까 잔손이 좀 많이 가지만 아파치를 프리포크 모델로 돌리므로 별 문제는 없다.

현재 목적 하에서는 심지어 nonblock을 안 써도 된다. block + timeout으로 처리해도 되고, 비동기 처리를 안 해도 될 것 같다.









[t:/] is not "technology - root". dawnsea, rss