Ubuntu 12.04.3 (커널 3.8.0-31- 일반)을 실행하는 컴퓨터 ( "서버")에서 수신 대기하는 TCP 서버가 있습니다. 서로 다른 두 클라이언트 시스템에서 연결을 수신합니다. 머신 A는 Ubuntu 12.04.4 (3.11.0-17-generic)를 실행하고 머신 B는 Ubuntu 11.10 (3.0.0-32-server)을 실행합니다.
서버에서 TCP 타임 스탬프를 활성화 한 경우 (sysctl net.ipv4.tcp_timestamps = 1) 경우에 따라 시스템 A의 SYN 패킷이 "무시"됩니다. 서버에서 tcpdump를 사용하여 (비 차단 모드에서) SYN이 올바르게 도착하고 올바른 체크섬으로 응답이 없음-SYN / ACK 및 RST가 없음을 알 수 있습니다. 머신 A는 포기하기 전에 SYN을 여러 번 재전송합니다. 머신 A에서 실행되는 클라이언트 소프트웨어 (이 경우에는 wget)는 즉시 새로운 연결로 재 시도하고 성공하여 즉시 SYN / ACK를 얻습니다.
머신 B는 동일한 서버에 문제가 없으며 트래픽이 정상으로 보입니다. 머신 A와 동일한 TCP 옵션을 사용하고 있습니다 (캡처 파일에서 볼 수 있음). 서버에서 TCP 타임 스탬프를 비활성화하면 모든 것이 제대로 작동합니다.
무시 된 SYN 패킷의 타임 스탬프는 나에게 유효한 것처럼 보이지만 왜 그들이 문제를 일으키는 지 또는 근본적인 원인인지 확실하지 않습니다.
https://www.dropbox.com/s/onimdkbyx9lim70/server-machineA.pcap 여기에 익명의 pcap을 넣었습니다 . 서버 A (10.4.0.76)가 HTTP GET (패킷 1 ~ 10)을 성공적으로 수행 한 다음 1 초 후에 동일한 URL을 다시 가져 오려고하지만 (패킷 11 ~ 17) 서버 (10.76.0.74)에서 가져 왔습니다. SYN이 무시되었습니다. 패킷 18-27은 또 다른 성공입니다.
" 이 서버가 SYN 패킷에 대한 응답으로 SYN / ACK 패킷을 보내지 않는 이유 "에 설명 된 것과 비슷한 문제라고 생각하며 타임 스탬프를 비활성화하는 것은 현재 상황을 이해하고 싶은 해결 방법입니다. 이것은 단지 버그입니까?
로컬 방화벽이 실행되고 있지 않습니다. 서버는 꽤 많은 TCP 연결 (한 번에 약 32K)을 처리하지만 사용 가능한 메모리 / CPU가 많이 있습니다. pcap에 표시된 테스트 시점에 시스템 A와 서버 사이에 다른 TCP 연결이 없었습니다. 서버 응용 프로그램의 수락 대기열이 갑자기 채워지고 있다는 신호는 없습니다 (내가 추정하는 두 클라이언트에 영향을 미칩니다). 서버에서 가져온 pcap에서 패킷이 정상으로 보이므로 네트워크 장치가 개입하는 것처럼 보이지 않습니다.
나는 원래 이것을 우분투 포럼에 게시했지만 뒤늦게 보면 더 적절한 위치 일 수 있습니다. 단서의 대출을 기대합니다.