[CS] 컴퓨터 네트워크 IP 프로토콜

재오·2023년 5월 29일
3

CS

목록 보기
22/35
post-thumbnail

Datagram & IP Header


IPv4에서의 데이터그램과 데이터그램에 담겨있는 헤더 모습이다.

  • VER: 어떤 필드가 어떻게 몇 비트 할당되어 있는지 알 수 있다.
  • HLEN: 옵션을 쓰면 헤더가 얼만큼인지 알 수 있어서 HLEN을 쓴다. 헤더는 최대 60바이트이기 때문에 4로 나눠서 숫자를 써준다. 상대방은 x4를 해서 헤더의 크기가 얼마인지 알 수 있다.
  • Total length: 헤더와 데이터를 포함한 전체 길이를 나타낸다. 뒤에 padding이 붙었는지 안붙었는지를 이거를 통해 알 수 있다.

    데이터에 문자열 'k'가 붙어있다고 가정을 해보자. 데이터는 TCP헤더 20바이트가 붙는다. IP헤더도 20바이트가 추가적으로 붙어서 총 41바이트 이다. 하지만 이 합이 최소 46이 넘어야 하기 때문에 41바이트보다 적으면 5바이트만큼 Padding이 붙는다. 따라서 Total length를 확인해서 46보다 작으면 Padding을 붙여줘야겠구나 하고 생각하는 것이다.
  • Time to live(TTL):데이터가 라우터를 거쳐서 최종 목적지에도달해야 하는데 잘못되어서 목적지로 가지 않고 라우터끼리 뺑뺑 돌 수가 있다. 그걸 방지하기 위해서 Maximum Hop Count를 적어둔다. Count 내로 목적지에 도달하지 못하면 버린다.
  • Protocol: 상위에서 온다면 IP헤더에 프로토콜을 적어두고 TCP인지 UDP인지 확인을 하는 용도이고, 반대로 하위에서 가는거라면 TCP로 보낼지 UDP로 보낼지 결정한다.

Example 1

IP 패킷이 8비트짜리 01000010이 들어왔는데 버렸다. 그 이유는 무엇일까?

처음 4비트는 VER이다. 0100(4)이므로 IPv4임을 확인할 수 있다. 이후 4비트는 헤더의 사이즈이다. 0010(2)이므로 2 x 4 = 8이나온다. 하지만 헤더는 최소 20바이트이기 때문에 뭔가 잘못된 것이다. 따라서 버린다.

Example 2

hexdecimal로 45000028000100000102...이 주어졌다. 여기서 몇번의 hop를 지나가게끔 되어있나?

hexdecimal은 한 칸당 실제 4비트를 의미한다. 보통 2칸을 하나로 묶어서 표현한다. 헤더를 보게된다면 한 줄에 32비트씩이고, TTL은 세번째 칸 처음 부분이기 때문에 64비트, 8번을 건너뛰고 바로 그 직후칸인 9번째 칸을 확인하면 된다. 9번째는 01이다. 따라서 한번 지나간다.

Fragmentation

Flags


위에 헤더에서 2번째 칸에 3비트짜리 flag를 살펴보자. 첫 비트는 사용하지 않고 뒤에 두개의 비트만 사용한다. 보내는 사람이 세팅을 할 수있다. 트럭에서 2M짜리 물건을 승용차에 옮길 때 쪼개서 옮기는 상황과 비슷하다. '분할하지 마세요'(D) 라고 쓰여져 있는 것은 분할하지 못하고 그대로 버린다. M이라고 쓰여져 있는 곳은 만약 1이라고 되어 있으면 '뒤에도 더 있으니까 기다리세요' 라는 의미이다. 마지막에 0이라고 쓰여져 있으면 지금까지 분할되었던 것을 합치는 것이다.

Fragmentation offset

간단하게는 순서를 맞추는 용도이다. 기존의 데이터 총 길이는 16비트이다. 하지만 13비트를 사용하기 때문에 3비트가 비게 된다.

Offset 값을 8로 나눈 값으로 저장을 하면 이 문제를 해결할 수 있다. 원래 순서는 1400이지만 8로 나눈 175라는 값이 헤더 안에 들어가게 되는 것이다.

MTU

