Raw socket
- TCP / UDP 를 거치지 않는 IP 단계 통신
- ICMPv4, IGMPv4, ICMPv6 은 로우소켓을 통해 송수신 한다.
- 직접 헤더를 구성할수도 있다.
Raw socket 생성
#include <netinet/in.h>
socket(PF_INET, SOCK_RAW, IPPROTO_ICMP)
IPPROTO_ICMP : 프로토콜 ( socket의 3번째 패러미터 )
SOCK_RAW : Raw socket ( socket의 2번째 패러미터 )
Raw socket output
- 일반적 output 은 sendto / sendmsg 로 이루어짐
- IP_HDRINCL set 안할시 - 커널이 IP 헤더 만들어 데이터 붙힘
- IP_HDRINCL set 할시 - 프로세스가 IP 헤더 만듬 ( Identification / checksum 제외 )
- TCP / UDP 는 로우소켓으로 가지 않음
- ICMP는 로우소켓으로 보내짐
- 이후 커널이 메시지 처리를 함
- 모든 작업을 커널이 처리
- IGMP는 로우소켓으로 보내짐
- IP 데이터그램은 로우소켓으로 보내짐 > protocol ID 확인
- 0이 아닌 프로토콜 > 로우 소켓 생성
- 로컬 IP > bind
- 외부 IP > connect
ICMP
-
IP는 신회성이 없고 연결성이 없어 에러 컨트롤을 하기 위해 만듦
-
에러 리포팅 / 질의
ㅇ ICMP 오류 메세지 (Error Reporting Message)
- 목적지도달불가 (Destination Unreachable) : Type 3
. Network Unreachable : Code 0
. Host Unreachable : Code 1
. Protocol Unreachable : Code 2
. Port Unreachable : Code 3
- 발신 억제 (Source Quench) : Type 4 (표준에서 제외됨)
- 재지정 (Redirect) : Type 5
- 시간 초과 (Time Exceeded) : Type 11
. 패킷이 루프를 돌거나, 과밀 발생, 타이머 값이 너무 낮게 설정된 경우
- 매개변수 문제 (Parameter Problem) : Type 12
ㅇ ICMP 정보성 메세지 (Informational Message) / 질의 메세지 (Query Message)
- 호스트 간에 연결성 검사 확인 등 ☞ ping, traceroute 참조
. 에코 응답 (Echo Reply) : Type 0
.. Ping Echo 응답, 데이터를 다시 리턴해 줌
. 에코 요청 (Echo Request) : Type 8
.. Ping Echo 요청, 옵션 데이터 가능
- 라우터 광고 (Router Advertisement) : Type 9
- 라우터 간청 (Router Solicitation) : Type 10
핑
- 프로그램이 호스트에 ICMP ECHO Request 를 보냄
- host가 ICMP Echo reply에 응답함
Ping Client
- host가 응답 가능한지 확인가능
- icmp_seq_number, TTL, RTT 확인가능
- 핑 상태를 측정 가능하다,
- Type 8 : Echo request , 0 : Echo reply