본문으로 바로가기

UDP 로우 소켓 프로그래밍

category SECURITY/Network 2017. 4. 25. 19:09


   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.packfmt , v1 , v2 , ... )

일반적인 값을 byte로 변환해줍니다. 

ex)

struct.unpackfmt , 버퍼 )

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