Frame 안에 아까 Payload가 최소 46바이트라고 했었다. 하지만 최대값도 존재한다. 그것이 MTU이다.
위 상황을 예시로 들어서 응용을 해보자. 위 그림에서는 3개로 분할이 되었다. 1400개씩 3번 나누었는데 MTU는 1420으로 정해두면 된다. 1420으로 해두면 20바이트를 뺀 1400바이트씩 나눠서 총 3번 하면 되겠구나 인식할 수 있다.

Identification

마지막에 식별을 하기 위한 용도로 사용된다.

위 그림이 분할을 하고 조합까지의 최종 경로이다. 하지만 맨 오른쪽 두개는 흔치 않은 상황에서 MTU가 오류로 잘못 분할되었을 때를 나타내므로 그냥 넘겨도 된다.

Example

Offset이 100인 패킷이 들어왔다. HLEN은 5이고 total length는 100이다. 그렇다면 첫번째 바이트와 마지막 바이트는 얼마인가?

먼저 Offset이 100인 것은 x8을 해서 800부터 시작한다는 의미이다. HLEN이 5이기 때문에 x4한 값이 헤더의 길이이다. 헤더의 길이는 20바이트이고 100에서 20을 빼면 80이다. 따라서 시작 바이트는 800이고 100에서 헤더의 길이인 20을 뺀 80 즉, 879가 마지막 비트이다.

Option

TCP와 마찬가지로 40바이트 정도 옵션을 차지한다.

첫번째 바이트에는 이 옵션이 어떠한 옵션인지를 나타내고, 두번째 바이트에는 옵션의 길이, 세번째 value에는 데이터를 저장한다. 옵션의 종류 6가지를 클래스로 나누는데, 크게는 Datagram controlDebugging and management로 나뉜다. 또 fragment할 때 옵션도 copy 할 것인가 아니면 버릴 것인가로 또 나뉘게 된다.

옵션의 종류는 Single-byteMultiple-byte 두개로 나뉜다. 싱글바이트는 TCP와 비슷하기 때문에 넘어간다. Multiple Option에 대해 자세히 살펴보자.

Record-route option


Record-route option7번을 쓴다. 위 그림은 기본 헤더를 제외한 옵션 부분만 그린 것이다. 옵션의 길이는 15이고 다음번에 쓸 공간을 포인터로 세번째 칸에 적어준다. 그리고 포인터를 받으면 자기 주소를 다음 칸에 적어준다. 그리고 또 다음을 가리키는 공간을 적어준다. 그것을 또 받으면 본인의 주소를 적어준다. 이 옵션은 얘가 여기까지 올 때 여기 여기 여기를 거쳐서 왔구나를 알 수 있는 것이다.

Strict-source-route option


이 옵션은 헤더에 최종 목저지를 적어둔 것이 아니라 거쳐야 할 라우터를 적어둔 것이다. Type Number는 137을 사용한다. 네트워크에서 source-route는 패킷에다 거쳐서 가는 경로를 미리 다 적어두는 것을 의미한다. 위 그림을 보면 알다시피 테이블을 목적지 주소와 칸에 있는 주소를 계속 바꿔줘야 한다. 이동할 때마다 포인터가 가리키는 곳을 목적지 주소로 업데이트 해주고 목적지 주소를 밑에 옵션 칸에 넣어주는 작업을 반복해야 한다.
네트워크 관리자들이 physical 경로를 잘 확인할 수 있는 용도이다. Record-route option과의 차이점은 Strict-source-route option은 라우터를 기준으로 왼쪽에 있는 주소를 기준으로 작동을 한다.

Loose-source-route option

Loose-source-route optionStrict-source-route option과 비슷하지만 후자는 반드시 정해진 경로대로만 이동을 해야하는 반면에 Loose-source-route option은 조금 더 유연하다. 다른 곳을 거쳐서 가더라도 상관이 없다. Type은 131번을 사용한다.

TimeStamp option


Type Number로 68을 사용한다. 두번째 칸은 길이이고 세번째 칸은 포인터를 의미한다. 다섯번째 칸은 flag를 의미하는데 0이면 시간만 적고, 1이면 IP주소와 시간을, 3이면 IP주소는 테이블에 이미 적혀있고 시간만 적는다.

profile
블로그 이전했습니다

3개의 댓글

comment-user-thumbnail
2023년 5월 29일

Fragmentation.... 메모리 단편화... 너무 어렵군요.

1개의 답글