IP 구조, Fregmentation
네트워크 레이어 프로토콜
IP
ICMP - 에러 리포팅, 라우터 시그널링
Routing protocols(라우터끼리 데이터 교환할 때 사용): RIP, OSPF, BGF
** ICMP
IP는 에러 신경 안씀, 신경써야 하면 ICMP 사용
IP 구조
| ver | head. len | type of service | length | |
| 16-bit identifier | flags | fragment offset | ||
| time to live | upper layer | header checksum | ||
| 32 bit source IP address | ||||
| 32 bit destination IP address | ||||
| options (if any) | ||||
| data (variable length, typically a TCP or UDP segment) |
||||
ver : IPv4, IPv6
head. len : 헤더 길이 (최소 20바이트)
type of srevice : 텍스트 등
length : 전체 데이터그램 크기
16-bit identifier
flags
fragment offset
time to live : 지나칠 홉의 개수를 예측한 값, 하나 지날 때마다 하나씩 값을 내림
** 값이 0이 됐는데 도착을 안했다? -> 예정과 달리 도착을 안한 거니 폐기. 어차피 송신자가 재전송할 것
upper layer : TCP, UDP
header checksum : TCP/UDP에서 체크해서 사실 필요가 없음 -> IPv6에는 없음 ( 링크 레이어에서도 체크함
IP Fragmentation
길이 좁으면 데이터그램 쪼개기 가능( MTU, Max Transfer Size. 대역폭 )
각각 헤더를 다시 달아주는데 이때 identifier, flags, fragment offset 사용
쪼개진 데이터그램은 최종 도착지에서 재조립
| length = 4000 | ID = x | frag flag = 0 | offset = 0 |
MTU가 1500이라 하면 위 데이터그램은 지나갈 수 없음
| length = 1500 | ID = x | frag flag = 1 | offset = 0 |
| length = 1500 | ID = x | frag flag = 1 | offset = 185 |
| length = 1040 | ID = x | frag flag = 0 | offset = 370 |
이렇게 세 조각으로 나누면 지나갈 수 있음
이때, IP 헤더 20바이트를 고려해서 length = 1480 + 20 이 되도록 해야 한다.
ID는 같으면 원래 같은 패킷이었다는 것을 의미한다.
flag는 1이면 뒤에 더 따라올 패킷이 있음을 의미한다.
offset : 데이터가 조각화되면, 처음에서 얼마나 떨어져 있는 데이터인지 오프셋을 줘야 함
1480 / 8 = 185, 1480 * 2 / 8 = 370
왜 8로 나누는가? 그냥 단위가 8