[Network] TCP, HTTP Keep alive

김지환·2023년 2월 1일
0

TCP Keep-alive 란?

Keep alive 기능이란 single connection으로 여러 request, response 들을 주고 받을 수 있게끔 해주는 persistent connection을 만드는 기능중 하나이다.

keep-alive 기능을 사용하는 이유?

keep-alive 기능을 사용했을 때 얻을 수 있는 장점은 connection을 오래 유지함으로서 얻어지는 장점이다.

  • 매 request 마다 새로운 connection을 맺을 필요가 없기 때문에 3-Way handshake를 하지 않아 해당 작업을 하면서 생기는 round-trip을 줄이기 때문에 latency 를 감소시킬 수 있다.
  • 많은 양의 connection을 맺고 끊음으로서 발생할 수 있는 네트워크 혼잡 상황을 방지할 수 있다.

하지만 keep-alive 로 인해 발생되는 문제도 존재한다.

client 가 의도적으로든 아니든 지속적으로 connection을 점유하고 있기 때문에 server 단에서 connection을 맺을 socket이 부족해지는 문제가 발생할 수도 있다.

이에 따른 처리 방식을 server에서 충분히 해주어야 문제를 줄일 수 있다.

server 에서 keep-alive 설정값 조정 (Linux)

keep-alive 값을 셋팅하는데에 3가지 요소를 지정할 수 있다.

  • net.ipv4.tcp_keepalive_time = 600
  • net.ipv4.tcp_keepalive_intvl = 60
  • net.ipv4.tcp_keepalive_probes = 20

위와 같이 셋팅이 되어 있다면 client 와 server 간 connection이 맺어지고 나서 600초 이후 부터 20 번 60초 간격으로 소량의 packet을 client에게 보내면서 응답을 기다린다. 최종 마지막 패킷까지 응답이 없을 시에 connection을 회수하게 된다.

해당 값은 sysctl 명령어를 통해서 설정할 수도 있고 sysctl configuration을 직접 편집기로 수정해서 설정할 수도 있다.

configuration 파일은

  • /run/sysctl.d/*.conf
  • /etc/sysctl.d/*.conf
  • /usr/local/lib/sysctl.d/*.conf
  • /usr/lib/sysctl.d/*.conf
  • /lib/sysctl.d/*.conf
  • /etc/sysctl.conf

다음 위치중에 존재할 것이고 sysctl --system 명령어를 사용하면 해당 위치를 모두 탐색하면서 configuration을 찾고 해당 내용을 reload 하게 된다.
아래는 configuration 예시 keepalive 설정 이외에도 다양한 kernel 설정값을 적용할 수 있다.

# /etc/sysctl.conf - Configuration file for setting system variables
# See /etc/sysctl.d/ for additional system variables.
# See sysctl.conf (5) for information.
#

#kernel.domainname = example.com

# Uncomment the following to stop low-level messages on console
#kernel.printk = 3 4 1 3

##############################################################3
# Functions previously found in netbase
#

# Uncomment the next two lines to enable Spoof protection (reverse-path filter)
# Turn on Source Address Verification in all interfaces to
# prevent some spoofing attacks
#net.ipv4.conf.default.rp_filter=1
#net.ipv4.conf.all.rp_filter=1

# Uncomment the next line to enable TCP/IP SYN cookies
# See http://lwn.net/Articles/277146/
# Note: This may impact IPv6 TCP sessions too
#net.ipv4.tcp_syncookies=1

# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1

# Uncomment the next line to enable packet forwarding for IPv6
#  Enabling this option disables Stateless Address Autoconfiguration
#  based on Router Advertisements for this host
#net.ipv6.conf.all.forwarding=1
...

HTTP keep alive 는?

TCP, HTTP 둘 다에 keep alive 개념이 있는데 둘은 약간의 차이가 있다 tcp keep-alive는 connection을 지속적으로 얼마나 유지하느냐에 초점을 맞추고 http 에서의 keep-alive는 최대 얼마동안 connection을 유지할 것인가가 다르다.

아래는 http header 에 있는 keep-alive에 대한 정보이다.

HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Thu, 11 Aug 2016 15:23:13 GMT
Keep-Alive: timeout=5, max=1000
Last-Modified: Mon, 25 Jul 2016 04:32:39 GMT
Server: Apache

http 에서의 connection유지는 정해진 timeout 만큼만 유지를 하고 해당 시간 동안 packet 교환이 없다면 server 측에서 connection을 회수하게 된다.

따로 packet을 보내면서 연결을 유지할까? 말까? 에 대한 판단을 하지 않는다는 차이가 있다.

HTTP1.1 로 넘어와서는 keep-alive기능이 default로 설정되어 있다.

profile
Developer

0개의 댓글