다음 홉
고친 사람 github-actions[bot]
다음 홉은 패킷을 건네받아 목적지 쪽으로 한 걸음 더 옮겨 주는 바로 옆 장비입니다. 라우터는 패킷을 넘길 때 이번에 누구에게 넘길지만 정합니다. 장비마다 이 한 걸음을 되풀이해서 패킷이 먼 곳까지 닿습니다.
쉽고 빠른 이해
다음 홉은 데이터를 다음에 건네받을 옆 장비 하나입니다. 집 컴퓨터라면 공유기가 첫 다음 홉입니다. 장비는 어느 목적지를 누구에게 넘길지 적은 표를 하나 들고 있습니다.
표의 줄마다 목적지까지 가는 길 전체를 적으려면 줄이 끝없이 길어집니다. 바로 다음 장비 하나만 적으면 줄이 짧습니다. 먼 곳의 길이 바뀌어도 그 근처 장비만 고치면 됩니다.
어떻게 도나:
- 장비가 데이터에 적힌 목적지 주소를 읽습니다
- 자기 표에서 그 목적지에 맞는 줄을 찾아 다음 홉을 고릅니다
- 다음 홉에게 넘기면 그 장비가 같은 일을 되풀이합니다
목적지가 같은 망에 붙어 있으면 목적지에 곧장 건넵니다.
대가는 넘길 때 장비가 쓰는 것이 다음 한 걸음뿐이라는 것입니다. 앞뒤 장비의 표가 어긋나면 데이터가 둘 사이를 맴돌다 버려집니다. 다음 장비가 말없이 죽으면 데이터가 어디로 갔는지 모르게 사라지기도 합니다.
상세
고속도로의 이정표를 떠올리면 됩니다. 갈림길마다 선 이정표는 「부산 → 오른쪽」처럼 이번 갈림길에서 고를 방향 하나만 알려 줍니다. 운전자는 부산까지의 길을 외우지 않아도 이정표를 하나씩 따라가면 부산에 닿습니다. 이 비유에서 다음 홉은 그 방향으로 가면 만나는 다음 갈림길입니다.
다음 홉은 패킷을 목적지 쪽으로 보낼 때 그 패킷을 다음에 건네받는 바로 옆 장비입니다. 패킷은 네트워크로 오가는 데이터 한 덩어리입니다.
패킷을 넘겨 주는 장비는 주로 라우터입니다. 라우터는 망과 망을 잇는 장비입니다. 받은 패킷을 다른 망 쪽으로 넘겨 줍니다. 바로 옆 장비란 다른 라우터를 하나도 거치지 않고 닿는 장비를 말합니다.
다음 홉이 늘 라우터인 것은 아닙니다. 목적지가 바로 옆에 있으면 목적지 자신이 다음 홉입니다. 일반 컴퓨터도 패킷을 처음 내보낼 때 다음 홉을 한 번 고릅니다.
장비에서 옆 장비로 한 번 건너가는 걸음을 홉이라고 부릅니다. 지금 장비가 내딛는 다음 걸음의 끝에서 패킷을 받는 상대라서 다음 홉입니다.
표와 설정에 적히는 다음 홉은 그 장비의 IP 주소(Internet Protocol address, 인터넷 프로토콜 주소)입니다. IP 주소는 인터넷에서 장비를 찾아가는 번호입니다. 이 글에서는 장비를 가리킬 때 다음 홉, 적힌 값을 가리킬 때 다음 홉 주소라고 씁니다.
다음 홉 주소 칸이 늘 바로 옆 장비의 주소인 것은 아닙니다. 칸이 비어 있기도 하고, 자기 회선의 주소나 멀리 있는 라우터의 주소가 적히기도 합니다. 어느 경우에 무엇이 적히는지는 아래와 「예시」·「동작」에서 하나씩 봅니다.
라우팅 테이블의 한 줄
라우터와 컴퓨터는 어느 목적지를 누구에게 넘길지 적은 표를 하나씩 들고 있습니다. 그 표가 라우팅 테이블입니다. 경로표나 포워딩 테이블이라고도 합니다. 표의 한 줄은 「이 주소 범위로 가는 패킷은 이 다음 홉에게 넘겨라」를 뜻합니다.
주소 범위는 주소의 앞부분을 몇 비트까지 맞춰 보느냐로 적습니다. 10.2.0.0/16 은 앞 16비트, 곧 앞 두 마디가 10.2 인 주소 전부를 뜻합니다. 이렇게 맞춰 보는 앞부분이 프리픽스입니다.
아래는 어느 회사 라우터의 표를 간추린 것입니다. 다음 홉 칸의 괄호는 그 주소를 쓰는 장비입니다. 내보낼 회선은 패킷이 이 라우터를 떠나는 연결 단자, 곧 인터페이스입니다.
| 목적지 범위 | 다음 홉 | 내보낼 회선 |
|---|---|---|
10.1.0.0/16 |
없음. 상대에게 곧바로 | 사내망 회선 |
10.2.0.0/16 |
10.9.0.2 (지사 라우터) |
지사와 이은 전용선 |
0.0.0.0/0 |
203.0.113.1 (통신사 라우터) |
통신사와 이은 회선 |
목적지가 10.2.7.9 인 패킷은 둘째 줄의 범위에 듭니다. 그래서 10.9.0.2 에게 넘어갑니다. 이 표에는 패킷이 지사에서 어디를 더 거치는지가 없습니다. 지사 라우터에게 건네는 데서 이 라우터의 일은 끝납니다.
셋째 줄 0.0.0.0/0 은 한 비트도 맞춰 보지 않습니다. 그래서 모든 주소에 맞습니다. 더 좁게 맞는 줄이 있으면 그 줄이 뽑힙니다. 셋째 줄은 다른 줄이 하나도 안 맞을 때만 뽑힙니다. 이렇게 마지막으로 기대는 줄이 기본 경로입니다. 여러 줄이 함께 맞을 때 고르는 규칙은 「동작」에서 봅니다.
컴퓨터의 표에도 기본 경로가 한 줄 있습니다. 그 줄의 다음 홉을 따로 부르는 이름이 기본 게이트웨이입니다. 옛 인터넷 문서들은 라우터를 게이트웨이라고 불렀습니다. 컴퓨터 설정 화면에서 보던 기본 게이트웨이 주소가 곧 기본 경로의 다음 홉 주소입니다.
다음 홉이 없는 줄
첫째 줄처럼 다음 홉 칸이 비어 있으면 목적지가 이 장비와 같은 망에 붙어 있다는 뜻입니다. 같은 망이란 서브넷 하나에 같이 들어 있다는 것입니다. 서브넷은 주소 범위를 잘게 나눈 한 조각입니다.
이때 장비는 목적지 장비 자신에게 곧장 건넵니다. 다음 홉 주소가 목적지 주소와 같은 셈입니다. 어떤 패킷이든 마지막 구간은 이런 줄을 거쳐 건너갑니다.
장비는 표를 보기 전에 목적지가 자기 회선과 같은 망에 있는지 먼저 봅니다. 그 검사에 걸리는 경우와 이런 줄에 걸리는 경우는 같습니다. 검사하는 방법은 「동작」에서 봅니다.
다음 홉이 표에 들어오는 길
표의 다음 홉은 두 길로 들어옵니다. 사람이 손으로 적는 길과 장비끼리 알려 주는 길입니다.
손으로 적은 줄은 정적 경로입니다. 목적지 범위 하나를 다음 홉 하나에 미리 묶어 둔 줄입니다. 이 줄은 길이 바뀌어도 사람이 고칠 때까지 같은 다음 홉을 가리킵니다. 그래서 설정이 바뀌거나 장비가 고장 나면 장애의 원인이 될 수 있습니다.
정적 경로를 더 나은 다음 홉을 알리는 메시지로 덮어쓸 수 있게 표시해 둘 수도 있습니다(MAY). 그 메시지를 리다이렉트라고 하고 「동작」에서 봅니다.
장비끼리 알려 주는 방식은 동적 라우팅입니다. 라우터들은 대개 이웃 라우터와 경로 소식을 주고받습니다. 받은 소식으로 저마다 표의 다음 홉을 다시 고릅니다. 이 소식을 주고받는 약속이 라우팅 프로토콜입니다.
라우팅 프로토콜은 쓰는 범위에 따라 갈립니다. 한 조직의 망 안에서는 OSPF(Open Shortest Path First, 개방형 최단 경로 우선) 같은 것을 씁니다. 통신사처럼 조직과 조직 사이에서는 BGP(Border Gateway Protocol, 경계 게이트웨이 프로토콜)를 씁니다.
컴퓨터는 대개 다음 홉을 손으로 적지 않습니다. 망에 붙을 때 DHCP(Dynamic Host Configuration Protocol, 동적 호스트 구성 프로토콜)가 자기 주소와 기본 게이트웨이 주소를 함께 내려 줍니다. DHCP 는 망에 붙은 기기에 주소와 설정을 나눠 주는 방식입니다.
IP 밖에서 쓰는 다음 홉
같은 뜻을 IP 위의 계층에서도 씁니다. HTTP(HyperText Transfer Protocol, 하이퍼텍스트 전송 프로토콜) 요청이 프록시를 거쳐 서버에 갈 때가 그렇습니다. 프록시는 요청을 대신 받아 뒤쪽 서버로 넘겨 주는 서버입니다.
HTTP 에서 오가는 요청과 응답을 메시지라고 부릅니다. 메시지를 한 쪽에서 다음 쪽으로 한 번 넘기는 것이 홉 하나입니다. 바로 다음에 메시지를 받는 쪽이 그 메시지의 다음 홉입니다. HTTP 에서는 이 상대를 「바로 다음 받는 쪽(immediate recipient)」이라고 부릅니다. 넘기는 단위가 패킷이 아니라 메시지라는 점만 다릅니다.
HTTP 헤더는 메시지 머리에 붙는 이름과 값의 줄입니다. 헤더 가운데에는 바로 다음 받는 쪽에게만 뜻이 있는 것이 있습니다. 이런 헤더가 hop-by-hop 헤더입니다. 메시지가 거치는 받는 쪽 모두에게 가는 헤더는 end-to-end 헤더입니다.
둘을 가르는 수단이 Connection 헤더입니다. 이 헤더의 값에는 바로 다음 받는 쪽에게만 뜻이 있는 헤더의 이름을 적습니다.
프록시 같은 중개자는 메시지를 넘기기 전에 Connection 헤더에 이름이 적힌 헤더를 떼어 냅니다. 그다음 Connection 헤더 자신도 떼어 냅니다. 떼는 대신 자기가 넘기는 메시지에 쓸 값을 적은 Connection 헤더로 바꿔 넣을 수도 있습니다.
배경
패킷 하나가 목적지까지 가려면 장비 여럿을 거칩니다. 장비마다 목적지까지의 길 전체를 들고 있으면 표의 줄마다 거쳐 갈 장비를 다 적어야 합니다. 목적지가 늘수록 줄이 쌓이고 줄마다 길어집니다. 길 하나가 바뀔 때마다 그 길을 지나는 모든 장비의 표도 고쳐야 합니다.
반대로 보내는 쪽이 길을 정해 패킷에 적는 방법도 IP 에 있습니다. 패킷 머리에 덧붙이는 소스 라우트 옵션입니다. 이 방법은 보내는 쪽이 거칠 장비를 미리 알아야 합니다.
소스 라우트 옵션은 둘입니다. 느슨한 쪽이 LSRR(Loose Source and Record Route, 느슨한 소스 라우트 기록)이고 엄격한 쪽이 SSRR(Strict Source and Record Route, 엄격한 소스 라우트 기록)입니다.
엄격한 쪽은 적힌 장비를 바로 옆끼리 차례로 거쳐야 합니다. 적힌 다음 장비가 라우터의 바로 옆에 없으면 길이 이어지지 않습니다. 그 라우터는 패킷을 버립니다.
IP 가 평소에 쓰는 방식은 그 반대입니다. 길 위의 장비마다 다음 한 걸음만 정합니다. 표에는 목적지 범위마다 바로 옆 이웃 하나만 적습니다. 먼 곳의 길이 바뀌면 그 근처 장비들만 다음 홉을 바꿉니다.
길을 고르는 짐은 주로 라우터가 집니다. 컴퓨터는 첫 다음 홉 하나만 고릅니다. 이 한 걸음의 상대를 부르는 이름이 다음 홉입니다.
예시
다음 홉은 운영체제의 경로 설정 명령에 인자로 적힙니다. 길 추적 도구의 출력과 HTTP 헤더에도 드러납니다.
리눅스 ip route
ip route add default via 192.168.1.1 dev eth0
기본 경로를 하나 더하는 명령입니다. 모든 주소로 가는 패킷을 eth0 회선으로 닿는 게이트웨이 192.168.1.1 에게 넘기라는 줄입니다.
via 뒤의 주소가 다음 홉 라우터의 주소입니다. 다만 이 칸의 뜻은 경로 종류에 따라 달라집니다.
직접 경로는 다음 홉 라우터를 거치지 않고 같은 망의 목적지에 곧장 건네는 경로입니다. 「상세」에서 본 다음 홉 칸이 빈 줄이 그것입니다.
BSD(Berkeley Software Distribution, 버클리 유닉스) 호환 방식은 그 줄을 옛 BSD 유닉스가 쓰던 꼴로 적는 방식입니다.
주소 변환(NAT, Network Address Translation)은 패킷에 적힌 목적지 주소를 다른 주소로 바꿔 보내는 것입니다. 그렇게 보내라고 적은 줄이 주소 변환 경로입니다.
| 경로 종류 | via 에 들어가는 값 |
|---|---|
| 목적지 하나로 가는 보통의 경로 | 진짜 다음 홉 라우터의 주소 |
| 직접 경로를 BSD 호환 방식으로 넣은 것 | 그 망에 붙은 회선의 자기 주소 |
| 주소 변환 경로 | 바뀐 목적지 주소 묶음의 첫 주소 |
아래 두 줄에서는 via 값이 패킷을 건네받는 상대의 주소가 아닙니다. 같은 칸인데도 경로 종류가 뜻을 갈라 놓습니다.
한 목적지로 가는 길이 여럿인 다중 경로도 적을 수 있습니다. 그때는 nexthop 뒤에 via 로 다음 홉 라우터를 하나씩 적습니다.
경로 줄에 다음 홉 대신 「버려라」를 적을 수도 있습니다. 관리자가 일부러 적는 경로 종류가 셋입니다.
셋 가운데 둘은 패킷을 버립니다. 그리고 보낸 쪽에 ICMP(Internet Control Message Protocol, 인터넷 제어 메시지 프로토콜) 메시지를 돌려보냅니다. ICMP 는 장비가 보낸 쪽에 전달 문제를 알리는 메시지 규칙입니다.
| 경로 종류 | 패킷 | 보낸 쪽에 돌아오는 것 | 같은 장비의 프로그램이 받는 오류 |
|---|---|---|---|
unreachable |
버린다 | ICMP host unreachable | EHOSTUNREACH |
blackhole |
조용히 버린다 | 없음 | EINVAL |
prohibit |
버린다 | ICMP communication administratively prohibited | EACCES |
마지막 칸은 이 장비 안의 프로그램이 그런 목적지로 보내려 할 때 시스템 호출이 돌려주는 오류 번호(errno)입니다.
윈도우 route
route add 0.0.0.0 mask 0.0.0.0 192.168.12.1
route add 10.41.0.0 mask 255.255.0.0 10.27.0.1
첫 줄은 기본 게이트웨이 192.168.12.1 로 기본 경로를 더합니다. 둘째 줄은 10.41.0.0 으로 시작하는 범위로 가는 경로를 더합니다. 그 다음 홉 주소는 10.27.0.1 입니다.
mask 뒤의 값은 주소 범위를 비트로 적는 또 다른 표기입니다. 255.255.0.0 은 앞 16비트를 맞춰 본다는 뜻이라 /16 과 같습니다. 첫 줄의 0.0.0.0 은 한 비트도 맞춰 보지 않는다는 뜻이라 /0 과 같습니다.
마지막 인자는 그 주소 범위에 닿게 해 주는 다음 홉 IP 주소입니다. 라우터를 하나 이상 건너야 닿는 경로면 이 값은 이웃 라우터에 붙은, 곧장 닿는 주소입니다. 직접 붙은 망으로 가는 경로면 그 망에 붙은 회선의 자기 주소가 들어갑니다. 여기서도 직접 붙은 망으로 가는 줄에서는 이 값이 패킷을 건네받는 상대의 주소가 아닙니다.
traceroute
traceroute 는 패킷이 목적지까지 거친 장비를 차례로 드러내는 도구입니다.
이 도구는 TTL 을 씁니다. TTL(Time To Live, 생존 시간)은 패킷 머리에 적힌 수입니다. 라우터를 하나 지날 때마다 줄어듭니다. 0 이 되면 그 라우터가 패킷을 버립니다. 그리고 보낸 쪽에 알림을 돌려보냅니다.
이 알림이 ICMP 의 Time Exceeded 메시지입니다. traceroute 는 이 알림을 일부러 받아 내서 길 위의 장비를 하나씩 알아냅니다.
traceroute 는 TTL 을 1 로 둔 시험 패킷부터 보냅니다. 이 패킷은 첫 장비에서 버려집니다. 그래서 첫 장비의 알림이 돌아옵니다. TTL 을 하나씩 늘릴 때마다 한 장비씩 더 먼 곳에서 알림이 옵니다.
목적지에 닿으면 목적지가 port unreachable 을 돌려보냅니다. 이 알림은 목적지 주소까지는 닿았다는 뜻이라 traceroute 가 멈출 신호로 씁니다. TCP(Transmission Control Protocol, 전송 제어 프로토콜)의 reset 응답이 돌아올 때도 있습니다. 둘 가운데 하나가 오거나 최대치(기본 30 홉)에 이르면 멈춥니다.
TTL 하나마다 시험 패킷을 기본 셋 보냅니다. 화면에는 TTL 마다 한 줄이 찍힙니다. 그 줄에는 TTL, 응답한 장비의 주소, 시험마다의 왕복 시간이 나옵니다. 정해진 시간 안에 응답이 없으면 그 시험 칸에 * 이 찍힙니다. 도달 불가 알림이 오면 왕복 시간 뒤에 !H(호스트) · !N(네트워크) 같은 표시가 붙습니다.
HTTP Via 헤더
Via: 1.0 fred, 1.1 p.example.net
HTTP/1.0 을 쓰는 클라이언트가 사내 프록시 fred 에게 요청을 보냈습니다. fred 는 HTTP/1.1 로 공개 프록시 p.example.net 에 요청을 넘겼습니다. p.example.net 은 원 서버 www.example.com 에 요청을 넘겼습니다. 원 서버가 받은 요청에는 위 헤더가 붙어 있습니다.
항목 하나가 메시지를 넘긴 프록시나 게이트웨이 하나입니다. 여기서 게이트웨이는 라우터의 옛 이름이 아니라 HTTP 메시지를 받아 넘기는 중개자입니다. 중개자마다 자기가 메시지를 어떻게 받았는지를 뒤에 덧붙입니다. 그래서 항목 순서가 메시지를 넘겨받은 순서와 같습니다.
Via 는 메시지가 거친 홉을 따라가는 데 쓸 수 있습니다. 요청이 루프를 도는 것을 피하는 데도 쓸 수 있습니다.
동작
라우터가 패킷 하나를 받아 다음 홉에게 건네기까지를 따라갑니다. 패킷이 어느 회선으로 어느 상대에게 나가는지가 여기서 정해집니다. 컴퓨터가 패킷을 처음 내보낼 때도 앞부분은 같습니다.
옆 장비에게 건넬 때는 IP 주소가 아닌 다른 주소를 씁니다. 링크 계층은 한 회선 위의 바로 옆 장비끼리 데이터를 주고받는 계층입니다. 이 계층의 주소가 MAC 주소(Media Access Control address, 매체 접근 제어 주소)입니다. MAC 주소는 네트워크 카드마다 붙은 번호입니다. 한 망 안에서만 통합니다.
패킷은 받는 쪽의 MAC 주소를 겉에 적은 봉투에 담겨 옆 장비로 건너갑니다. 이 봉투가 프레임입니다. 한 구간을 건너면 봉투는 뜯깁니다. 다음 구간에서 새 봉투에 담깁니다.
장비가 표에서 얻는 것은 다음 홉 IP 주소와 내보낼 회선 둘입니다. 그 IP 주소로 다음 홉의 MAC 주소를 알아냅니다. 그 MAC 주소를 적은 프레임에 패킷을 싸서 내보내면 이 장비의 일은 끝납니다.
flowchart TD
A["패킷 도착 · 목적지 주소를 읽는다"] --> B{"목적지가 같은 망인가"}
B -->|예| C["다음 홉 = 목적지 자신"]
B -->|아니오| D["표에서 목적지에 가장 좁게 맞는 줄을 고른다"]
D -->|맞는 줄 없음| E["버리고 보낸 쪽에 알린다"]
D -->|맞는 줄 있음| F["다음 홉 = 그 줄의 다음 홉 주소"]
C --> G["다음 홉의 MAC 주소를 알아내 프레임으로 내보낸다"]
F --> G
같은 망 판정
장비는 표를 보기 전에 목적지가 자기 회선과 같은 망에 있는지 봅니다. 회선마다 붙은 자기 주소에서 프리픽스만 떼어 냅니다. 목적지 주소에서도 같은 비트만큼 떼어 냅니다. 둘이 같으면 목적지는 그 회선에 붙은 망에 있습니다.
이때 다음 홉 주소는 목적지 주소와 같습니다. 「상세」의 표에서 다음 홉 칸이 비어 있던 첫째 줄이 이 경우를 적은 것입니다.
어느 회선과도 안 같으면 목적지는 다른 라우터를 거쳐야만 닿습니다. 라우터는 라우팅 테이블에서 다음 홉을 고릅니다. 라우터가 아닌 컴퓨터라면 설정해 둔 기본 게이트웨이가 다음 홉일 수 있습니다.
표에서 다음 홉 고르기
라우터가 넘길 때 보는 표를 FIB(Forwarding Information Base, 포워딩 정보 베이스)라고도 부릅니다. 고르기는 표의 모든 줄을 후보로 놓고 시작합니다. 규칙을 하나씩 걸어 후보를 덜어 냅니다. 대개 줄 하나가 남습니다.
목적지가 10.144.2.5 인 패킷을 예로 듭니다. 표에는 128.12.0.0/16 줄, 10.0.0.0/8 줄, 10.144.0.0/16 줄, 기본 경로 줄이 들어 있다고 합니다.
첫 규칙은 범위가 목적지를 품지 않는 줄을 버립니다. 128.12.0.0/16 줄이 버려집니다. 나머지 셋은 남습니다.
둘째 규칙은 남은 줄 가운데 프리픽스가 가장 긴 줄만 남깁니다. 맞춰 보는 비트가 길수록 범위가 좁습니다. 그러니 범위가 가장 좁은 줄을 고르는 셈입니다. 위 예에서는 10.144.0.0/16 줄이 남습니다.
둘째 규칙의 이름이 최장 프리픽스 매치입니다. 10.144.2.0/24 · 10.144.0.0/16 · 10.0.0.0/8 이 함께 맞는 표라면 /24 줄이 뽑힙니다.
「상세」의 회사 표에서도 같습니다. 10.2.7.9 는 둘째 줄(16비트)과 셋째 줄(0비트)에 함께 맞습니다. 둘째 줄이 더 길어서 뽑힙니다.
장비 하나만 가리키는 줄은 주소를 끝까지 다 맞춰 보므로 프리픽스가 가장 깁니다. 그래서 이 규칙대로면 가장 먼저 뽑힙니다. 프리픽스 길이가 0 인 기본 경로가 가장 늦게 뽑힙니다.
규칙을 다 걸고도 줄이 둘 이상 남을 수 있습니다. 그때 라우터는 하나만 남기고 나머지를 버리기도 합니다. 가장 오래 안 쓴 줄을 골라 짐을 나누기도 합니다. 하나도 안 남으면 패킷을 버립니다. 그때 돌아오는 것은 「실패」에서 봅니다.
건네는 순서
라우터는 패킷 하나를 아래 순서로 넘깁니다.
- 다음 홉 IP 주소와 내보낼 회선을 정합니다. 대개 라우팅 테이블에서 목적지를 찾아 정합니다
- 넘겨도 되는 패킷인지 봅니다. 보낸 쪽과 목적지의 주소가 올바른지 확인합니다
- TTL 을 하나 이상 줄입니다. 0 이 되면 여기서 멈춥니다
- 회선이 한 번에 실어 보낼 수 있는 크기보다 패킷이 크면 조각냅니다. 회선을 1 에서 이미 정했으므로 조각은 모두 같은 회선으로 나갑니다
- 다음 홉의 MAC 주소를 알아냅니다. 알아내는 방법은 링크 계층마다 다릅니다
- 패킷을 프레임에 싸서 1 에서 정한 회선의 내보낼 대기열에 세웁니다
- 필요하면 보낸 쪽에 ICMP 리다이렉트를 보냅니다. 리다이렉트는 더 나은 다음 홉이 있다고 알리는 메시지입니다
구현이 이 순서를 그대로 따를 필요는 없습니다. 앞 단계의 결과를 뒤 단계가 쓰는 의존 관계만 정해져 있습니다.
다음 홉의 MAC 주소 알아내기
표에서 얻은 것은 다음 홉의 IP 주소뿐입니다. 프레임을 쓰려면 그 주소를 쓰는 장비의 MAC 주소를 먼저 알아내야 합니다.
IPv4(Internet Protocol version 4, 인터넷 프로토콜 4판)를 이더넷 위에서 쓸 때는 ARP(Address Resolution Protocol, 주소 결정 프로토콜)가 이 일을 맡습니다. 이더넷은 유선 랜의 대표 방식입니다. 이더넷으로 보내려면 48비트 MAC 주소가 있어야 합니다. ARP 는 IP 주소를 MAC 주소로 바꾸는 표를 그때그때 채웁니다.
sequenceDiagram
participant R as 라우터
participant L as 같은 망의 장비들
participant N as 다음 홉
R->>L: 이 IP 주소를 쓰는 장비가 누구인가
N-->>R: 내 MAC 주소는 이것이다
R->>N: 그 MAC 주소를 겉에 적은 프레임
라우터가 묻는 상대는 한 장비가 아닙니다. 같은 망에 붙은 장비 모두에게 한꺼번에 보냅니다. 그 주소를 쓰는 장비만 자기 MAC 주소로 답합니다. 라우터는 받은 MAC 주소를 표에 적어 두고 다음 패킷에 다시 씁니다.
IPv6(Internet Protocol version 6, 인터넷 프로토콜 6판)는 주소를 더 길게 늘린 새 판 IP 입니다. IPv6 에서는 이웃 탐색이 ARP 의 일을 맡습니다.
IPv6 장비는 다음 홉을 패킷마다 다시 고르지 않습니다. 한 번 고른 결과를 목적지 캐시에 담아 둡니다. 보낼 패킷이 생기면 목적지 캐시부터 봅니다. 거기 없을 때만 다음 홉을 새로 고릅니다.
다음 홉 IP 주소를 알면 이웃 캐시를 봅니다. 이웃 캐시는 이웃의 링크 계층 주소를 적어 두는 표입니다. IPv4 에서 ARP 가 채우는 표와 같은 몫입니다.
이웃 캐시에 항목이 없으면 장비는 항목을 하나 만들고 「미완」으로 표시합니다. 링크 계층 주소를 아직 모른다는 뜻입니다. 그리고 주소 결정을 시작합니다. 주소 결정은 IP 주소로 링크 계층 주소를 알아내는 일입니다.
멀티캐스트를 쓸 수 있는 회선이면 이웃 요청 메시지를 보낸 뒤 이웃 광고 응답을 기다립니다. 멀티캐스트는 한 번 보내 여러 장비가 함께 받게 하는 전송입니다. 기다리는 동안 패킷은 줄을 서 있습니다. 응답이 오면 그 링크 계층 주소가 이웃 캐시에 적히고 패킷이 나갑니다.
컴퓨터가 고르는 첫 다음 홉
컴퓨터는 목적지마다 고른 다음 홉 게이트웨이를 라우트 캐시에 담아 둡니다. 라우트 캐시는 앞에서 본 IPv6 의 목적지 캐시와 같은 몫이고 이름만 다릅니다. 라우팅 테이블이 주소 범위마다 한 줄인 것과 달리 이 캐시는 목적지 하나마다 한 항목입니다.
캐시에 그 목적지가 없으면 컴퓨터는 기본 게이트웨이 하나를 골라 보냅니다. 그 목적지의 캐시 항목도 함께 만듭니다. 컴퓨터는 기본 게이트웨이를 여럿 둘 수 있어야 합니다.
고른 게이트웨이가 그 목적지로 가는 가장 나은 다음 홉이 아닐 수 있습니다. 그러면 게이트웨이는 패킷을 나은 다음 홉에게 넘깁니다. 그와 함께 보낸 컴퓨터에 ICMP 리다이렉트를 돌려보냅니다.
sequenceDiagram
participant H as 컴퓨터
participant G1 as 기본 게이트웨이
participant G2 as 나은 게이트웨이
H->>G1: 첫 패킷
G1->>G2: 나은 다음 홉에게 넘긴다
G1-->>H: 리다이렉트
Note over H: 캐시 항목의 다음 홉을 고친다
H->>G2: 그다음 패킷
리다이렉트를 받은 컴퓨터는 캐시 항목의 다음 홉을 고칩니다. 그 뒤로 같은 목적지로 가는 패킷은 나은 게이트웨이로 곧장 갑니다.
한 홉씩 되풀이되는 전달
다음 홉에게 넘어간 패킷은 거기서 같은 판단을 다시 받습니다. 그 장비도 자기 라우팅 테이블을 보고 자기 다음 홉을 고릅니다. 목적지와 같은 망에 붙은 장비에 닿을 때까지 이 일이 되풀이됩니다.
집에서는 공유기가 컴퓨터의 첫 다음 홉을 맡습니다. 공유기는 집 안 기기 여럿을 인터넷 회선 하나에 물려 주는 장비입니다. 아래 그림은 집 컴퓨터가 멀리 있는 서버에 패킷을 보낼 때 거치는 장비와, 장비마다 아는 것을 적은 것입니다.
flowchart TD
A["내 컴퓨터<br/>밖으로 가는 것은 공유기로"]
A --> B["공유기<br/>밖으로 가는 것은 통신사 라우터로"]
B --> C["통신사 라우터<br/>이 주소 범위는 상대 망의 라우터로"]
C --> D["상대 망의 라우터<br/>이 망에 붙어 있다. 곧장 건넨다"]
D --> E["목적지 서버"]
화살표 하나가 홉 하나입니다. 상자에 적힌 한 줄이 그 장비가 이 패킷을 넘길 때 쓰는 전부입니다. 서버까지 거쳐 갈 장비를 차례로 적어 둔 상자는 그림 어디에도 없습니다.
다음 홉 주소는 패킷 안에 적히지 않습니다. 패킷 머리에는 처음 보낸 쪽과 마지막 목적지의 IP 주소가 적혀 있습니다. 이 둘은 가는 동안 대개 바뀌지 않습니다. 아래 표는 그림의 화살표 넷을 구간별로 나눠 두 값을 견준 것입니다.
| 구간 | 패킷의 목적지 IP | 프레임을 받는 쪽 |
|---|---|---|
| 내 컴퓨터 → 공유기 | 서버 | 공유기 |
| 공유기 → 통신사 라우터 | 서버 | 통신사 라우터 |
| 통신사 라우터 → 상대 망의 라우터 | 서버 | 상대 망의 라우터 |
| 상대 망의 라우터 → 서버 | 서버 | 서버 |
목적지 IP 칸은 네 줄 모두 서버입니다. 바뀌는 것은 프레임을 받는 쪽뿐입니다. 앞의 세 구간에서는 그 구간의 다음 홉이 받습니다. 마지막 구간에서는 서버 자신이 받습니다. 표에 적힌 다음 홉 주소는 MAC 주소를 알아내는 데까지만 쓰입니다.
라우터마다 TTL 을 하나 이상 줄이므로 TTL 은 사실상 패킷이 갈 수 있는 홉 수의 한도입니다.
표의 다음 홉이 바로 옆이 아닐 때
BGP 로 받은 경로는 다음 홉 칸이 바로 옆 장비가 아닐 수 있습니다. BGP 의 NEXT_HOP 속성은 그 목적지로 갈 때 다음 홉으로 삼도록 권하는 라우터의 주소입니다(SHOULD).
BGP 장비는 실제로 패킷을 건넬 바로 옆 다음 홉을 따로 정합니다. NEXT_HOP 주소를 라우팅 테이블에서 한 번 더 찾아 정합니다. 이렇게 다시 찾는 것이 재귀 조회입니다.
재귀 조회로 찾은 줄은 언제나 내보낼 회선을 알려 줍니다. 그 줄이 직접 붙은 망이라 다음 홉 칸이 비어 있으면 BGP 장비는 NEXT_HOP 주소를 바로 옆 다음 홉으로 삼습니다(SHOULD). 그 줄에 다음 홉 주소가 적혀 있으면 그 주소를 바로 옆 다음 홉으로 삼습니다(SHOULD). 같은 비용의 줄이 여럿이면 그 가운데 하나를 고릅니다.
패킷을 건네받는 쪽은 재귀 조회로 얻은 바로 옆 다음 홉입니다. 그 주소가 NEXT_HOP 주소와 같을 때도 있고 다를 때도 있습니다.
실패
다음 홉을 못 찾거나 다음 홉이 어긋날 때 무슨 일이 나는지를 봅니다. 패킷 하나를 받은 라우터와 그 패킷을 보낸 컴퓨터가 조건마다 무엇을 하는지 견줍니다. 돌아오는 것은 대부분 ICMP 메시지입니다. 아무것도 안 돌아오는 경우도 있습니다.
| 조건 | 라우터가 하는 일 | 보낸 쪽에 돌아오는 것 |
|---|---|---|
| 표에 목적지 망으로 가는 줄이 없다 | 버린다 | Destination Unreachable(type 3) 코드 0 Network Unreachable |
| 직접 붙은 망의 목적지가 ARP 에 답하지 않는다 | 버린다 | Destination Unreachable(type 3) 코드 1 Host Unreachable |
| 링크 계층이 목적지 컴퓨터가 없다고 알려 준다 | 버린다 | Destination Unreachable(type 3) 코드 7 Destination Host Unknown |
| TTL 이 0 이 됐다 | 버린다 | Time Exceeded(type 11) 코드 0. 목적지가 멀티캐스트 주소면 안 보낸다 |
| 엄격한 소스 라우트의 다음 장비가 바로 옆에 없다 | 버린다 | Bad Source Route 오류 |
| 보낸 컴퓨터가 고른 다음 홉보다 나은 다음 홉이 있다 | 나은 다음 홉에게 넘긴다 | 리다이렉트 |
| 컴퓨터의 첫 다음 홉이 조용히 죽었다 | 받을 라우터가 없다 | 아무것도 안 돌아온다 |
표에서 줄이 하나도 안 남으면 라우터는 패킷을 버려야 합니다(MUST). 그와 함께 조건에 맞는 ICMP 오류를 만들어야 합니다.
라우팅 루프와 TTL
라우터 갑은 어떤 목적지의 다음 홉을 을로 적었습니다. 을은 같은 목적지의 다음 홉을 갑으로 적었습니다. 그 목적지로 가는 패킷은 둘 사이만 오갑니다. 이렇게 패킷이 갇히는 것을 라우팅 루프라고 합니다. 갑과 을의 표를 따로 보면 둘 다 멀쩡해 보입니다.
루프에 빠진 패킷이 영원히 돌지는 않습니다. 라우터는 넘길 때마다 TTL 을 하나 이상 줄입니다. TTL 이 0 이 된 라우터가 패킷을 버립니다. 그 라우터는 보낸 쪽에 Time Exceeded 를 돌려보냅니다. TTL 의 홉 수 한도는 경로 문제로 패킷이 끝없이 돌아 망이 무너지는 것을 막습니다.
리다이렉트를 잘못 믿어도 루프가 날 수 있습니다. 라우팅 프로토콜을 쓰는 라우터는 리다이렉트로 배운 경로로 패킷을 넘기지 않습니다(MUST NOT). 라우터는 경로를 다른 수단으로 배웁니다. 그 정보와 어긋나는 리다이렉트를 믿으면 라우팅 루프가 날 가능성이 큽니다.
리다이렉트를 보내는 조건
리다이렉트는 같은 망의 컴퓨터에게 어떤 패킷들은 다른 다음 홉 라우터를 쓰라고 알리는 메시지입니다. 라우터는 아래 셋이 다 맞을 때만 리다이렉트를 보냅니다.
- 패킷이 들어온 물리 회선으로 도로 나갑니다
- 패킷의 보낸 쪽 IP 주소가 다음 홉 IP 주소와 같은 서브넷에 있습니다
- 패킷에 소스 라우트 옵션이 없습니다
이때 패킷은 버려지지 않습니다. 나은 다음 홉에게 넘어갑니다. 리다이렉트는 한 홉을 돌아간 길을 고치라는 알림입니다.
죽은 다음 홉과 블랙홀
컴퓨터는 라우트 캐시에 든 다음 홉 게이트웨이가 죽은 것을 알아챌 수 있어야 합니다. 그래야 다른 게이트웨이를 고릅니다. 이 감지 장치가 모자라면 게이트웨이가 죽었을 때 패킷이 블랙홀로 사라지듯 보일 수 있습니다. 이 장애는 사용자에게 몹시 헷갈립니다. 망 운영자도 원인을 찾기 어렵습니다.
핑은 상대에게 응답을 요청해 살아 있는지 보는 ICMP 주고받기입니다. 감지에 핑을 쓰면 비용이 큽니다. 장비가 늘수록 더 버겁습니다.
컴퓨터는 첫 다음 홉 게이트웨이에 쉬지 않고 핑을 보내 상태를 확인하면 안 됩니다(MUST NOT). 핑은 두 조건이 맞을 때만 씁니다. 그 게이트웨이로 데이터를 보내는 중이어야 합니다. 그리고 게이트웨이가 살아 있다는 다른 신호가 없어야 합니다.
핑 대신 IP 의 위아래 계층이 「게이트웨이 정상」·「게이트웨이 죽음」 같은 조언을 줄 수 있어야 합니다(SHOULD). 감지는 대개 트랜스포트 계층 연결이 끊기기 전에 다른 게이트웨이를 고를 만큼 빨라야 합니다. 트랜스포트 계층은 IP 위에서 프로그램끼리의 연결을 맡는 계층입니다.
IPv6 에서는 이웃 도달 불가 감지가 통신이 멈춘 것을 알아챕니다. 그때 다음 홉을 다시 골라야 할 수 있습니다. 고장 난 라우터로 가던 패킷을 살아 있는 라우터로 옮기는 경우가 그렇습니다.
「예시」의 ip route 에 나온 blackhole 경로는 이 블랙홀과 이름만 같습니다. 죽은 다음 홉 탓에 패킷이 사라지는 것이 아닙니다. 관리자가 일부러 버리라고 적은 줄입니다.
관련 항목
다음 홉이 속하는 상위 개념
다음 홉을 담는 라우팅 테이블의 구성 요소
라우팅 테이블 · 경로표 · 포워딩 테이블 · FIB · 기본 경로 · 프리픽스 · 최장 프리픽스 매치 · 서브넷 · 서브넷 마스크
다음 홉을 고르고 넘겨받는 장비
라우터 · 기본 게이트웨이 · 게이트웨이 · 공유기 · L3 스위치
다음 홉에게 건네줄 때 쓰는 주소와 프로토콜
IP 주소 · MAC 주소 · ARP · 이웃 탐색 · 프레임 · 패킷 · IPv4 · IPv6 · 이더넷 · 링크 계층
다음 홉을 표에 채우는 방법
정적 경로 · 동적 라우팅 · 라우팅 프로토콜 · OSPF · BGP · DHCP · 다중 경로 라우팅
다음 홉이 어긋날 때 나는 장애
라우팅 루프 · 블랙홀 경로 · 비대칭 라우팅 · 무한 카운트 · TTL · 데드 게이트웨이 감지 · 이웃 도달 불가 감지
다음 홉 실패를 알리는 ICMP 메시지
ICMP · Destination Unreachable · Time Exceeded · ICMP 리다이렉트 · EHOSTUNREACH
다음 홉을 적거나 드러내는 명령
traceroute · ping · mtr · ip route
다음 홉 결정과 맞세워지는 경로 지정 방식
소스 라우팅 · 느슨한 소스 라우팅 · 엄격한 소스 라우팅
HTTP 에서 홉을 세는 장비와 헤더
프록시 · 리버스 프록시 · 로드 밸런서 · hop-by-hop 헤더 · Connection 헤더 · Via 헤더
다른 이름: next hop · 넥스트 홉 · next-hop