Network 개념은 매우 방대하며, 저는 Network 쪽은 아니라서 자세히 정리는 하지 못할 것 같습니다.
또한, 여기서 정리한 내용이 어딘가 분명 오류가 있을거 같아서 정말 맞다고 표현하기도 어렵습니다.
다만, CLOSE_WAIT 과 TIME_WAIT 에 대한 어느정도의 지식은 필요할 거 같아서 정리를 진행하려고 합니다.
CLOSE_WAIT
서버 혹은 클라이언트가 close 요청을 받았을 때를 나타냅니다.
CLOSE_WAIT 은 다른 상태들과 달리, 프로세스 종료 혹은 네트워크 재시작 외에는 제거할 방법이 없습니다.
만약 서버와 클라이언트가 동시에 close 요청을 받게되면, 양쪽에서 CLOSE_WAIT 현상이 나타나고 교착상태에 빠지게됩니다.
CLOSE_WAIT 를 제거하고 싶은 경우 아래 명령어를 환경에 맞춰 수정한 뒤 수행하면 됩니다.
아래스크립트는 다음과 같은 의미를 내포합니다.
192.168.0.50 서버의 22581 포트에서 CLOSE_WAIT 로 되어있는 PID 를 kill 합니다.
$ netstat -nap | grep 192.168.0.50 | grep :22581 | grep CLOSE_WAIT | awk '{print $7}' | cut -d \/ -f1 | grep -oE "[[:digit:]]{1,}" | xargs kill
TIME_WAIT
TCP 접속부터 종료까지의 가장 마지막 단계이며, 먼저 close() 를 요청한 쪽에서 최종적으로 남게됩니다.
TIME_WAIT 유지시간은 include/net/tcp.h 파일에 고정값 60초로 되어 있으며 조절 할 수 없습니다.
# grep TCP_TIMEWAIT_LEN tcp.h #define TCP_TIMEWAIT_LEN (60*HZ)
하지만 클라이언트가 굉장히 빈번한 상황에서 TIME_WAIT 유지시간은 소켓의 최대개수에 영향을 미칠 수 있으므로(사실 거의 발생할 리 없지만), 프로퍼티 설정을 통해 TIME_WAIT 로 되어있는 소켓을 바로 재사용 할 수 있도록 설정할 수 있습니다.
# cat sysctl.conf | grep tcp_tw_reuse net.ipv4.tcp_tw_reuse = 1
# sysctl -p | grep tcp_tw_reuse net.ipv4.tcp_tw_reuse = 1
만약, 서버와 클라이언트가 NAT 환경이 아닌, 1 : 1 로 직접 연결되는 경우 아래 프로퍼티를 설정함으로 써 TIME_WAIT 시간을 줄일 수 있습니다.
또한, 아래 프로퍼티가 활성화 되어있는 경우, TCP_TIMEWAIT_LEN 설정값이 아닌 retransmission timeout (3.5초) 값으로 적용됩니다.
그렇다고 하여 TCP_TIMEWAIT_LEN 값이 변경된 것은 아닙니다.
# cat sysctl.conf | grep tcp_tw_recycle net.ipv4.tcp_tw_recycle = 1
# sysctl -p | grep tcp_tw_recycle net.ipv4.tcp_tw_recycle = 1
참고url
'Linux > 개념' 카테고리의 다른 글
[LINUX] Linux 의 OS errno 알아보기 (0) | 2018.09.14 |
---|---|
[LINUX] 기본 명령어로 메인보드, 씨피유, 메모리, 디스크, 네트워크 모델명 및 정보 확인하기 (0) | 2018.08.27 |
[LINUX] tcpdump 로 전송되는 데이터 확인하기 (0) | 2018.06.18 |
[LINUX] yum 명령어가 실행되지 않을 때 Could not resolve host .. 해결하기 (0) | 2018.06.13 |
[LINUX] SSH 접속이 느린 현상 해결하기 (0) | 2018.06.12 |