Raw Socket

Network Layers/Protocol Stack

networkstack.PNG

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

ipheader.PNG

Raw Socket의 생성

  1. sockfd = socket(AF_INET, SOCK_RAW, protocol);
  2. //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

icmp.PNG

 

 

 

이 글은 스프링노트에서 작성되었습니다.

'컴퓨터 > 프로그래밍' 카테고리의 다른 글

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
Buy me a coffeeBuy me a coffee

+ Recent posts