과도한 TIME_WAIT를 피하기 위해 IP_TRANSPARENT를 사용하는 방법

과도한 TIME_WAIT를 피하기 위해 IP_TRANSPARENT를 사용하는 방법

IP_TRANSPARENTTCP/IP 연결을 사용하면 "너무 많은 TIME_WAIT" 문제를 피할 수 있다고 들었습니다 . RSTa 는 연결을 끊는 데 사용되는 것 같지만 FINand 는 아닙니다 ACK.

그러나 나는 이것을 달성하는 방법을 잘 이해하지 못합니다.

답변1

어떤 OS를 사용하고 있는지 언급하지 않았으므로 GNU/Linux라고 가정합니다("UNIX 및 Linux"이므로 이는 잘못된 가정일 수 있음).

커널 동작 조정

Linux에서 런타임 시 TCP 스택 조정은 일반적으로 sysctl및/또는 procfs를 사용하여 수행됩니다.

따라서 아마도 다음을 살펴봐야 합니다.

  • TCP(7) 맨페이지
  • Documentation/sysctl/커널 소스 코드 아래의 파일. (당신은 또한 사용할 수 있습니다이 웹사이트).

이를 허용하는 옵션/매개변수가 있는지 확인하세요.

더 나아가

커널 소스 코드(net/ipv4/tcp.c) 닫기 위해 FIN 플래그를 사용하는 것은 "하드코드"되어 변경할 수 없는 것 같습니다...죄송합니다.

어쩌면 이 동작을 변경하기 위해 패치를 작성해 볼 수도 있지만... 프로덕션 서버에 그런 패치를 적용하지는 않을 것입니다 ;-)

결론적으로

요청하신 내용을 수행할 방법이 없는 것 같습니다.

그래도 net.ipv4.tcp_fin_timeout(http://www.net.ipv4.tcp_fin_timeout에서도 사용 가능)과 같은 다른 매개변수를 조정하여 "너무 많은 TIME_WAIT" 문제를 완화할 수 있습니다 /proc/sys/net/ipv4/tcp_fin_timeout.

애플리케이션 소스 코드가 있는 경우 setsockopt()생성된 소켓을 사용하여 해당 동작을 조정할 수도 있습니다.

답변2

IP_TRANSPARENT는 아니지만 문제에 대한 다른 해결책이 있을 수 있습니다.

(코드 블록을 읽을 수 있도록 주석이 아닌 답변으로 게시됨)

Linux 시스템이 서버가 아닌 클라이언트인 경우 /etc/sysctl.conf에서 다음을 한 번 또는 함께 실험해 볼 수 있습니다 sysctl -p. 그런 다음 각 방법의 기능을 검토하고 각 방법이 사용하기에 적합한지 확인하십시오.

net.ipv4.ip_local_port_range = 2000 65535
net.ipv4.tcp_tw_reuse = 1

잔혹한 세부 사항을 설명하는 훌륭한 기사:https://vincent.bernat.ch/en/blog/2014-tcp-time-wait-state-linux

관련 정보