출처 : Youtube
네트워크 상에서 데이터를 교환하기 위한 프로토콜이다. 데이터가 정확하게 전달될 것을 보장하지 않는다. (이후 알아볼 4계층 프로토콜이 이러한 부분을 보정해준다.) IPv4 프로토콜은 기본적으로 20bytes 로 구성되어 있다. 거기에 옵션으로 최대 10개가 붙게되고 각 옵션은 4bytes를 가진다.그래서 IPv4 프로토콜은 최대 60bytes를 가진다.(보통 옵션이 잘 안붙고 붙어봤자 2개정도 붙는다고 한다.)
Version(4bit) : IP 프로토콜의 버전을 표시, IPv4의 경우 4, IPv6는 이것과 구조가 아예다름
IHL(Header Length)(4bit) : 해당 프로토콜의 길이, 20~60bytes를 가지는데 4bit가 할당되어 있어 4로 나눈값을 가짐, 일반적으로 20bytes 이므로 5가옴
Type of Service(TOC)(8bit) : 과거에 개발할때 쓰는 값인데 지금은 안씀, 00을 가짐
Total Length(16bit) : 페이로드를 포함한 패킷 전체의 길이
Identification(8bit) : 큰 데이터를 보낼때 최대 전송 단위가 있기때문에 분할해서 보낸다. 그 때 Identification이 같은 패킷은 하나의 데이터가 나누어져 보내진 것을 뜻한다.
IP Flags(3bit) : 3bit 로 구성되어 있으며 x,D,M 비트를 가짐. x는 쓰지 않는다. D(Don't Fragmentation)은 이 패킷을 보내는 사람이 데이터를 쪼개지 않고 보내겠다는 것을 의미한다. 만약 최대 전송 단위를 넘어서는 데이터를 보낼때 이 값을 1로 두게 되면 데이터가 전송되지 않는다. 잘 쓰지 않는다. M(more fragmentation) 은 조각화 해서 보낼때(최대 전송단위보다 큰 데이터를 보낼때) 사용하며 상대방에게 아직 보낼 데이터가 남아있음을 알려준다.
Fragment Offset(13bit) : 데이터를 조각화 해서 보내게 되면 보낸 순서대로 받지못할수도있다. Fragment Offset은 그 순서를 알려준다. 조각화된 데이터의 Offset을 알려줌
Time To Live(TTL)(8bit) : 네트워크의 경로를 잘못 짜주어 패킷이 특정 cycle을 순환하는 형태가 되면 도착지까지 도달하지 못하고 계속 쌓이게 된다. 그렇게 되면 네트워크 장비들끼리 서로 도스공격하는 꼴이 된다. 따라서 패킷의 수명을 지정해주어야한다. TTL은 초기값이 세팅되어있고 3계층 장비인 라우터와 같은 것을 통과하게하면 1씩 줄어들게된다. 0이되는 순간 네트워크 장비는 다른사람에게 이 패킷을 전달하지 않고 버려버린다. 윈도우는 128, 리눅스는 64로 설정한다.
Protocol(8bit) : 상위 프로토콜이 무엇인지 알려준다.(eg. ICMP:1, TCP:6, UDT: 17)
Header Checksum(16bit) : 보낼때 이 헤더가 잘못된 값인지 검사하고 검사한 값을 저장한다. 받을때 한번 더 계산하여 원래 저장된 Header Checksum과 같은지 확인한다.
ICMP(Internet Control Message Protocol)은 상대방과 통신이 되나 안되나 확인하는 프로토콜이다. Type은 대분류이고 Code는 소분류이다. Type은 많은 종류가 있다. Echo Reply(0)은 통신이 잘 되는지 응답, Echo(8)은 요청, Destination Unreachable(3)는 목적지까지 가지 못했음을 의미(경로상의 문제가 있다),Time Exceeded(11)는 목적지까지 도달하였으나 응답을 받지 못했을때(상대방에 문제가 있다.eg.방화벽), Redirect(5) 원격지에 있는 상대방의 routing table을 ICMP로 수정할때 쓰는 것이다.
cmd 창에 netstat -r 을 통해 확인가능하다. 목적 IP주소로 가기위해 어디로 보내야 하는지 설정되어있는 표이다. 만약 라우팅 테이블에 기록되어 있지 않은 주소라면 해당 주소로 찾아갈 수 없다.
보통 패킷의 최대전송단위(MTU)는 1500bytes이다. 그래서 14bytes인 Ethernet프로토콜이 붙은 프레임은 1514bytes가 된다. 패킷이 최대 전송 단위를 벗어나게되면 조각화가 일어난다.