작은 TCP 연결은 성공하지만 큰 TCP 연결은 실패하는 이유는 무엇입니까?

작은 TCP 연결은 성공하지만 큰 TCP 연결은 실패하는 이유는 무엇입니까?

때때로 Linux 시스템에서 다음과 같은 이상한 동작을 볼 수 있습니다.

핑을 할 수 있고 때로는 일부 서비스를 사용할 수도 있지만 네트워킹이 매우 나쁩니다.

예를 들어 이제 랩톱( -j MASQUERADE)을 통해 연결을 라우팅하고 다음 사항을 관찰합니다. TCP 연결을 거의 수행하지 않으면(서버가 나에게 데이터를 거의 보내지 않음) 계속 진행됩니다.

# nc 86.57.151.3 80
GET /404
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

/proc/net/ip_conntrack은 tcp 6 431998 ESTABLISHED src=192.168.99.9 dst=86.57.151.3 sport=49104 dport=80 src=86.57.151.3 dst=93.125.21.218 sport= 80 dport=49104 [ASSURED] mark=0 use=2"GET /404"를 입력하기 전에 발생했습니다.

하지만 큰 연결을 할 때는:

root@localhost:~# nc 86.57.151.3 80
GET /

그것은 멈춘다. "GET /"을 입력하기 전에는 평소와 같이 ESTABLISHED ASSURED가 표시되지만 Return을 누르면 로 이동합니다 tcp 6 0 CLOSE_WAIT src=192.168.99.9 dst=86.57.151.3 sport=56991 dport=80 src=86.57.151.3 dst=93.125.21.218 sport=80 dpo rt=56991 [ASSURED] mark=0 use=2. 패킷이 수신되지 않았습니다. 마지막으로 Ctrl+C를 누르면 FIN이 서버로 전송되고 Wireshard는 서버의 FIN이 "순서가 잘못되었습니다"라고 불평합니다. 마치 답장을 어딘가에 떨어뜨린 것처럼 말이죠.

라우터에서 동일한 작업 nc 86.57.151.3 80을 수행하면 GET /작동합니다.

무엇이 잘못되었는지 디버깅하는 방법은 무엇입니까?

답변1

이는 MTU 및 필터링된 ICMP 메시지의 문제입니다.

해결 방법은 클라이언트 장치에서 MTU를 설정하거나 라우터에서 TCP MSS 클램핑을 사용하는 것입니다.

iptables -t mangle -A FORWARD -o ppp4 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

관련 정보