
저는 두 대의 서버를 가지고 있으며 LwIP가 포함된 자체 임베디드 시스템을 사용하여 이 서버에 연결했습니다.
LwIP가 포함된 임베디드 시스템은 클라이언트이고 server1과 server2가 있습니다. 나는 server1에 연결하고 server2에 연결하기 전에 연결을 종료했습니다.
흐름에 대한 추가 분석:
- 클라이언트는 server1을 사용하여 새 소켓을 생성합니다.
- 클라이언트는 server1의 IP 주소를 얻기 위해 DNS 패킷을 보냈습니다. AP로부터 ACK를 받았습니다.
- 클라이언트는 TCP SYN 패킷을 보냅니다.
- Server1은 TCP SYN-ACK를 보내고 일부 데이터 전송을 수행합니다.
- 클라이언트는 TCP RST 패킷을 전송하여 server1과의 연결을 종료합니다. 소켓을 닫고
- 클라이언트는 server2를 사용하여 새 소켓을 생성합니다.
- 클라이언트는 server2의 IP 주소를 얻기 위해 DNS 패킷을 보냈습니다. AP로부터 ACK를 받았습니다.
- 클라이언트는 TCP SYN 패킷을 server2로 보냅니다.
- Server2는 TCP SYN-ACK를 보내고 일부 데이터 전송을 수행합니다.
- 클라이언트는 TCP RST 패킷을 전송하여 server2와의 연결을 종료합니다. 소켓을 닫고
그러나 때때로 server2가 9단계에 있는 클라이언트의 SYN 패킷에 응답하지 않는 경우가 있습니다. 이는 가끔 발생합니다. 다음과 같은 여러 포럼을 확인했습니다.
[1]서버가 SYN 패킷에 대한 응답으로 SYN/ACK 패킷을 보내지 않는 이유
[2]서버가 SYN 패킷에 대한 응답으로 SYN/ACK 패킷을 보내지 않습니다.
내 코드는 창 크기 조정을 활성화하지 않습니다. 서버가 개인 서버인지 확인할 수 없어서 삭제되었는지 잘 모르겠습니다. 내 환경은 많은 라우터와 통신 장치로 인해 상당히 시끄럽고 바쁩니다. 이 문제는 시끄러운 환경에서만 발생하며 깨끗한 환경에서는 발생하지 않습니다.
이 문제를 해결하려면 고객으로서 무엇을 할 수 있습니까?
답변1
때때로 서버가 SYN-ACK로 응답하지 않는 이유에 대한 몇 가지 아이디어:
- SYN 패킷이 전송되면 서버의 애플리케이션이 중지됩니다. 이는 충돌이 발생할 수 있으며 프로그램의 자동 재시작 메커니즘을 사용하여 다시 작동할 수 있습니다. 서버 앱이 중지되거나 충돌하면 TCP 청취 소켓이 닫히므로 OS가 응답하지 않습니다.
- 서버가 클라이언트를 다시 찾는 데 몇 가지 문제가 있습니다. 이는 일부 라우팅 문제이거나 비대칭 라우팅(이로 인해 방화벽이 손상됨)일 수 있습니다.
- 클라이언트와 서버가 동일한 네트워크에 있는 경우 스패닝 트리 프로토콜 또는 ARP와 같은 레이어 2 문제로 인해 문제가 발생할 수 있습니다.
- 네트워크의 패킷 손실: SYN 또는 SYN ACK 패킷이 삭제됩니다.
- 서버가 압도되어 때때로 SYN 패킷에 응답할 수 없습니다.
서버가 SYN 패킷에 응답하지 못하게 만드는 요인이 많이 있을 수 있습니다.
나는 뭘 할까 :
- 네트워크 확인을 위해 서버에서 일부 tcpdump 수행: 서버가 SYN 패킷을 수신합니까, 아니면 미리 네트워크에 문제가 있습니까? 서버가 SYN ACK 패킷을 생성하고 전송합니까? 그리고 거기에서 일하십시오.
- 서버에 액세스할 수 없는 경우 가장 가까운 라우터/방화벽에서 동일한 작업을 수행하세요.
- 서버에 액세스할 수 있는 사람에게 문의하세요.