성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] What has case distinction but is ne...
[정성태] 대소문자 '변환'과 함께 따라오는 문제가 바로 대소문자 구분 없...
[정성태] Reverse-engineering what a "short" ...
[정성태] 윈도우의 경우, 스레드 관련 자원을 완전히 회수하기 위해 Thr...
[지현명] Android쪽에서 activity 접근 할때 아래꺼 적어 놓고...
[지현명] Maui.Android에서 폴더 관련 내용 정리 잘 되어 있네요...
[정성태] @정한솔 언급하신 사항이 맞습니다. (C# 13부터) 중간에 i...
[정한솔] 기존 printAll(params int[] args)를 pri...
[정성태] 제가 거기까지는 테스트를 안 해봤군요. ^^ 재미 삼아 저 당시...
[정재겸] 질문이 하나 더 있습니다. 처음에 키보드 인풋은 먹다가 마...
글쓰기
제목
이름
암호
전자우편
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 서버를 호스트 측에서 접속하는 방법</h1> <p> 그나저나, WSL과 UDP는 별로 친하지 않은 것 같습니다. ^^;<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > WSL 2 내부로부터 호스트 측의 네트워크로 UDP 데이터가 1개의 패킷으로만 제한되는 문제 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/13230'>https://www.sysnet.pe.kr/2/0/13230</a> </pre> <br /> 이번에 문제가 되는 상황은 위와는 반대로 WSL 2 내부에서 UDP 서버를 열고 있는 경우입니다. 우선 문제가 되는 것이 소켓 바인딩인데요, 이게 참 재미있습니다. ^^; 아래의 글을 통해,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > WSL 2의 네트워크 통신 방법 - 두 번째 이야기 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/13256'>https://www.sysnet.pe.kr/2/0/13256</a> </pre> <br /> WSL에서 TCP 서버 소켓 바인딩을 0.0.0.0으로 해도 외부적으로는 127.0.0.1로 된다고 했는데요, UDP 서버의 경우에는 0.0.0.0으로 (또는 localhost, 127.0.0.1, 또는 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;' > // WSL 측 $ <span style='color: blue; font-weight: bold'>nc -ul 0.0.0.0 65300</span> $ <span style='color: blue; font-weight: bold'>netstat -ano | grep 65300</span> udp 0 <span style='color: blue; font-weight: bold'>0 0.0.0.0</span>:65300 0.0.0.0:* off (0.00/0/0) // 호스트 측 (출력 없음) c:\temp> <span style='color: blue; font-weight: bold'>netstat -ano | findstr 65300</span> c:\temp> </pre> <br /> 게다가 WSL 내의 UDP 서버로 호스트 측에서 통신을 하려면 반드시 "vEthernet (WSL)" 네트워크의 IP로만 통신이 가능합니다. 따라서 UDP 서버는 0.0.0.0 또는 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;' > [WSL 측 UDP 서버] // 0.0.0.0으로 바인딩하거나, $ nc -ul 0.0.0.0 65300 // 또는, WSL IP로 바인딩 $ nc -ul 172.22.151.118 65300 </pre> <br /> 윈도우 측에서는 오직 UDP 서버의 WSL IP(위의 경우 172.22.151.118)로 직접 데이터를 전송하는 것만 가능합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [호스트 측 UDP 클라이언트 (<a target='tab' href='https://www.sysnet.pe.kr/2/0/12311'>netcat</a>)] // 127.0.0.1로는 데이터 전송이 안 됨! c:\temp> <span style='color: blue; font-weight: bold'>echo "TEST" | netcat -u 127.0.0.1 65300</span> // 반드시 WSL IP로만 데이터 전송 가능 c:\temp> <span style='color: blue; font-weight: bold'>echo "TEST" | netcat -u 172.22.151.118 65300</span> </pre> <br /> 저 과정의 <a target='tab' href='https://www.sysnet.pe.kr/2/0/13230'>역방향(WSL UDP 클라이언트, 호스트 측 UDP 서버)</a>은, 그래도 그나마 다른 IP로는 1472 바이트 이내에서의 통신은 가능했었지만 이번에는 오직 WSL IP로만 통신이 가능하다는 차이점이 있습니다.<br /> <br /> <hr style='width: 50%' /><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 access UDP services running in WSL on localhost #8783 ; <a target='tab' href='https://github.com/microsoft/WSL/issues/8783'>https://github.com/microsoft/WSL/issues/8783</a> </pre> <br /> 2022년 8월 31일에 올라온 이슈가 있습니다. 덧글에 보면 이 문제로 인해 WSL 2 내부에서 UDP로 운영되는 서비스(일례로 DNS)가 동작하지 않는다는 것과도 연결됩니다.<br /> <br /> 또 다른 덧글에 보면 이 문제에 대한 우회 방법으로 "checksum offload"를 끄는 방법을 제시하는데요,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>sudo ethtool -K eth0 tx off</span> Actual changes: tx-checksumming: off tx-checksum-ipv4: off tx-checksum-ipv6: off tcp-segmentation-offload: off tx-tcp-segmentation: off [requested on] tx-tcp6-segmentation: off [requested on] </pre> <br /> 제 경우에는 바뀐 점이 없었습니다.<br /> <br /> 이걸 문제로 봐야 하느냐는 약간 다르게 생각해 볼 필요도 있습니다. 엄밀히 보면, WSL 2의 경우 가상 스위치를 만들어 그 네트워크 안에서 동작하는 것이므로 WSL IP로만 통신하는 것이 맞습니다. 만약 WSL 2를 Full VM으로 호스팅해서 통신했다면 저 사실을 지극히 정상적으로 받아들였을 것입니다. 단지, WSL 2가 경량화된 Managed VM으로 윈도우 호스트 측과 긴밀하게 연동하기 때문에 부지불식간에 자꾸 localhost, 127.0.0.1로의 통신을 시도하게 되고 그것이 안 되는 것을 버그로 인식하게 되는 것입니다.<br /> <br /> 어쨌든, 마이크로소프트도 이 점을 감안해서 지속적으로 (일례로 TCP가 그러했듯) 127.0.0.1에 대해 가상 스위치의 통신을 윈도우 호스트 측으로 연결을 구현하는 듯합니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1495
(왼쪽의 숫자를 입력해야 합니다.)