Raw Socket
Network Layers/Protocol Stack

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의 전송
- 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
