서버가 SYN 패킷에 대한 응답으로 SYN / ACK 패킷을 보내지 않는 이유


46

최근에 우리는 웹 사이트를 탐색하는 mac 및 Linux 사용자로 주로 제한되는 TCP 연결 문제를 알게되었습니다.

사용자 관점에서 볼 때, 그것은 우리 웹 사이트와의 연결 시간이 정말 길다 (> 11 초).

이 문제의 기술적 인 서명을 추적했지만 문제가 발생하는 이유 또는 해결 방법을 파악할 수 없습니다.

기본적으로 클라이언트 시스템이 TCP 연결을 설정하기 위해 SYN 패킷을 보내고 웹 서버가이를 수신하지만 SYN / ACK 패킷으로 응답하지 않습니다. 클라이언트가 많은 SYN 패킷을 보낸 후 서버는 마지막으로 SYN / ACK 패킷으로 응답하며 나머지 연결에는 문제가 없습니다.

물론 문제에 대한 키커 : 간헐적이며 항상 발생하지는 않습니다 (시간의 10-30 % 사이에 발생하지만)

우리는 Fedora 12 Linux를 OS로 사용하고 Nginx를 웹 서버로 사용하고 있습니다.

wireshark 분석의 스크린 샷

wireshark 분석의 스크린 샷

최신 정보:

클라이언트에서 창 크기 조정을 끄면 문제가 발생하지 않았습니다. 이제 서버 측 해상도가 필요합니다 (모든 클라이언트 가이 작업을 수행 할 수는 없습니다) :)

최종 업데이트 :

해결책은 공개적으로 액세스 할 수있는 서버에서 TCP 창 스케일링 TCP 타임 스탬프 를 모두 끄는 것이 었습니다 .


1
우리는 tcpdump가 발생하는 것을 볼 필요가 있다고 생각합니다.
coredump 2013

리버스 DNS를 기반으로하는 acl 또는 규칙이 있습니까? 클라이언트와 서버 간의 연결 이상을 살펴 봐야 할 수도 있습니다. 아마도 DNS 조회 시간이 초과 되었습니까?
Zoredache

@coredump : 여기 i.imgur.com/Bnzrm.png 문제를 보여주는 wireshark 분석의 스크린 샷이 있습니다 (스트림 만 내보내는 방법을 알 수 없었습니다 ...)
codemonkey

@Zoredache : 아니요. 리버스 DNS를 기반으로하는 acl이나 규칙이 없습니다. 이것은 공개 웹 서버이며 누구나 액세스 할 수 있습니다
codemonkey

직감이지만 서버에서 들어오는 연결 속도 제한을하고 있습니까? iptables로 말해?
Steven 월요일

답변:


15

우리도 똑같은 문제가있었습니다. TCP 타임 스탬프를 비활성화하면 문제가 해결되었습니다.

sysctl -w net.ipv4.tcp_timestamps=0

이 변경 사항을 영구적으로 적용하려면에 항목을 작성하십시오 /etc/sysctl.conf.

TCP Window Scale 옵션을 비활성화하는 데 매우주의하십시오. 이 옵션은 인터넷을 통해 최대 성능을 제공하는 데 중요 합니다. 왕복 시간 (기본적으로 핑과 동일)이 55ms 이상인 경우 10 메가 비트 / 초 연결을 가진 사람은 최적이 아닌 전송을합니다 .

동일한 NAT 뒤에 여러 장치가있을 때이 문제가 실제로 나타났습니다. 타임 스탬프 필드에 완전히 다른 값을 입력했기 때문에 서버가 Android 장치 및 OSX 시스템에서 동시에 타임 스탬프를 보는 것이 혼란 스러울 수 있습니다.


