성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] 그냥 RSS Reader 기능과 약간의 UI 편의성 때문에 사용...
[이종효] 오래된 소프트웨어는 보안 위협이 되기도 합니다. 혹시 어떤 기능...
[정성태] @Keystroke IEEE의 문서를 소개해 주시다니... +_...
[손민수 (Keystroke)] 괜히 듀얼채널 구성할 때 한번에 같은 제품 사라고 하는 것이 아...
[정성태] 전각(Full-width)/반각(Half-width) 기능을 토...
[정성태] Vector에 대한 내용은 없습니다. Vector가 닷넷 BCL...
[orion] 글 읽고 찾아보니 디자인 타임에는 InitializeCompon...
[orion] 연휴 전에 재현 프로젝트 올리자 생각해 놓고 여의치 않아서 못 ...
[정성태] 아래의 글에 정리했으니 참고하세요. C# - Typed D...
[정성태] 간단한 재현 프로젝트라도 있을까요? 저런 식으로 설명만 해...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>WSL 2 내부로부터 호스트 측의 네트워크로 UDP 데이터가 1개의 패킷으로만 제한되는 문제</h1> <p> 지난 글에서,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C# - UDP Datagram의 최대 크기 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/13229'>https://www.sysnet.pe.kr/2/0/13229</a> </pre> <br /> UDP로 데이터를 보통 65,507 바이트까지 다룰 수 있다고 했습니다. 그리고 DontFragment 옵션을 적용하면 보통 1472(MTU - 28) 바이트를 전송할 수 있다고 했는데요. WSL 2의 경우 Hyper-V의 가상 스위치가 제공하는 "vEthernet (WSL)" 네트워크를 벗어나게 되면 DontFragment 옵션이 적용된 것처럼 1개의 패킷만을 허용하는 문제가 있습니다.<br /> <br /> 간단하게 테스트해 볼까요? ^^<br /> <br /> UDP 서버를 이렇게 만들어 두고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using System.Net; using System.Net.Sockets; using System.Text; internal class Program { static void Main(string[] args) { IPAddress ip = IPAddress.Any; int port = 60900; if (args.Length > 0) { ip = IPAddress.Parse(args[0]); } IPEndPoint ep = new IPEndPoint(ip, port); using (UdpClient listener = new UdpClient(ep)) { IPEndPoint remoteEp = new IPEndPoint(IPAddress.Any, 0); while (true) { byte[] bytes = listener.Receive(ref remoteEp); string text = Encoding.UTF8.GetString(bytes); Console.WriteLine(text); Console.WriteLine($"{DateTime.Now}: {bytes.Length} Received\n"); } } } } </pre> <br /> WSL을 호스팅하는 윈도우 측에서 위의 프로그램을 실행합니다. 그다음, WSL 내에서는 간단하게 다음과 같은 파이썬 프로그램을 하나 만들어 둡니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > import socket import sys length = 1472 target = '127.0.0.1' if len(sys.argv) >= 2: length = int(sys.argv[1]) if len(sys.argv) >= 3: target = sys.argv[2] print('length', length, 'target', target) text = 'a' * length sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) endpoint = (target, 60900) sent_bytes = sock.sendto(text.encode(), endpoint) print(sent_bytes) </pre> <br /> 이제 UDP 서버로 데이터를 보내볼 텐데요, (아직 저 코드 그대로 실행하지 마시고) 이때 UDP 서버의 주소를 ipconfig으로 열거하면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > // WSL을 호스팅하는 윈도우 측에서 실행 c:\temp> <span style='color: blue; font-weight: bold'>ipconfig</span> Windows IP Configuration Ethernet adapter vEthernet (newExternal): Connection-specific DNS Suffix . : Link-local IPv6 Address . . . . . : fe80::bec9:b5ec:b27f:9383%18 IPv4 Address. . . . . . . . . . . : <span style='color: blue; font-weight: bold'>192.168.100.50</span> Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 192.168.100.1 Ethernet adapter vEthernet (Default Switch): Connection-specific DNS Suffix . : Link-local IPv6 Address . . . . . : fe80::39c9:b9cb:6533:e340%40 IPv4 Address. . . . . . . . . . . : <span style='color: blue; font-weight: bold'>172.26.48.5</span> Subnet Mask . . . . . . . . . . . : 255.255.240.0 Default Gateway . . . . . . . . . : Ethernet adapter vEthernet (WSL): Connection-specific DNS Suffix . : Link-local IPv6 Address . . . . . : fe80::d8e0:a87c:2888:20e%61 IPv4 Address. . . . . . . . . . . : <span style='color: blue; font-weight: bold'>172.28.96.1</span> Subnet Mask . . . . . . . . . . . : 255.255.240.0 Default Gateway . . . . . . . . . : </pre> <br /> 위와 같이, "192.168.100.50", "172.26.48.5", "172.28.96.1"에 해당하는 윈도우 호스트 측의 다양한 IP를 얻을 수 있습니다. 따라서 WSL 측에서 각각의 IP로 다음과 같이 실행해 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > // 127.0.0.1의 경우 아예 통신 안 됨 $ <span style='color: blue; font-weight: bold'>python3 test.py 5 127.0.0.1</span> length 5 target 127.0.0.1 5 // 1472 이하만 통신 가능 $ <span style='color: blue; font-weight: bold'>python3 test.py 1473 192.168.100.50</span> length 1473 target 192.168.100.50 1473 // 1472 이하만 통신 가능 $ <span style='color: blue; font-weight: bold'>python3 test.py 1473 172.26.48.5</span> length 1473 target 172.26.48.5 1473 // 1472 이상 통신 가능 $ <span style='color: blue; font-weight: bold'>python3 test.py 1473 172.28.96.1</span> length 1473 target 172.28.96.1 1473 </pre> <br /> UDP 서버에서는 오직 "vEthernet (WSL)" 네트워크에 속한 "172.28.96.1" IP로 전송했을 경우에만 1473 바이트의 데이터가 화면에 출력되는 것을 확인할 수 있습니다. (당연히, 호스트가 속한 외부 네트워크로 보낼 때도 마찬가지 현상이 나타납니다.)<br /> <br /> 즉, "vEthernet (WSL)" 네트워크에서 다른 네트워크(위의 경우 "vEthernet (newExternal)", "vEthernet (Default Switch)")로 UDP 데이터가 전송되는 과정에 MTU 크기 이외의 UDP 패킷은 drop 시켜 버린 듯합니다.<br /> <br /> 이에 대해 검색해 보면 다음과 같은 이슈를 찾을 수 있는데요,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Can't send or receive fragmented UDP packets #6082 ; <a target='tab' href='https://github.com/microsoft/WSL/issues/6082'>https://github.com/microsoft/WSL/issues/6082</a> </pre> <br /> 2020년 10월에 보고되었지만 아직도 수정되지 않고 있으니... 음... ^^;<br /> <br /> 위의 글에 보면, "<a target='tab' href='https://www.redhat.com/sysadmin/getting-started-socat'>socat</a>"을 WSL과 서버 측에 설치해 TCP 터널링으로 우회하는 방법도 소개하고 있으니 급하신 분은 그걸로라도 대체하시면 될 듯합니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1656
(왼쪽의 숫자를 입력해야 합니다.)