는 방법을 찾기 위해 최 UDP 패킷을 보낼 수 있습 없이 조각화하는 방법?
-
23-08-2019 - |
문제
나는 알아야 할 무엇이 가장 큰 UDP 패킷을 보낼 수 있는 다른 컴퓨터가 없는 조각.
이 크기는 일반적으로 알려진 MTU(최대 전송 단위).가정으로,사이에는 2 대의 컴퓨터가 될 것입니다 많은 라우터 및 모뎀을 가질 수 있는 다른 Mtu.
내가 읽는 TCP 구현에서 윈도우 자동으로 찾아서 최대 MTU 에서 경로.
또한 실험,그리고 나는 것을 발견 최대 MTU 에서 내 컴퓨터를 서버의 57712bytes+헤더가 있습니다.아무것도 위에는 폐기됩니다.내 컴퓨터에서는 LAN,지 않 MTU 있어야 주변에 1500bytes?
해결책
다음은 귀하의 질문에 직접 답변하지 않지만 흥미로울 수 있습니다. IP 패킷은 분해/재 조립 될 수 있으므로 언더 링 미디어 (예 : 1500 바이트 이더넷)의 한계보다 큽니다. GRE 및 IPSEC의 IP 파편화, MTU, MSS 및 PMTUD 문제 해결
이 주제에 대한 자세한 내용 :
- Re : UDP 단편화 UDP 대신 ICMP를 사용하여 MTU를 발견해야한다고 말합니다.
- 경로 MTU 발견 TCP 연결에는 ICMP를 통한 암시 적 MTU 협상이 포함될 수 있다고합니다.
나는 Windows에서 API를 통해 ICMP를 생성하는 것에 대해 모른다 : 한 번에 그러한 API가 제안되었고, 사람들은 홍수를 생성하여 서비스 거부 기능을 구현하는 소프트웨어를 쉽게 작성할 수 있다고 주장했기 때문에 논란의 여지가 있었다. ICMP 메시지.
아니요, 그랬어요 ~이다 구현 : 예를 들어 참조하십시오 Winsock 프로그래머의 FAQ 예제 : Ping : Raw Sockets Method.
따라서 MTU를 발견하려면 'Fragment Do Fragment'플래그와 함께 Ping 패킷을 생성하십시오.
아마도 이것보다 더 쉬운 API가있을 수도 있습니다. 그러나 나는 당신에게 기본 프로토콜을 이해하기를 바랍니다.
다른 팁
또한 이전의 모든 답변을 인용 클래식:
IPv4 와 IPv6 을 정의 최소 reassembly 버퍼 크기, 최소 데이터그램의 크기는 우리가 보는 모든 구현이 지원해야 합니다.IPv4,이 576 바이트입니다.IPv6 에서 이 이 1,280 바이트입니다.
이 꽤 많은 수단을 제한하려는 귀하의 데이터그램이 크기에서 576 작업하는 경우 당해 공중 인터넷 및 제어만 한쪽의 교환에는 무엇 대부분의 표준 UDP 기반의 프로토콜 않습니다.
또한 PMTU 동적 재산의 경로입니다.이것은 하나의 일 TCP 룬다.당신은 다시 구현을 많이 시퀀싱,타이밍,전송 논리,TCP 를 사용하여 어떤 중요합니다.벤치마크,테스트,프로필,즉 증명 는 TCP 은 당신의 병목 현상,다음을 고려 UDP.
이것은 저에게 흥미로운 주제입니다. 아마도 UDP를 통해 실제 인터넷 주위에 청키 한 UDP 데이터를 전달할 때 일부 실제 결과가 중요 할 수 있으며, 전송 속도 1 패킷이 1 초 동안 최소 2K로 최소 패킷 손실로 데이터가 계속 나타납니다. 이를 통해 문제가 발생하기 시작하지만 정기적으로 고통없이 1600 개 이상의 바이트 패킷을 전달했습니다. 이는 GPRS 모바일 네트워크와 WAN 전세계 WAN을 초과합니다. ~ 1k에서 신호가 안정적이라고 가정하면 (그렇지 않습니다!) 패킷 손실이 낮습니다.
흥미롭게도 홀수 패킷이 아니라 종종 몇 초 동안 패킷이 종종 있습니다. 아마도 VoIP 호출이 때때로 붕괴되는 이유입니다.
UDP 애플리케이션의 경우 IP 단편화 또는 삭제 된 패킷을 피하려면 엔드 투 엔드 MTU를 직접 처리해야합니다. 모든 애플리케이션에 권장되는 접근 방식은 PMTU를 사용하여 최대 데이터 그램을 선택하거나 데이터 그램을 보내는 데 최선을 다하는 것입니다. <최소 PMTU
https://tools.ietf.org/html/rfc5405#section-3.2
애플리케이션 디자이너에 대한 Unicast UDP 사용 지침 "PMTU를 초과하는 데이터 그램을 보내지 않아야합니다. PMTU를 발견하거나 데이터 그램을 보내야합니다 <최소 PMTU
Windows는 기본 소켓 옵션 인터페이스를 통해 PMTU 정보 설정 및 액세스에 나타납니다.
PMTU Discover가 IP_MTU_DISCOVER을 통해 켜져 있는지 확인하고 IP_MTU를 통해 MTU를 읽을 수 있습니다.
https://docs.microsoft.com/en-us/windows/desktop/winsock/ipproto-ip-socket-options