4
여기까지 같은 토끼 구멍을 통해 난 그냥 내려 갔다 경우 다른 사람의 끝에서 : TCP 끄면 타임 스탬프 또는 높은 트래픽 링크에 심각한 성능 결과를 초래할 수 있습니다 창 스케일링, tcp_tw_recycle을 당신의 문제가 있는지 확인하기 전에 : 유래 .com / questions / 8893888 /…
nephtes

12

필자의 경우 다음 명령으로 Linux 서버에서 누락 된 SYN / ACK 응답 문제를 해결했습니다.

sysctl -w net.ipv4.tcp_tw_recycle=0

TCP 타임 스탬프는 고성능 (PAWS, 창 스케일링 등)에 유용하기 때문에 TCP 타임 스탬프를 비활성화하는 것보다 더 정확하다고 생각합니다 .

tcp_tw_recycle많은 IP 공유기가 타임 스탬프를 유지하므로 동일한 IP의 타임 스탬프가 일치하지 않기 때문에 PAWS가 시작되기 때문에이를 활성화하지 않는 것이 문서에 명시되어 있습니다.

   tcp_tw_recycle (Boolean; default: disabled; since Linux 2.4)
          Enable fast recycling of TIME_WAIT sockets.  Enabling this
          option is not recommended for devices communicating with the
          general Internet or using NAT (Network Address Translation).
          Since some NAT gateways pass through IP timestamp values, one
          IP can appear to have non-increasing timestamps.  See RFC 1323
          (PAWS), RFC 6191.

1
여기서 좋은 설명 : vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux 서버 측에서 NAT 장치가 없을 것이라고 확신하지 않는 한 net.ipv4.tcp_tw_recycle을 활성화하지 마십시오. 혼합물에.
Gnought

1
제 경우 net.ipv4.tcp_tw_recycle에는 진짜 이유입니다. 감사.
bluearrow

tcp_tw_recycle은 최근 커널에서 제거되었습니다. 다른 해결책이 있습니까? @nephtes는 타임 스탬프를 비활성화하면 성능이 저하됨을 나타냅니다.
MappaM

tcp_tw_recycle이 제거되었으므로 기본값이 아닌 tcp_tw_recycle에서만 발생하므로 문제점이 다시 발생하지 않아야합니다.
lav

5

궁금한 점이 있지만 왜 SYN 패킷 (프레임 # 539; 허용 된 것)의 WS 및 TSV 필드가 "정보"열에 누락되어 있습니까?

WS는 TCP Window Scaling 이고 TSV는 Timestamp Value 입니다. 둘 다 tcp.options 필드에 있으며 Wireshark는 여전히 존재하는 경우이를 표시해야합니다. 8 번째 시도에서 클라이언트 TCP / IP 스택이 다른 SYN 패킷을 재전송했을 수 있으며 이것이 갑자기 확인 된 이유일까요?

프레임 539 내부 값을 제공 할 수 있습니까? SYN / ACK는 항상 WS를 활성화하지 않은 SYN 패킷에 제공됩니까?


@Ansis : 여기에 프레임 539 세부 사항에 대한 스크린 샷이 있습니다 (두 부분으로해야 함) : i.imgur.com/D84GC.png & i.imgur.com/4riq3.png
codemonkey

@codemonkey : 8 번째 SYN 패킷은 처음 7 개의 SYN 패킷과 다른 것 같습니다. tcp.options 필드의 크기가 8 바이트 인 경우에만 서버가 SYN / ACK로 클라이언트의 SYN에 응답합니까? 클라이언트 쪽에서 TCP 창 크기 조정을 비활성화하여 문제가 사라지는 지 확인할 수 있습니까? 서버 쪽의 TCP / IP 스택에 문제가 있거나 어딘가에 방화벽이 잘못 구성되어있는 것 같습니다 ...
Hans Solo

@Ansis : 예, 당신이 지적하고 다른 모든 SYN 패킷은 24 바이트이기 때문에 그것을 보았습니다. 클라이언트에서 창 크기 조정을 비활성화하고 아침에 결과를 다시 확인합니다.
codemonkey

@Ansis : 클라이언트에서 창 스케일링을 끄면 문제가 발생하지 않았습니다. 감사! 그러나 이제 서버 측 에서이 문제를 해결하는 방법을 알아야합니다 (모든 클라이언트가 창 크기 조정을 비활성화 할 수 없기 때문에) :) 문제의 서버에는 net.ipv4.tcp_windows_scaling = 1
codemonkey

