[번역] Coping with the TCP TIME-WAIT state on busy Linux servers - Vincent Bernat (WIP)
해당 글은 https://vincent.bernat.ch/en/blog/2014-tcp-time-wait-state-linux글을 번역하였습니다.
Coping with the TCP TIME-WAIT state on busy Linux servers
Do not blindly enable net.ipv4.tcp_tw_recycle. A full explanation of TIME-WAIT state in Linux.
vincent.bernat.ch
TL;DR
net.ipv4.tcp_tw_recycle 옵션을 활성화 시키지 마세요. Linux4.12 버전 이후로 존재하지 않는 옵션입니다. 또한 많은 시간 동안 TIME_WAIT 은 유해한 소켓이 아니었습니다. 그렇지 않다면, 추천하는 방식으로 진행해 보세요. 추천하는 방식은 글 가장 아래에 있습니다.
리눅스 커널 문서는 net.ipv4.tcp_tw_recycle 과 net.ipv4.tcp_tw_reuse 가 정확히 어떤 일을 하는지 친절히 알려주지 않습니다. 그래서인지 여러 곳에서 이 두 값을 1로 해두면 TIME_WAIT 상태를 줄일 수 있다는 글들을 찾아볼 수 있습니다. 하지만 실제로 tcp(7) 매뉴얼 페이지를 보면 net.ipv4.tcp_tw_recycle 옵션은 NAT 를 사용하여 연결되고 있는 상황에서는 오작동 할 수 있기에, 굉장히 신중하게 다뤄야 할 옵션입니다. 그리고 이 옵션을 잘못 설정한 경우, 우리는 어떤것이 문제인지 감지하기 어려워질 것입니다.
Enable fast recycling of TIME-WAIT sockets. Enabling this option is not recommended since this causes problems when working with NAT (Network Address Translation). - tcp_tw_recycle 관련하여
이 문서에서는 보다 자세하게 TIME_WAIT 을 다루는 방법에 대해서 설명합니다. 주의해야할 점은 우리는 지금 리눅스의 TCP스택을 보고 있는 것이므로, Netfilter 연결관련된 부분은 관련이 없음을 알고 가야 합니다.
TIME_WAIT 상태에 대해서
아래 TCP 상태 다이어그램을 보면서,TIME_WAIT 상태에 대해서 잠깐 복습해 봅시다.
위 다이어그램에서 알 수 있는 것은, 먼저 연결을 닫는 쪽에서만 TIME_WAIT. 상태에 들어가고, 반대쪽은 빠르게 연결을 끊는 다는 것을 알 수 있습니다.
현재 서버에 연결된 상태들을 아래와 같이 확인해 볼 수 있습니다.
$ ss -tan | head -5
LISTEN 0 511 *:80 *:*
SYN-RECV 0 0 192.0.2.145:80 203.0.113.5:35449
SYN-RECV 0 0 192.0.2.145:80 203.0.113.27:53599
ESTAB 0 0 192.0.2.145:80 203.0.113.27:33605
TIME-WAIT 0 0 192.0.2.145:80 203.0.113.47:50685
목적
TIME_WAIT 가 존재하는 이유는 크게 두가지가 있습니다.
첫번째, 대표적으로 알려진 이유로 "지연된 세그먼트를 방지" 하기 위한 목적이 있습니다.