https://growth-coder.tistory.com/192
이전 포스팅에 IP 주소의 고갈 문제의 해결 방안으로 DHCP와 NAT에 대해 공부하였다.
이번 포스팅에는 또 하나의 해결 방안인 IPv6에 대해서 공부해보려고 한다.
우선 IPv6는 기존 IPv4 주소 체계의 고갈에 대비해서 고안된 새로운 주소 체계로 다음과 같은 특징을 가지고 있다.
- header가 40bytes로 고정되어 있다.
- fragmentation이 허용되지 않는다.
IPv4 header와 IPv6 header는 다음과 같은 차이점이 존재한다.
정리를 해보면
- header length가 없어졌다. 40bytes로 고정되었기 때문.
- identification, Flags, Fragment Offset과 같은 fragmentation 관련된 내용이 없어졌다.
- 시간을 줄이기 위해 checksum이 없어졌다. 네트워크 성능이 좋아져서 에러 확률이 줄어들었기 때문이다.
- options가 사라지고 next header가 생겼다.
IPv4 to IPv6
IP 주소의 고갈을 막기 위해 IPv6가 나왔다.
그런데 현재 이미 많은 사용자들이 IPv4를 사용 중이고 이 많은 사용자들의 IP 주소를 한번에 IPv6로 바꾸기는 사실상 불가능하다.
그러면 IPv4와 IPv6가 공존할 수 있어야 한다. 그래서 나온 개념이 tunneling이다.
tunneling이란 IPv4의 payload에 IPv6 데이터 그램을 넣어서 주고 받는 것이다.
겉에는 IPv4이므로 IPv4 라우터로 전송이 가능하고 도착하서 header를 제거하면 IPv6가 된다.
말단에서는 IPv6 라우터를 사용하는데 데이터를 network를 통해서 주고 받을 때는 IPv4 라우터를 사용하는 것이다.
IPv4의 payload에 IPv6를 넣거나 빼는 작업을 하는 라우터의 경우 인터넷 프로토콜 스택이 IPv4와 IPv6 두 개가 필요하다.
이를 듀얼 스택(dual stack)이라고 한다.
ICMP(Internet Control Message Protocol)
ICMP는 Network layer에서 사용하는 프로토콜로 주요 목적은 오류 및 네트워크 진단이다.
ICMP가 Network layer에 속하긴 하지만 정확히는 Network layer보다는 조금 상위의 개념이라고 볼 수 있다.
TCP, UDP와 같은 transport layer의 프로토콜처럼 IP 헤더에 의존하기 때문이다.
ICMP header는 다음과 같은 형식이다.
ICMP 메시지는 Type과 Code를 보고 어떤 에러가 발생했는지 확인할 수 있다.
몇 가지만 살펴보자면
Type | Code | Description |
0 | 0 | Echo Reply. 응답. |
3 | 3 | destination port unreachable. 목적지 포트에 도달하지 못했다. |
8 | 0 | Echo Request. 요청. |
11 | 0 | TTL exceeded. TTL은 라우터를 지날 때마다 1씩 감소한다. 0이 되면 ICMP를 통해 메시지를 보낸다. |
참고로 ICMP의 경우 TCP와는 다르게 handshake 과정을 거치지 않는다.
TCP는 handshake 과정을 통해서 신뢰성을 보장해주는데 ICMP의 목적은 오류 진단이다보니 연결을 하지 않는 것이다.
Traceroute
traceroute는 목적지까지의 IP 경로를 추적한다.
이 traceroute의 과정은 ICMP를 통해 이루어진다.
웹 사이트로 패킷을 보내면 다음과 같이 여러 개의 라우터를 거쳐서 목적지에 도착할 것이다.
위의 ICMP 메시지에서 Type이 11이고 Code가 0이면 TTL expired 에러를 의미한다.
바로 이 TTL expired 에러를 사용하여 IP 경로를 추적할 수 있다.
TTL은 하나의 라우터를 지날 때마다 1씩 감소하고 0이 되었을 때 ICMP 메시지에 TTL expired을 담아서 보낸다.
만약 TTL을 1로 설정하고 패킷을 보내면 첫 번째 라우터에서 TTL expired가 발생하고 그 라우터의 정보를 함께 담아서 주는 것이다.
그 다음에는 TTL을 2로 설정하면 두 번째 라우터의 정보를 얻을 수 있는 것이고 목적지에 도착할 때까지 TTL을 1씩 늘리면서 패킷을 계속 보내는 것이다.
이러한 방식으로 IP 경로를 추적한다.
윈도우에서는 tracert 명령어를 통해서 IP 경로 추적을 할 수 있는데 request도 ICMP를 사용하고 response도 ICMP를 사용한다.
다음은 cmd에 tracert 명령어를 입력하여 google에 패킷을 보낼 때의 IP 경로이다.
wireshark를 통해 캡처한 모습은 다음과 같다.
주고받은 패킷이 많아서 생략하고 목적지에 도착했을 때의 패킷을 보자.
TTL exceeded가 아닌 reply가 오는 모습을 확인할 수 있다.
패킷을 열어보면 type 0, code 0 즉 Echo Reply임을 알 수 있다.
참고로 linux 환경에서는 tracert가 아니라 traceroute이다.
또한 request protocol이 UDP이고 response protocol이 ICMP이다.
그래서 linux 환경에서 패킷이 목적지에 도달하면 type 0, code 0인 Echo Reply가 아닌 type 3, code 3인 destination port unreachable 메시지가 응답된다.
ICMPv6의 경우 ICMPv4와 거의 동일한데 추가된 부분이 존재한다.
IPv4에서는 패킷이 크면 fragmentation이 일어나는데 IPv6에서는 fragmentation이 일어나지 않는다.
그래서 ICMPv6의 경우 packet이 크다는 것을 의미하는 메시지 타입이 추가로 필요하다.
'공부 > Network' 카테고리의 다른 글
[Network] AS, OSPF, BGP (0) | 2023.06.12 |
---|---|
[Network] Routing Algorithms (0) | 2023.06.10 |
[Network] DHCP와 NAT (0) | 2023.06.06 |
[Network] IP addressing (0) | 2023.06.04 |
[Network] IP fragmentation (0) | 2023.05.31 |
댓글