[Computer Network] IP Header

G·2023년 5월 23일
0

Computer Network

목록 보기
17/20

IP 헤더에 대해 알아본다.

[20, 60] bytes의 가변적 길이를 가지는 헤더이다.

HLEN은 TCP와 동일하다.(Service type은 잘 안쓰이니 무시한다.)

  • VER: IP의 version 정보가 저장된다.
  • Total-length: header + payload의 길이를 저장한다.
  • Time to live: 특정 router의 deliver 수를 넘어가면 패킷을 버린다. 각각의 라우터가 1씩 빼준다.
  • Header checksum: checksum을 통해 패킷에 에러가 존재하는지 확인한다.
  • Source IP address: 패킷을 전송하는 디바이스의 IP 주소이다.
  • Destination IP address: 패킷을 전달 받는 디바이스의 IP 주소이다.
  • Options + padding: 패킷 전송에 붙는 option과 크기를 맞추기 위한 paddidng이 포함된다.

Total-length


ethernet frame의 패킷이다. frame의 payload는 46 byte를 넘겨야 하기 때문에, 만약 41byte일 경우 5byte의 padding이 붙는 식이다.
그러므로 total-length가 필요하다.

참고로 frame의 payload는 최소 46 byte여야 하지만 최대 크기는 네트워크마다 다르다. 이를 Maximum Transmission Unit(MTU)라고 한다.

Protocol



IP 헤더엔 상위 프로토콜에 대한 정보가 필요하다. 이를 8bit protocol에 저장한다.

만약 IP 헤더의 시작 8bit 부분이 01000010 이라면 헤ㅇ더의 크기가 8 byte이기 때문에 버려야 한다.

헤더가 32byte인 경우엔 20 + 12 byte로, 12 byte는 옵션이다.
aa

3bit짜리 flag 부분은 뭘까? datagram은 분할될 수 있다.

위와 같이 3bit 중 가운데가 1이면 분할하지 말라는 것이다. MTU를 넘어가 분할해야하는 상황엔 패킷을 그냥 버린다.

이제 M을 알아보자.

위와 같이 MTU보다 패킷이 커 라우터가 분할해야하는 상황에 마지막 bit을 1으로 set한다. 1인 경우 "나 분할됐어요 뒤에 분할된 패킷 더 있어요" 이고, 0인 경우 "나 분할된 놈들 중 마지막입니다."를 의미한다.

13bit의 framentation bit은 분할된 패킷의 크기를 저장한다.
3bit가 나가리 됐기 때문에 offset을 3bit, 즉 8로 나누어 저장한다.
그럼 여기서 payload가 1400 byte인 것을 알았다. 헤더는 모든 패킷에 무조건 붙어야 하기 때문에 MTU는 1420 byte일 것이다.

identification bit은 식별을 하기 위한 bit이다. 이를 보고 분할된 패킷을 재조합한다.


idetification bit: 14,567
14,567 식별자를 가진 패킷이 MTU보다 커 분할되는 상황이다.

4000byte에서 1400byte로 분할된다. 거기에 헤더값을 더한 값이 MTU가 될 것이다.
이중 분할되는 경우는 분할된 패킷이 다른 네트워크 경로를 거치다 한번 더 분할되는 경우이다.

Option


옵션은 위의 이미지처럼 붙으며 최대 20byte이다.

  • Copy: 분할시 첫 번째 fragment에만 옵션을 저장할지, 모든 패킷에 저장할지 결정한다.
  • Class: 옵션에 따라 debugging이 목적인지, datagram control이 목적인지 결정한다.
  • Number: 옵션의 종류이다.
    그리고 옵션의 길이, 데이터 저장공간으로 나뉜다.


옵션의 종류이다. 하나의 byte만 사용하면 padding, multiple-byte면 다른 옵션들이다.

No operation option


옵션 중간에 포함되는 padding이다.

End-of-option


옵션 마지막 부분에 채우는 padding이다.

Record-route option


특정 목적지로 패킷을 전송할 때 지나간 경로(라우터)의 IP 주소를 기록하는 옵션이다.


다음과 같이 포인터가 변경되며 라우터의 IP주소가 기록된다.
총 길이(length)는 option과 value 부분의 합이다.

