C에서 ping 구현에 대해 배우고 있습니다. 문제는 패킷을 수신하기 위해 원시 소켓을 사용하고 있다는 것입니다. 모든 패킷에 대해 식별 값이 있습니다 ICMP header
.
여러 터미널에서 실행 중입니다 ping
.
예를 들어, 저는 ping google.com
세 개의 터미널 중 세 개를 실행하고 있습니다.
첫 번째 핑의 ID 값은 23456이고, 두 번째 핑의 ID 값은 34564, 세 번째 핑의 ID 값은 98763입니다.
내 문제는 두 번째 핑이 패킷 34564의 ID를 받아야 하는데 ID 값 23456을 수신한다는 것입니다.
각 핑마다 새로운 원시 소켓이 생성됩니다. 그러나 또 다른 핑 패킷을 수신합니다.
다른 핑 패킷을 수신하는 이유를 설명할 수 있는 사람이 있습니까?
답변1
기본적으로 원시 소켓은 모든 ICMP 패킷을 캡처합니다. 인용한 내부 번호는 현재 프로세스에서 패킷을 식별하는 것과 정확히 같습니다. ICMP에는 프로토콜 스택이 각 소켓을 역다중화하도록 허용하는 포트 번호가 없습니다.
귀하의 의견에 답변하자면, 패킷을 받았다면 분실된 것이 아니죠? ping과 같이 설정된 모든 소켓은 일치하는 모든 패킷의 복사본을 가져오므로 실행 중인 모든 ping은 수신된 모든 ICMP 패킷의 복사본을 가져옵니다.