IPv4에서의 데이터그램과 데이터그램에 담겨있는 헤더 모습이다.
padding
이 붙었는지 안붙었는지를 이거를 통해 알 수 있다.Padding
이 붙는다. 따라서 Total length
를 확인해서 46보다 작으면 Padding
을 붙여줘야겠구나 하고 생각하는 것이다.Maximum Hop Count
를 적어둔다. Count 내로 목적지에 도달하지 못하면 버린다.IP 패킷이 8비트짜리 01000010
이 들어왔는데 버렸다. 그 이유는 무엇일까?
처음 4비트는 VER
이다. 0100(4)이므로 IPv4임을 확인할 수 있다. 이후 4비트는 헤더의 사이즈이다. 0010(2)이므로 2 x 4 = 8이나온다. 하지만 헤더는 최소 20바이트이기 때문에 뭔가 잘못된 것이다. 따라서 버린다.
hexdecimal로 45000028000100000102...
이 주어졌다. 여기서 몇번의 hop를 지나가게끔 되어있나?
hexdecimal은 한 칸당 실제 4비트를 의미한다. 보통 2칸을 하나로 묶어서 표현한다. 헤더를 보게된다면 한 줄에 32비트씩이고, TTL
은 세번째 칸 처음 부분이기 때문에 64비트, 8번을 건너뛰고 바로 그 직후칸인 9번째 칸을 확인하면 된다. 9번째는 01이다. 따라서 한번 지나간다.
위에 헤더에서 2번째 칸에 3비트짜리 flag
를 살펴보자. 첫 비트는 사용하지 않고 뒤에 두개의 비트만 사용한다. 보내는 사람이 세팅을 할 수있다. 트럭에서 2M짜리 물건을 승용차에 옮길 때 쪼개서 옮기는 상황과 비슷하다. '분할하지 마세요'(D) 라고 쓰여져 있는 것은 분할하지 못하고 그대로 버린다. M이라고 쓰여져 있는 곳은 만약 1이라고 되어 있으면 '뒤에도 더 있으니까 기다리세요' 라는 의미이다. 마지막에 0이라고 쓰여져 있으면 지금까지 분할되었던 것을 합치는 것이다.
간단하게는 순서를 맞추는 용도이다. 기존의 데이터 총 길이는 16비트이다. 하지만 13비트를 사용하기 때문에 3비트가 비게 된다.
Offset 값을 8로 나눈 값으로 저장을 하면 이 문제를 해결할 수 있다. 원래 순서는 1400이지만 8로 나눈 175라는 값이 헤더 안에 들어가게 되는 것이다.
Frame
안에 아까 Payload
가 최소 46바이트라고 했었다. 하지만 최대값도 존재한다. 그것이 MTU
이다.
위 상황을 예시로 들어서 응용을 해보자. 위 그림에서는 3개로 분할이 되었다. 1400개씩 3번 나누었는데 MTU는 1420으로 정해두면 된다. 1420으로 해두면 20바이트를 뺀 1400바이트씩 나눠서 총 3번 하면 되겠구나 인식할 수 있다.
마지막에 식별을 하기 위한 용도로 사용된다.
위 그림이 분할을 하고 조합까지의 최종 경로이다. 하지만 맨 오른쪽 두개는 흔치 않은 상황에서 MTU가 오류로 잘못 분할되었을 때를 나타내므로 그냥 넘겨도 된다.
Offset이 100인 패킷이 들어왔다. HLEN은 5이고 total length는 100이다. 그렇다면 첫번째 바이트와 마지막 바이트는 얼마인가?
먼저 Offset이 100인 것은 x8을 해서 800부터 시작한다는 의미이다. HLEN이 5이기 때문에 x4한 값이 헤더의 길이이다. 헤더의 길이는 20바이트이고 100에서 20을 빼면 80이다. 따라서 시작 바이트는 800
이고 100에서 헤더의 길이인 20을 뺀 80 즉, 879
가 마지막 비트이다.
TCP와 마찬가지로 40바이트 정도 옵션을 차지한다.
첫번째 바이트에는 이 옵션이 어떠한 옵션인지를 나타내고, 두번째 바이트에는 옵션의 길이, 세번째 value에는 데이터를 저장한다. 옵션의 종류 6가지를 클래스로 나누는데, 크게는 Datagram control
와 Debugging and management
로 나뉜다. 또 fragment할 때 옵션도 copy 할 것인가 아니면 버릴 것인가로 또 나뉘게 된다.
옵션의 종류는 Single-byte
와 Multiple-byte
두개로 나뉜다. 싱글바이트는 TCP와 비슷하기 때문에 넘어간다. Multiple Option에 대해 자세히 살펴보자.
Record-route option
은 7번
을 쓴다. 위 그림은 기본 헤더를 제외한 옵션 부분만 그린 것이다. 옵션의 길이는 15
이고 다음번에 쓸 공간을 포인터
로 세번째 칸에 적어준다. 그리고 포인터를 받으면 자기 주소를 다음 칸에 적어준다. 그리고 또 다음을 가리키는 공간을 적어준다. 그것을 또 받으면 본인의 주소를 적어준다. 이 옵션은 얘가 여기까지 올 때 여기 여기 여기를 거쳐서 왔구나를 알 수 있는 것이다.
이 옵션은 헤더에 최종 목저지를 적어둔 것이 아니라 거쳐야 할 라우터를 적어둔 것이다. Type Number는 137을 사용한다. 네트워크에서 source-route
는 패킷에다 거쳐서 가는 경로를 미리 다 적어두는 것을 의미한다. 위 그림을 보면 알다시피 테이블을 목적지 주소와 칸에 있는 주소를 계속 바꿔줘야 한다. 이동할 때마다 포인터가 가리키는 곳을 목적지 주소로 업데이트 해주고 목적지 주소를 밑에 옵션 칸에 넣어주는 작업을 반복해야 한다.
네트워크 관리자들이 physical 경로를 잘 확인할 수 있는 용도이다. Record-route option
과의 차이점은 Strict-source-route option
은 라우터를 기준으로 왼쪽에 있는 주소를 기준으로 작동을 한다.
Loose-source-route option
은 Strict-source-route option
과 비슷하지만 후자는 반드시 정해진 경로대로만 이동을 해야하는 반면에 Loose-source-route option
은 조금 더 유연하다. 다른 곳을 거쳐서 가더라도 상관이 없다. Type은 131번
을 사용한다.
Type Number로 68
을 사용한다. 두번째 칸은 길이이고 세번째 칸은 포인터를 의미한다. 다섯번째 칸은 flag
를 의미하는데 0이면 시간만 적고, 1이면 IP주소와 시간을, 3이면 IP주소는 테이블에 이미 적혀있고 시간만 적는다.
Fragmentation.... 메모리 단편화... 너무 어렵군요.