source 기준으로 나가는쪽 router가 기록되므로 목적지는 패킷이 송신된 경로를 알 수 있다.
그럼 목적지 device는 source까지의 경로를 알 수 있게 된다.

Strict-source-route option


특정 목적지까지 가는 경로를 미리 지정해놓고 이를 따라가게 하는 option이다.


처음에 세팅되는 IP주소는 source 기준으로 router에 들어가는 IP주소이다.
이후에 delivery forwarding하며 Destination 부분과 table 부분이 변경되며 목적지까지 도달한다.
세팅된 라우터를 거치지 않으면 패킷은 버려진다.
네트워크가 관리자가 해당 경로로 패킷이 송신되는지 점검할 때 사용할 수 있다.
그러므로 source 기준으로 들어가는 쪽의 router IP 주소가 적힌다.

loose-source-route option


좀 더 온화된 버전이다. 중간에 다른 라우터를 거쳐도 된다.
이는 특정 라우터를 거치는지 알고 싶을 때 사용할 수 있다.

TimeStamp


패킷이 전송될 때의 시간을 기록하는 옵션이다.

  • 0: 라우터를 지나갈 때마다의 시간을 기록한다.
  • 1: 라우터를 지나갈 때마다의 시간과 IP주소를 기록한다.
  • 2: 지나갈 라우터의 IP주소가 주어지고 이에 대한 시간이 기록된다.

timstamp만 debugging 용이다.

Linux utilities


host 서버가 죽었는지 살았는지 알아보기위해 사용한다.
또는 자신의 네트워크가 잘 동작하는지 알아보기 위해 사용한다.
고정 IP 세팅을하고 사용해본다.
상대방 network layer까지 갔다 와서 ttl을 알려준다.


record-route-option을 추가할 수 있다. -R 옵션


특정 도메인 또는 IP 주소로 가는 경로에 놓인 라우터의 IP주소와 라우터에 대한 ttl을 모두 구한다.
세 번씩 구하며 각각 세 번씩 구하기 때문에 두 번째가 세 번째보다 더 느린 경우도 존재한다.
(경로상에 놓인 라우터에 전송하는 것이며 한 홉씩 확장되기 때문에 느린 경우가 발생하는 것이다.)


-g 옵션은 loose source routing을 구현한 것이다.
-g 옵션과 특정 라우터의 IP주소를 입력하면 이 라우터를 거치는지 알 수 있다.
(입력한 IP를 거치지 않을 수도 있다.)


-G 옵션은 strict source routing을 구현한 것이다.
입력한 IP 주소를 거치는 것을 강제한다.

CheckSum


패킷에 에러가 존재하는지 알기 위한 방법이다.
16bit 단위로 헤더를 모두 더하고 여기에 보수를 취해 전달한다.
수신측에서 헤더를 모두 더해 checkSum 부분과 더해 0일 경우 에러가 없는 것으로 간주한다.
0이 아닐 경우 그냥 버린다.

TCP에서 헤더와 payload 부분을 모두 검사하기 때문에 IP는 헤더만 해도 된다.
checkSum이 만능은 아니다.

IP component


패킷을 송신할 때는 아래로 내려가고, 수신할 때는 위로 올라간다.
송신의 경우, 상위 protocol에서 헤더를 붙여 datagram을 생성하고 routing table을 통해 맥주소를 할당, 분할해야할 경우 분할한다.
수신의 경우, 하위 프로토콜에서 Reassembly module을 통해 같은 identification 끼리 재조합을 수행한다. 그리고 상위 protocol로 올려준다.

Reassembly module은 나중에 알아본다.

datagram의 payload, 즉 TCP 패킷이 크다면 이를 분할해야한다. Datagram ID는 이전에 본 identification bit 정보이고 이와 같은 패킷들을 linked-list에 저장한다.
단 하나의 분할된 패킷이 오지 않고 이전에 설정된 Time-out 값이 0이 되거나 정해놓은 시간이 지나면 패킷을 모두 버린다.

다시 요청해달라고 안 한다. 이미 TCP에서 3 중복 ACK을 통해 알아서 처리하기 때문이다.
(loss 된 패킷 이후 세 개의 패킷이 도착해야 알아서 세 개의 중복된 패킷이 간다.)

그래서 fragmentation이 많이 일어나지 않게 하는 것이 좋다.

profile
열심히 안 사는 사람

0개의 댓글