@Codemonkey : 모든 클라이언트에서 WS를 비활성화하는 것이 해결책이 아니라는 데 동의하지만 적어도 WS / Packet Size 문제에 대한 문제를 추적했습니다. 원인을 추가로 찾으려면 방화벽 구성 방법을 조사해야합니다. WS와 다른 TCP 포트에 대한 TCP 연결을 설정할 수 있습니까? 다른 소스 IP에서?
한스 솔로

4

우리는 똑같은 문제에 부딪 쳤습니다 (실제로 동기화를 보내지 않는 서버에 고정시키는 데 꽤 오랜 시간이 걸렸습니다).

"해결책은 일반 사용자가 액세스 할 수있는 서버에서 tcp windows 스케일링 및 tcp 타임 스탬프를 끄는 것입니다."


2

Ansis가 말한 것을 이행하기 위해 방화벽이 TCP Windows Scaling을 지원하지 않을 때 이와 같은 문제가 발생했습니다. 이 두 호스트 사이에 어떤 make / model 방화벽이 있습니까?


방화벽은 iptables를 사용하는 Fedora 13 박스입니다. net.ipv4.tcp_windows_scaling도이 시스템에서 1로 설정되었습니다
codemonkey

2

방화벽에서 SYNFLOOD 보호 한계가 너무 낮아서 누락 된 SYN / ACK가 발생할 수 있습니다. 서버 사용자에 대한 연결 수에 따라 다릅니다. spdy를 사용하면 연결 수가 줄어들고 net.ipv4.tcp_timestamps끄지 않아도 도움이 될 수 있습니다.


1

백 로그가 가득 찬 경우 수신 TCP 소켓의 동작입니다.

Ngnix는 백 로그 인수가 구성에서 청취되도록 허용합니다. http://wiki.nginx.org/HttpCoreModule#listen

청취 80 백 로그 = 수

1024를 기본값보다 큰 값으로 설정하십시오 (1024).

전체 청취 대기열이 실제로 문제라는 것을 보장하지는 않지만 확인하는 것이 가장 좋습니다.


팁 고마워. 나는 그것을 시도 할 것이다. 우리는 백 로그를 OS 레벨로 설정했지만 Nginx 설정에서는 명시 적으로 설정하지 않았습니다. 결과를 업데이트하겠습니다.
codemonkey

그것은 행동을 전혀 바꾸지 않았습니다. 맞춰봐, 문제가 아니야? 또는 유일한 문제는 ...
codemonkey

1
응용 프로그램 수준 백 로그 매개 변수는 완료된 tcp 연결 (예 : 3 방향 핸드 셰이크 완료, syn-ack 수신)에 대한 큐 크기를 제어하므로 OP 상황과 일치하지 않습니다
ygrek

1

방금 3 번 시도한 후 Linux TCP 클라이언트가 SYN 패킷을 변경하고 Window Scaling 옵션을 제거한다는 것을 알았습니다. 커널 개발자는 이것이 인터넷에서 연결 실패의 일반적인 원인이라고 생각했습니다.

이 클라이언트가 11 초 후에 연결하는 이유를 설명합니다 (기본 설정으로 간단한 테스트에서 9 초 후에 창없는 TCP SYN이 발생 함)


0

비슷한 문제가 있었지만 제 경우에는 잘못 계산 된 것이 TCP 체크섬이었습니다. 클라이언트는 veth 뒤에 있었고 ethtool -K veth0 rx off tx off를 실행하여 트릭을 수행했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.