UDP 로우(raw) 소켓 프로그래밍
- 로우 소켓 프로그래밍 : 로우 레벨에서 데이터를 제어
- 프로토콜 : 통신을 위한 규칙
- 헤더 : 프로토콜의 내용을 표현, 전송하고자 하는 데이터의 정보를 가지고 있다.
4계층 헤더 : TCP, UDP
- 전송을 담당
- PDU(Protocol Data Unit) : segment
- Protocol : TCP, UDP
- 주소체계 : PORT
UDP (User Datagram Protocol)
- 빠르다
- 신뢰할 수 없다.
- 대용량의 데이터의 전송에는 적합하지 않다.
UDP 헤더
1) 출발지 포트번호(2byte)
2) 도착지 포트번호(2byte)
3) UDP 헤더의 길이(2byte)
4) 체크섬 바이트 (2byte) : 데이터의 무결성을 위한 필드
[ UDP_Server ]
[ UDP_Client ]
[ UDP_sniffer ]
udp 로우 소켓 프로그래밍 : 로우데이터가 왔다갔다 하는 것을 확인하기 위해 설정해놓았습니다.
- 소켓을 설정할 때에는 SOCK_RAW를 받았고, bind명령어로 모든 주소를 받습니다.
- 일반적으로 설정하게 되면 아무런 작업을 하지 않아도 모든 데이터가 왔다갔다 하기 때문에 현재 클라이언트의 IP만 통신하도록 설정해놓았습니다.
[ UDP_Server 결과창 ]
[ UDP Client 결과창 ]
[ Sniffer 결과창 ]
- data가 byte단위로 오는 것을 확인해 볼 수 있다.
여기서 앞에 20바이트를 제외하고 UDP헤더부분을 보기위해 그 뒤에 바이트 만으로 분석해보겠습니다.
b'\x87\xaaW=\x00\rZ\xf7 hello' → 34730 22333 13 23287 hello 로 변환해볼 수 있습니다.
바이트 값이기 때문에 변환해줘야 알아볼 수 있습니다.
그러면 출발지 포트는 34730, 도착지 포트 22333, 헤더길이 13 체크썸 23287 라는 것을 확인해 볼 수 있습니다.
[ UDP Sniffer ]
[ Sniffer 결과창 ]
struct 는 byte로 된 값을 변환해주는 역할을 수행하는 모듈입니다.
struct.
pack
( fmt , v1 , v2 , ... )
일반적인 값을 byte로 변환해줍니다.
ex)
struct.
unpack
( fmt , 버퍼 )
byte로 된 값을 보기편한 값으로 변환해줍니다.
ex)
struct 참고 : https://docs.python.org/3/library/struct.html
'SECURITY > Network' 카테고리의 다른 글
이더넷 소켓 프로그래밍 (0) | 2017.04.28 |
---|---|
IP 로우 소켓 프로그래밍 (0) | 2017.04.27 |
리눅스 네트워크 설정 (1) | 2017.04.27 |
TCP 로우 소켓 프로그래밍 (0) | 2017.04.26 |
소켓 프로그래밍 (0) | 2017.04.24 |