✔옵션은 모든 데이터그램에 다 필요하진 않다. 옵션은 IP소프트웨어의 일부이기때문에 처리하는데 시간이 오래걸려 잘 사용하지 않는디. 우리는 모든 옵션을 다 확인하지 않고 Multiple-Byte에서 Record route, Strict source route, Loose source route, Timestamp 이 4가지만 볼 것이다.
📌Record route
- 데이터그램를 다루는 인터넷 라우터를 기록한다. Pointer 필드는 first empty entry의 바이트 수를 포함하는 offset integer 필드이다.
- Outgoing buffer만 기록한다. (source: 67.34.30.6 , Destination: 138.6.25.40)
📌Strict source route
- 지정한 패스 상의 router만 지나가도록 지정한다. 만약 데이터그램이 리스트상에 없는 라우터를 방문한다면 데이터그램은 discard되고 에러메세지가 발생한다.
📌Loose source route
- 지정한 패스를 지나가되 중간에 다른 라우터를 경유할 수 있다.
📌Timestamp
- 이 명령은 라우터가 패킷이 헤더에 도착한 시간의 타임스탬프를 기록하고 우리에게 다시 보내도록 합니다.
📌Checksum
- TCP/IP 프로토콜에서 사용하는 에러검사 방법이다. 네트워크를 통해 전달된 값이 변경되었는지 검사하는 값으로 무결성을 제공한다. 중복 검사의 한 형태이며 통신에서 CRC, 즉 순환 중복 검사를 체크섬이라고도 말하는데 엄밀히 따지면 체크섬은 나열된 데이터를 더하여 체크섬 숫자를 얻고, 정해진 비트 수의 모듈라로 정해진 비트 수로 재구성한다. 만약 체크섬이 맞아 떨어지지 않는다면 메시지가 손상되었다고 결론을 내릴 수 있다.
- 패킷이 라우터를 지나갈 때마다 TTL의 값이 변경되므로 Checksum은 항상 재계산된다. 즉 라우터를 하나 통과할때마다 전 체크섬에 2^8(100000000)을 더해준다.
💡 계산방법
- 수신 측에서 ip헤더를 2Byte(16bit)씩 나눈다.
- 체크섬을 제외한 모든 필드의 값을 더해준다.
- 패킷에서 체크섬의 크기가 2byte를 넘지 못하기 때문에 모두 더한 값에서 캐리값이 발생하면 뒤에 더해준다.
- 나온 값을 1의 보수를 취해준다. 2진수의 값에서 0은 1로, 1은 0으로 바꿔준다.(ex 0000 1101 0011 0101 -> 1111 0010 1100 1010 이 값이 Checksum)
[2진수로 Checksum 구하기]
[16진수로 Checksum 구하기]
-
예시: IP Header : 4500 003c 1c46 4000 4006 0000(초기화된 체크섬 필드) ac10 0a63 ac10 0a0c
4500 + 003c + 1c46 + 4000 + 4006 + 0000 + ac10 + 0a63 + ac10 + 0a0c = 0002 4e17
-> 0002 + 4e17 = 4e19
~4e19 = b1e6
-
수신 측에서는 체크섬을 포함하여 다시 체크섬을 구한다. IP 패킷에 문제가 없을 경우 수신 측 체크섬의 값은 0xffff(4e19 + b1e6)의 1의 보수인 0x0이 된다.