클라이언트 프로그램 : 파이썬
서버 프로그램 : nc유틸리티 (Ubuntu)


import socket...①
data = b"Hello, Server\n"...②
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)...③
udp.sendto(data, ("192.168.186.255", 9090))...④
①- Python의 socket 모듈을 가져옵니다. 이 모듈은 네트워크 통신을 위해 소켓을 생성하고 조작하는 기능을 제공합니다.
②- data 변수에 전송할 데이터를 바이트 문자열(b"...") 형식으로 저장합니다. UDP는 문자열 대신 바이트 데이터를 전송하므로 바이트 문자열로 변환이 필요합니다.
③- UDP 소켓을 생성합니다.
socket.AF_INET은 IPv4 주소 체계를 사용하겠다는 의미입니다.
socket.SOCK_DGRAM은 UDP 소켓을 생성하겠다는 의미입니다.
④- UDP 소켓을 통해 데이터를 특정 서버로 전송합니다.
data는 전송할 바이트 데이터입니다.
("192.168.186.255", 9090)은 데이터를 전송할 대상의 IP 주소와 포트 번호입니다. 여기서는 IP 주소 192.168.186.255와 포트 번호 9090으로 데이터를 전송합니다.
명령어를 실행한 결과로 나타난 "14"는 udp.sendto함수의 반환값으로 전송한 데이터의 바이트 수를 의미한다.
$ nc -lnuv 9090
-l: Netcat이 서버 모드로 동작하도록 설정합니다. 즉, 지정한 포트에서 들어오는 연결을 대기합니다.
-n: DNS 이름 조회를 하지 않도록 합니다. IP 주소만 사용합니다.
-u: UDP 프로토콜을 사용합니다. (기본은 TCP)
-v: verbose 모드로, 실행 중에 자세한 정보를 출력합니다.
명령어를 실행한 결과로 나타난 메시지 'Bound on 0.0.0.0 9090'은 서버 프로그램이 정상적으로 실행되었음을 의미한다. Netcat이 모든 네트워크 인터페이스(0.0.0.0)의 포트 9090에서 들어오는 UDP 패킷을 대기 중이라는 뜻
ip addr show
브로드캐스트 주소란?
192.168.186.255와 같은 주소는 브로드캐스트 주소로, 이 주소로 전송된 패킷은 동일한 네트워크 내의 모든 호스트가 수신할 수 있다.
수신된 패킷의 출발지 IP 주소
UDP 패킷을 수신하는 서버는 해당 패킷을 어디서부터 수신했는지 기록한다. 브로드캐스트 주소로 패킷을 보냈을 때, 서버는 이 패킷을 보낸 실제 출발지 IP 주소를 기록하게 된다. 따라서, 서버가 기록하는 IP 주소는 클라이언트 장치의 실제 IP 주소이다.
정리:
클라이언트의 실제 IP 주소가 192.168.186.1이고, 브로드캐스트 주소 192.168.186.255로 메시지를 보냈다면, 서버는 이 메시지가 192.168.186.1에서 왔다고 인식