Mac OSX 네트워크 클라이언트 때때로 HTTPS 포트에 연결하는 데 문제가 있습니다. 네트워크 추적을 보면, 우리는이를보고있다 : 그 예상 그래서SYN/ACK를 무시합니다.
T0.0 client:port -> server:443 SYN
T0.1 server:443 -> client:port SYN, ACK
T3.1 server:443 -> client:port SYN, ACK
T6.1 server:443 -> client:port RST
3 초 지연은 실패 SYN/ACK에 재 시도에 대한 TCP 제한 시간을 일치합니다. 그러나 여기서 놀라운 점은 클라이언트가 ACK 나 RST로 응답하지 않는다는 것입니다. 클라이언트가 두 번 로그인하려고하면 성공합니다. 이 문제는 많은 첫 번째 연결 시도에서 재생산됩니다. 동시에 진행되는이 프로그램의 다른 HTTPS 연결이 있으며 네트워크 추적에 문제가없는 것처럼 보입니다.
내 생각에 소켓이 때때로 잘못 관리되는 경쟁 조건이 있습니다. 그러나 지금까지는 어떤 코드에서든이 영향을받은 클라이언트 (매우 크고 복잡한 소프트웨어)를 다시 만들 수 없었습니다. nmap
및 hping3
을 사용하여 패킷을 수작업으로 만든 경우에도 클라이언트는 항상 적어도 RST를 보냅니다.
SYN/ACK에 응답하지 않도록 사용자 영역 코드에서 이와 같이 소켓을 구성 (의도적으로 또는 실수로) 할 수있는 방법이 있습니까?
서버에 액세스 할 수없는 경우 SYN/ACK가 표시되지 않습니다. 내 문제는 * my * 측에서 필요한 ACK를 보내지 않는다는 것입니다. 규칙에 관계없이 SYN/ACK를 무시할 수 있습니다. 실제로 발생하기 때문에 현실이 항상 사양보다 우선합니다. 마찬가지로 소켓이 다 떨어지면 초기 SYN을 보내지 않을 것이지만 나는 그렇습니다. 내 작업 이론은 두 개의 다른 서버와 통신하려고 실수로 동일한 소켓 파일 디스크립터를 사용하여 네트워크 스레드에 연결해야한다는 것입니다. 그래도 시도해 보면 어떻게 될지 설명 할 수 없었습니다. –
미안하지만, 나는 당신과 의견이 다릅니다. TCP 연결에서 3 방향 핸드 셰이크를 무시할 수 없습니다! 이를 무시하면 연결이 설정되지 않습니다. 그러나 당신의 이론은 옳을 수 있습니다 : 클라이언트 측에서는 동일한 소켓에 동시 스레드를 사용하여 액세스하고 있으며 그 중 하나가 ACK를 전송하지 않고 소켓을 닫을 수 있으므로 서버가 보낸 RST를 전송할 수 있습니다. 이론을 확인해보십시오 (나는 당신의 프로그램을 모른다). 사실, RST의 가장 일반적인 원인은 소켓이 닫혀 있다는 것입니다. – jmpcm
OP에 동의합니다. 위의 대답은 분명히 잘못되었습니다. 서버 소켓이 올바르게 열리지 않았다면 SYN/ACK를 보냈습니다. – EJP