Raw Socket
Network Layers/Protocol Stack
Raw Socket
-
기존의 소켓 프로그래밍 방식
- Application layer에서 프로그래밍
- 사용할 transport layer protocol을 TCP, UDP 중 선택
-
TCP/UDP이외의 transport protocol의 사용 또는 수현하는 방법은?
- raw socket 을 이용
-
Raw Socket의 기능
- Transport 또는 IP(Internet) layer 에서의 프로그래밍 허용
- ICMP, IGMP 패킷 송수신
- 커널이 처리하지 않는 프로토콜 번호를 갖는 IP datagram의 송수신
- IP header의 사용자 직접 작성 허용
IP Header
Raw Socket의 생성
- sockfd = socket(AF_INET, SOCK_RAW, protocol);
- //IP header의 직접 작성
setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));
Raw Socket으로 수신 가능한 패킷
- UDP, TCP 패킷은 raw socket으로 수신 불가
- 대부분의 ICMP 패킷 수신 가능
- 모든 IGMP 패킷의 수신 가능
- 커널이 처리하지 않는 프로토콜 번호를 가진 IP datagram은 모두 수신 가능
Raw Socket으로 수신 가능한 패킷
-
다음 조건들에 해당할 때 수신된 패킷이 특정 raw socket으로 전달됨
- raw socket이 생성되었을 때 0이 아닌 프로토콜번호가 주어졌으면 수신된 패킷의 프로토콜 필드는 이 값과 일치해야 함
- bind함수에 의해 raw socket이 특정 IP 주소와 연계되었을 경우 수신된 패킷의 목적지 IP주소는 이 주소와 일치해야 함
- 외부 IP주소가 connect 함수에 의해 raw socket과 연계되었을 경우 수신된 데이타그램의 출발지IP주소는 이 연결된 주소와 일치해야 함
Raw Socket의 전송
- sendto 또는 sendmsg의 호출, 호출 시 목적지 IP주소를 지정
- IP_HDRINCL option이 설정되어 있지 않으면 커널이 IP헤더를 자동으로 생성
- IP_HDRINCL option이 설정되어 있으면 사용자가 IP헤더를 포함한 패킷을 작성
- 커널은 output interface MTU를 초과하는 패킷들을 작은 조각으로 만듦
ping 프로그램
- ICMP Echo-request/reply message를 이용 특정 컴퓨터와의 연결 여부 확인
- ICMP message의 전송과 수신을 위하여 raw socket 사용
General format of ICMP messages
이 글은 스프링노트에서 작성되었습니다.
'컴퓨터 > 프로그래밍' 카테고리의 다른 글
Android SDK 설치 (0) | 2008.12.14 |
---|---|
오랜만에 만져본 JAVA (2) | 2008.12.02 |
MVC Pattern (1) | 2008.07.21 |
내가 보아야 할 Ruby 관련 책들 (2) | 2008.05.14 |
Ruby를 맛봅시다. (2) | 2008.04.30 |