"sendto" 시스템 호출에 대한 응답으로 패킷이 손실되는 이유를 어떻게 알 수 있습니까?

"sendto" 시스템 호출에 대한 응답으로 패킷이 손실되는 이유를 어떻게 알 수 있습니까?

strace ... -e sendto어딘가에 UDP 데이터그램을 보내려는 성공적인(즉, 양수 반환 값) 시도의 결과를 표시하지만 tcpdump -i any해당 네트워크 네임스페이스에 연관된 응답은 표시하지 않습니다.

sendto나가는 패킷이 발생하지 않는 이유를 어떻게 디버깅할 수 있습니까 ? 모든 계층(라우팅, 흐름 제어, nftables 등)에서 요청을 추적하고 데이터그램 내의 정보가 커널에서 사라질 때 출력할 수 있는 도구가 있습니까? 아니면 체크리스트가 포함된 가이드/문서가 있나요?상세한이런 일이 발생하는 이유 목록은 무엇입니까?

답변1

  1. 컴퓨터가 자체 패킷, 특히 UDP 패킷을 들을 수 있다는 보장은 없습니다. 따라서 sendto()와 동일한 시스템에서 tcpdump를 실행하면 sendto가 유효하더라도 예상된 동작을 찾을 수 있습니다.

  2. 소스와 대상 사이의 라우터(또는 기타 네트워크 장치)가 어떤 이유로든(메모리, 대역폭, 정전, 우주선, 라우팅 루프 등) 패킷을 보낼 수 없는 경우 UDP 패킷이 삭제되거나 복제됩니다. 또는 사전 통지 없이 주문되지 않은 상태로 수령함).

  3. UDP 패킷이 전달된다는 보장은 없습니다. 커널에 메모리가 부족하면 삭제될 수 있습니다. 메시지를 보내려고 할 때 네트워크가 가득 차면 메시지가 삭제될 수 있습니다. 당시 수신 컴퓨터의 사용량이 너무 많으면 삭제될 수 있습니다. 따라서 sendto가 작동하고 별도의 컴퓨터에서 tcpdump를 실행하더라도 tcpdump는 여전히 패킷을 볼 수 없습니다.

패킷이 전달되지 않았다는 사실을 보낸 사람이 받을 수 있는 유일한 알림은 대상이 패킷 수락을 적극적으로 거부하거나 중간 라우터가 패킷을 전달할 수 있는 경로가 없다고 판단하는 경우입니다. 또한 이러한 알림은 특정 패킷에 대해 보장되지 않으며 전체 패킷 그룹에 대해 한 번만 전송될 수 있습니다.

이러한 조건이 마음에 들지 않으면 UDP를 사용하지 마십시오. 임의적인 이유로 "신뢰할 수 없는 데이터그램 프로토콜"이라는 이름이 지정되지 않았습니다. UDP의 요점은 지연된 패킷이 쓸모없는 패킷이라는 것입니다. UDP는 안정성이 아닌 속도에 최적화되어 있습니다. 패킷의 안정적이고 질서 있는 전달을 보장하는 TCP의 프로토콜은 패킷 지연, 제한, 보존, 버퍼링, 분해, 재조립, 대조 및 일괄 처리를 유발할 수도 있습니다. 기술적으로 tcp는 패킷도 제공하지 않으며, tcp가 제공하는 데이터 스트림에는 패킷 경계가 있을 뿐이며 이러한 "경계"는 송신자와 수신자에서 동일하다고 보장되지 않습니다.

관련 정보