/proc/net/udp는 이더넷 플러그와 내 애플리케이션 사이에서 발생하는 모든 드롭을 계산합니까?

/proc/net/udp는 이더넷 플러그와 내 애플리케이션 사이에서 발생하는 모든 드롭을 계산합니까?

/proc/net/udpLinux에는 "drops" 열이 있습니다.

cat /proc/net/udp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode ref pointer drops
16151: 00000000:CB53 00000000:0000 07 00000000:00000000 00:00000000 00000000  1000        0 39947169 2 ffff88084c108080 0

소켓의 삭제 카운터가 0인 경우 합법적인 UDP 패킷의 보낸 사람과 응용 프로그램 사이에 발생하는 삭제가 내 상자 외부에서 발생하고 있다고 확신할 수 있습니까?, 일부 스위치나 라우터 등에서?

아니면 내 네트워크 카드 드라이버가 카운터에 영향을 주지 않고 어떤 이유로든 자동으로 패킷을 삭제하고 있는 것일까요?

Windows에서는 수신 버퍼에 여전히 많은 공간이 있어도 패킷이 삭제될 수 있다는 것을 알고 있지만 Linux에서도 비슷한 상황이 존재하는지 확실하지 않습니다.

답변1

아니요.

패킷은 사용자 소켓으로 역다중화되기 전에 손실될 수 있습니다.

이는 커널이 어떤 이유로 네트워크 카드에서 패킷을 충분히 빠르게 읽을 수 없을 때 발생합니다.

네트워크 카드는 포트당 손실된 패킷 수를 계산하지 않습니다. 적어도 반드시 그런 것은 아니며 그런 것이 /proc/net/udp.

2015년에 패킷 손실을 자세히 소개한 문서가 있었는데, 흥미롭게 보셨는지 궁금합니다. https://access.redhat.com/sites/default/files/attachments/20150325_network_performance_tuning.pdf

답변2

정의에 따르면 UDP는 연결 없는 프로토콜입니다. 정의에 따르면 시스템 수준에서 발신자는 수신을 확인하지 않고 전송에만 관심을 갖습니다. 따라서 발신자 입장에서는 UDP 패킷을 보낼 수만 있다면 성공입니다.

정체/오류가 발생할 수 있거나 다중 경로 라우팅 및 다양한 정체 수준을 포함한 다양한 요인으로 인해 수신자가 이러한 패킷을 모두 수신하거나 전송된 순서대로 수신한다는 보장은 없습니다.

버퍼 크기도 제한되어 있으며, 패킷이 버퍼를 초과하면 패킷이 손실됩니다.

귀하의 질문에 대답하려면 연결 지향적이지 않은 프로토콜을 처리하고 시스템 수준에서 패킷 손실 카운터를 보면 0입니다. 연결의 한쪽(발신자 또는 수신자)에서 두 가지를 모두 수행하는 것만으로는 전체 그림을 알 수 없습니다. .

따라서 통계는 버퍼에서 삭제된 패킷을 반영하지만 전송 중에 손실된 모든 패킷을 고려하지는 않습니다.

이 외에도 두 크기에 대해 전송 및 수신된 패킷 수를 확인할 수도 있습니다.

상위 계층, 즉 애플리케이션 수준(예: DNS 또는 NTP)으로 이동하면 보다 의미 있는 서비스 통계를 얻기 위한 추가 제어가 있을 수 있습니다.

~에서UDP-위키피디아

UDP는 단순한 비연결 전송 모델과 최소한의 프로토콜 메커니즘을 사용합니다. 여기에는 핸드셰이크 대화 상자가 없으므로 사용자 프로그램이 기본 네트워크 프로토콜의 불안정성에 노출됩니다. 배송, 주문 또는 중복 보호가 보장되지 않습니다. UDP는 데이터그램의 소스와 대상에서 다양한 기능을 처리하기 위해 데이터 무결성 체크섬과 포트 번호를 제공합니다.

Stack Overflow의 관련 스레드Linux UDP 버퍼 여유 공간을 모니터링하는 방법은 무엇입니까?

관련 정보