먼저 IP헤더이다.
#include <linux/ip.h>
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ihl:4,
version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8 version:4,
ihl:4;
#else
#error "Please fix <asm/byteorder.h>"
#endif
__u8 tos;
__be16 tot_len;
__be16 id;
__be16 frag_off;
__u8 ttl;
__u8 protocol;
__sum16 check;
__be32 saddr;
__be32 daddr;
/*The options start here. */
};
ihl: ip헤더의 길이, 4바이트 단위 (ex, 5 -> 20바이트, 옵션 포함 시 최대 15 -> 60바이트 까지)
version: TCP/IP는 4
--------------------------------------------------------------------------------------------------------------
tos: Type of Service, 여러 플래그를 설정할 수 있지만 주로 0
tot_len: IP 헤더를 포함한 전체 패킷의 바이트 단위 크기(최대 65535 까지)
id: 단편화 발생 시 원래 데이터를 식별하기 위한 식별자, 같은 데이터 그램에 속하면 같은 번호를 갖는다.
---------------------------------------------------------------------------------------------------------------
frag_off: 단편화 오프셋
16비트 중 첫번째 비트는 항상 0이며, 두번째 비트는 Don`t Fragment, 세번째 비트는 More fragment로
Don`t Fragment가 [0] 이면 라우터에서도 단편화가 가능함을 뜻하고
[1] 이면 더 이상 단편화를 하지 말 것을 뜻한다.
More Fragment가 [0] 이면 현재가 단편화된 데이터 그램의 마지막 임을 뜻하고
[1] 이면 뒤이어 단편화된 조각이 더 있음을 뜻한다.
이하 13비트는
8바이트 단위로 최초 분열 조각으로부터의 오프셋을 나타냄.
---------------------------------------------------------------------------------------------------------------
ttl: Time to Live
protocol: 상위 계층의 프로토콜 번호
check: IP 체크섬
saddr: 출발지 IP주소
daddr: 도착지 IP주소
ICMP 헤더이다.
#include <linux/icmp.h>
struct icmphdr {
__u8 type;
__u8 code;
__sum16 checksum;
union {
struct {
__be16 id;
__be16 sequence;
} echo;
__be32 gateway;
struct {
__be16 __unused;
__be16 mtu;
} frag;
__u8 reserved[4];
} un;
};
참조
http://ktword.co.kr/abbr_view.php?m_temp1=1859
'리눅스 커널 > 네트워크' 카테고리의 다른 글
Raw socket incoming packet capture (0) | 2021.10.24 |
---|---|
Ethernet & ARP Header (0) | 2021.10.24 |
TCP & UDP Header (0) | 2021.10.24 |
ioctl - socket (0) | 2021.10.24 |
struct net_device example (0) | 2021.10.24 |