[Network] 네트워크 계층 : ICMP / IPv6
2022. 2. 23. 14:11ㆍMajor`/컴퓨터 네트워크
ICMP (Internet Control Message Protocol)
1. (Host - Host) / (Host - Router) / (Router - Router) 간에 네트워크 계층 제어 정보 교환을 위한 프로토콜
- 에러 발생 여부
- 상호간에 서로 살아있는지 확인 (네트워크 연결 여부)
>> Data를 교환하는게 아니라 상호간에 제어 정보를 교환하기 위한 프로토콜이다
2. IP의 상위 계층이다
- 물론 IP / ICMP / Routing_P 3개 모두 네트워크 계층 안에 속하긴 하지만, 그 안에서도 상위-하위가 나뉘어져 있다
- 따라서, ICMP 메시지는 최종적으로 IP 데이터그램의 페이로드에 캡슐화되어서 보내진다
IP 헤더 | 페이로드 |
출발지 IP / 목적지 IP / .... | ICMP 메시지 + 여러 Data |
ICMP 메시지 - 타입 - 코드 - 에러가 발생한 IP 데이터그램의 첫 8bytes |
ICMP 메시지 | ||
타입 | 코드 | 설명 |
0 | 0 | echo reply (ping) |
3 | 0 | dest network unreachable |
3 | 1 | dest host unreachable |
3 | 2 | dest protocol unreachable |
3 | 3 | dest port unreachable |
3 | 6 | dest network unknown |
3 | 7 | dest host unknown |
4 | 0 | sourch quench (congestion control - not used) |
8 | 0 | echo request (ping) |
9 | 0 | route advertisement |
10 | 0 | router discovery |
11 | 0 | TTL expired |
12 | 0 | bad IP header |
- (0, 0) & (8, 0)
- 상호간에 서로 살아있는지 확인하는 ICMP 메시지
- (3, 0 ~ 7)
- Destination의 문제 or IP헤더의 문제로 인해 데이터그램이 제대로 전송되지 않았을 경우
- (9, 0) & (10, 0)
- 라우팅 프로토콜을 위해 사용되는 ICMP 메시지
- (11, 0) & (12, 0)
- 데이터그램 Drop 관련 ICMP 메시지
- TTL expired : 데이터그램의 TTL 종료
- Bad IP header : IP 헤더의 체크섬을 체크했는데 오류가 존재할 경우
Traceroute & ICMP
Traceroute 프로그램 : Source ↔ Destination 간의 Router 이름 + 해당 Router 주소를 추적하는 프로그램
- ICMP 메시지를 활용해서 추적한다
동작 과정
1. Source는 Destination에 UDP 세그먼트를 3개씩 계속 보낸다 :: UDP 세그먼트 3개당 한 Set
- 첫번째 데이터그램 TTL = 1
- 이 데이터그램은 Hop(1) Router에서 TTL expired가 발생하게 된다
- 따라서, Hop(1) Router에서 (11, 0 : TTL expired) ICMP 메시지를 Source로 보낸다
- ICMP 메시지에 추가적으로 라우터 이름 + 라우터 IP주소가 포함된다
- 두번째 데이터그램 TTL = 2
- 이 데이터그램은 Hop(2) Router에서 TTL expired가 발생하게 된다
- 따라서, Hop(2) Router에서 마찬가지로 (11, 0 : TTL expired) ICMP 메시지를 Source로 보낸다
- ....
- n번째 데이터그램 TTL = n
- 이 데이터그램은 Hop(n) Router에서 TTL expired가 발생하게 된다
- 이렇게 계속해서 ICMP 메시지가 도착할 때마다 Source는 RTT를 계산한다
2. 단, UDP 세그먼트의 포트번호에는 Destination Host가 사용할 거 같지 않은 랜덤한 포트번호를 기입해서 보낸다
3. 이렇게 계속해서 UDP 세그먼트 Set을 보내다보면 TTL이 굉장히 크게 증가할 것이다
4. TTL이 굉장히 커져서 결국 목적지에 도달하게 되면
- 당연히 목적지에 도달은 했으니까 TTL expired는 발생하지 않는다
- 그 대신, UDP 세그먼트의 포트번호를 Destination이 구별하지 못하기 때문에 (3, 3 : dest port unreachable) ICMP 메시지를 Source로 보내게 된다
5. Source가 (3, 3 : dest port unreachable) ICMP 메시지를 받게 되는 순간, Source는 "드디어 Destination에 데이터그램이 도달했구나"라고 생각해서 더 이상 보내지 않게 된다
Example) traceroute google.com
(2)
192.168.0.1 (192.168.0.1) 1.596ms 1.858ms 1.690ms
- 먼저 LAN상에서 기본 게이트웨이로 데이터그램을 보냈다
>> 3개의 UDP 세그먼트의 RTT가 각각 1.596ms / 1.858ms / 1.690ms이다
(3)
* * *
- 보안상의 이유 or Packet Loss로 인해 Packet의 응답이 없을 경우 "*"로 표시된다
(5)
211.174.0.145 (211.174.0.145) 10.599ms 20.695ms 211.174.0.129 (211.174.0.129) 21.625ms
- 3개의 UDP 세그먼트 중 2개는 211.174.0.145 Router에서 TTL expired
- 나머지 하나는 211.174.0.129 Router에서 TTL expired
(13)
nrt12s35-in-f14.1e100.net (142.250.196.110) 41.422ms 43.923ms 209.85.244.2 (209.85.244.2) 40.510ms
- 3개의 UDP 세그먼트 중 2개가 최종 목적지인 google.com (142.250.196.110)에서 dest port unreachable 되었다
- 나머지 하나는 209.85.244.2 Router에서 TTL expired 되었다
IPv6
1. IPv4의 주소가 굉장히 빠르게 고갈되어 가고 있어서 개발된 주소 형태이다
- IPv4의 주소 고갈을 해결하기 위해 CIDR/DHCP/NAT를 통해서 최대한 주소를 효율적으로 사용하고 있기는 하다
2. 헤더길이가 고정적으로 40byte이다
3. IPv6는 단편화를 허용하지 않는다
- 데이터그램의 processing time을 단축하기 위해서 이렇게 구현하였다
4. 체크섬 또한 제거되었다
- 이 또한 각 홉에서의 처리 시간을 줄이기 위해서 제거
5. IPv6전용 ICMPv6가 개발되었다
- 추가적 메시지 타입 : Packet Too Big
- IPv6는 단편화가 금지되어 있기 때문에 "Packet Too Big" ICMPv6 메시지를 보내서 해당 Packet을 Drop시킨다
- 그러면 Source자체에서 처음부터 단편화를 시켜서 다시 보내준다
Priority / Flow Label
- QoS(Quality of Service)를 위한 필드이다
- Priority : Flow 중인 데이터그램들 사이에 우선순위를 부여해서 먼저 처리되도록 해준다
- Flow Label : 같은 Flow의 데이터그램들을 구분해준다
Next Header
1) 만약 Option Header 존재 O
- Next Header필드에 다음 헤더에 대한 정보를 기입해준다
- 마지막 데이터그램의 Next Header 필드에는 Transport-Layer Protocol을 기입해준다 (TCP? UDP?)
2) 만약 Option Header 존재 X
- 마지막 데이터그램의 Next Header 필드에 Transport-Layer Protocol을 기입해준다 (TCP? UDP?)
>> Next Header 필드에서 Protocol 필드 정보까지 해주기 때문에 IPv4에 존재하던 Protocol 필드는 사라졌다
IPv4 → IPv6 전환
- 하루 아침에 IPv4를 IPv6로 변경하는 것은 사실상 불가능하다
- 점차적으로 변경해야 한다
터널링 (Tunneling)
- 점차적으로 IPv6로 변환하는 방법
- IPv4 Router들이 IPv6 데이터그램을 IPv4 데이터그램의 페이로드로써 운반하는 방식이다