본문 바로가기
웹 프론트엔드/웹개발 용어 및 개념 정리

HTTP 와 TCP의 Keep-Alive

by 번데기 개발자 2018. 9. 6.
반응형
HTTP의 Keep-Alive


HTTP 프로토콜의 Keep-Alive는 Http의 Header의 일종입니다..

이는 HTTP/1.0에서 지원하지 않던 지속 커넥션을 가능하게 하기 위해서 쓰였습니다.


그렇다면 지속 커넥션이 뭔지부터 알아보겠습니다..

지속 커넥션을 보기 전에 HTTP 커넥션에 대해 알아보도록 하겠습니다..



HTTP/1.1 이전에는 클라이언트와 서버 사이에 트랜잭션 한번이 일어나면 HTTP Connection 이 끊어졌었습니다.

이렇게 되면, TCP 커넥션을 맺는데 발생하는 지연과 느린 시작 지연이 트랜잭션마다 발생하기 때문에, 한 웹페이지에서 여러 이미지와 HTML을 요청해야 하는 경우 성능이 매우 안좋아지게 됩니다.

그래서 이런 커넥션을 맺고 끝는데서 발생하는 지연을 없애기 위해서 한번 연결한 TCP 커넥션을 재활용하는 방법이 나왔는데, 그게 바로 지속 커넥션(Persistent connetion) 입니다.


이는 HTTP/1.1에서는 디폴트로 지원하지만, HTTP/1.0에서 지속 커넥션을 사용하려면 특정한 헤더들을 추가해줘야 한다.
바로 Connection 헤더와 Keep-Alive헤더 입니다..


HTTP 요청을 보낼때

  • Connection: Keep-Alive

와 같이 Connection 헤더에 Keep-Alive를 보낼 수 있습니다.

이는 클라이언트 측에서 커넥션을 유지하기를 바라는 요청이기 때문에, 서버가 이를 지켜준다는 보장은 없습니다.



서버는 응답으로

  • Connection: Keep-Alive
  • Keep-Alive: max=5, timeout=120 

와 같은 Keep-Alive 헤더를 추가적으로 보낼 수 있습니다.

Keep-Alive의 max 파라미터는 커넥션이 몇 개의 HTTP 트랜젝션을 처리할때까지 유지될 것인지를 의미합니다.

timeout 파라미터는 커넥션이 얼마동안 유지될 것인가를 나타내고, 위의 예시에서는 2분동안 커넥션을 유지하라는 내용입니다.


그렇지만 이 Connection:Keep-Alive는 이해를 하지 못하는 프락시들이 받게 되면 치명적인 버그가 발생하여 클라이언트와 서버간 커넥션이 이뤄지지 않습니다. (Keep-Alive, dump proxy)

Connection 헤더는 이외에도 여러 기능으로 사용되므로 공부해보시기 바랍니다.



TCP의 keepalive


keep TCP alive라고 의미를 이해하면 됩니다.

이는 연결된 TCP 소켓을 체크할 수 있고 TCP 연결이 여전히 진행중인지 혹은 끊어졌는지를 결정합니다.


기본적으로 TCP 커넥션을 맺을 때 타이머 셋을 연결합니다.

이 타이머들중 몇몇은 keepalive 절차를 다룹니다.

keepalive 타이머가 0에 도달하면 연결된 상대에게 keepalive probe 패킷을 보내게 되고 이때 probe 패킷은 아무 데이터도 들어있지 않으며 ACK 플래그만 존재합니다.

그리고 그에 대한 응답으로 데이터가 없는 ACK 플래그가 설정된 패킷을 받게 됩니다.


만약 keepalive probe를 받게 되면 커넥션이 계속 유지되는 것으로 생각할 수 있습니다.





참조)




반응형