이전의 Transport 레이어까지 세그먼트를 보내는데 있어서 유실되면 다시 재전송하는등 어떻게 reliable한 transfer를 할 것 인가에 집중했다면 IP부터, 즉 Network 레이어부터는 어떻게 패킷을 receiver에 안전하게 보낼 것인가에 대해 다룬다. 따라서 네트워크레이어의 IP는 패킷을 어떻게 목적지까지 배송할 것인가라는 역할을 맡는다.
이전에 말한 것처럼 라우터가 패킷을 받으면 패킷을 검사하는 시간을 가진다. 여기서 패킷의 목적지, 헤더의 checksome을 통해 에러 유무를 확인한다. 여기서 소요되는 시간을 Processing Delay 라고 배웠었다. 결국 라우터의 핵심적인 일은 패킷을 받으면 어디로 패킷을 보낼지 방향을 설정하는 것이다. 이렇게 올바른 목적지로 쏘는 작업을 forwarding 이라고 한다. 기술적으로 말하면 포워딩은 패킷의 헤더에 있는 목적지 주소와 포워딩 테이블에 있는 엔트리를 매칭시켜서 해당하는 링크로 보내는 작업이다. 그리고 이러한 포워딩 테이블을 만들어주는 것이 라우팅(알고리즘)이다.
한 줄 정리하면 라우팅으로 만든 포워딩 테이블을 참조해서 해당 링크로 보내는 작업인 포워딩이 라우터가 맡은 핵심 역할이다.
만약 포워딩 테이블이 패킷헤더 번호와 링크 번호가 1대1로 되어있으면 너무너무 테이블이 길어진다. 따라서 실제 포워딩 테이블은 몇번부터 몇번은 이쪽 링크로 나가라와 같은 범위로 지정되어 있다.
전에 배웠던 내용을 복습하자. 애플리케이션 레이어에서는 세그먼트를 만들어 내려보내고 트랜스포트 레이어에서는 패킷을 만들어 내려보내고 네트워크레이어에서는 IP를 만들어 내려보낸다. IP의 헤더에는 위와같이 여러가지가 있다. 예를들어 Time To Live 의 경우에는 숫자값이 들어가 지나가는 라우터마다 숫자가 줄어들고 0이되면 자체적으로 IP가 사라진다. 포워딩 테이블이 잘못될 경우 라우터만 삥삥돌고 있는 네트워크 망령이 되는 것을 TTL을 통해 방지하는 것이다. 다음으로 IP 헤더의 가장 중요한 역할을 맡고 있는 IP주소에 대해 살펴보자
IP 주소는 흔히 호스트를 지칭하는 주소라고 알고있다. 하지만 좀 더 기술적으로 깊이 알아보면 IP는 크게 24비트인 Network와 8비트인 호스트, 두 부분으로 나누어져 있다. 예시에서 24는 네트워크 아이디의 비트수를 보여주고 있다. 만약 같은 교실내 노트북이 같은 네트워크를 이용하고 있다면 호스트 아이디만 다르고 네트워크 아이디는 같은걸 쓴다고 나온다.
또한 IP는 32비트이기 때문에 이론상 2^32개의 IP주소를 가질 수 있다. 32비트를 이진수로 읽기엔 너무 복잡하기 때문에 8비트씩 끊어서 10진수로 전환하여 IP를 읽는다. 이때 IP 한 단위는 8비트이기 떄문에 255(2^8-1)을 넘어갈 수 없다.
(위 그림에서 Mask란 SubnetMask로 IP주소중 어디까지가 network Id 인지, 어디까지가 host 인지 단순히 나타낸 것이다.)
네트워크 주소(prefix)는 너무 길어서 나누어서 배정해두었다. 바로 24비트를 3개의 Class로 나누어 배정한 숫자다. 앞부분 8비트는 Class A로 맨앞자리는 반드시 0이여야 하기 때문에 실질적으로는 7비트이다. 즉 클래스 A는 128개(2^7)의 기관이 사용할 수 있는 address이다. 같은 원리로 클래스 B는 2^15의 기관, 클래스C는 2^23의 기관이 네트워크 주소를 가질 수 있다
하지만 클래스 A를 할당받은 IP주소는 여전히 너무많은 IP주소 공간을 보유하게 된다(뒷자리가 16비트나 남아서). 문제는 클래스 A ip address를 초기 인터넷 연구기관(MIT, UCLA.. etc)이 선점하고 이 기관들은 그 넓은 공간을 활용하지 않다보니 IP 주소공간 낭비가 심화된다. 따라서 90년대 중반 class라는 개념을 없애고 CIDR(Classless Inter-Domain Routing)이 새로 도입된다.
하지만 클래스 A를 할당받은 IP주소는 너무 많은 Ip주소 공간을 보유하게된다. (뒷자리 클래스B, 클래스C 공간까지 모두 보유하게됌-16비트). 클래스 A ip address를 초기 인터넷 연구기관(MIT, UCLA.. etc)이 선점하고 이 기관들은 그 넓은 공간을 활용하지 않다보니 IP 주소공간 낭비가 심화된다. 따라서 90년대 중반 class라는 개념을 없애고 CIDR(Classless Inter-Domain Routing)이 새로 도입된다.
클래스처럼 네트워크 ID를 8비트씩 끊지않고 필요한 테크워크 크기에 맞춰서 네트워크 ID를 사용하는 방식이다. 예전에는 클래스 C의 IP주소를 가지고 있는 경우 쓸데없이 클래스 a, b 주소 공간이 같이 포함되어 있어 포워딩 테이블 공간이 커질 수 밖에 없었다. 하지만 CIDR 방식을 사용함으로써 네트워크 안에 라우터가 가지고 있는 포워딩 테이블도 줄어드는 효과가 있다.
CIDR방식은 다음과 같다. 먼저 패킷은 언제나 목적지 IP주소를 가지고 있다. 이때 IP의 prefix에 맞는 목적지로 가는 과정에서 prefix가 매칭되는 여러 ip중 가장 구체적으로 매칭되는 IP로 전달된다. 가장 구체적이란 것은 결국 prefix가 가징 긴것, 슬래쉬 뒤에 숫자가 큰 곳으로 찾아간다.
서브넷은 같은 IP prefix를 가진 디바이스의 집합이다. 서브넷을 기능면에서 정의하면 라우터를 거치지 않아도 접근이 가능한 호스트의 집합이다. 라우터들은 IP주소를 갖지만 prefix가 다른 IP주소를 갖는다. 즉 라우터는 하나의 서브넷에 속한 것이 아닌 여러 서브넷의 교집합이다.서브넷들은 이 교집합인 라우터를 통해서만 다른 서브넷으로 이동할 수 있다.
라우터 내부에서는 local address로 ip주소를 활용한다. 라우터 바깥으로 나갈때만 글로벌하게 유니크한 IP로 전송한다. 이를 통해 IPv4(40억개 주소 보유)만으로도 버틸 수 있다. (서브넷 덕분에 버티는거지 사실 40억으로 버티기 힘듬) 이를 Network Address Translation 줄여서 NAT이라고 부른다. 사실상 IP주소 돌려막기이지 근본적인 문제 해결은 아니다
NAT를 통해 outside로 나갈 때는 글로벌하게 유니크한 ip주소를 사용하기 때문에 문제가 없지만 다시 들어올 때 어떻게 다시 목적지로 오느냐가 문제가 된다. 이때 Gateway Router는 외부에서 온 IP주소를 translate 해주는 기능을 수행해서 적절한 디바이스에 전달해준다.
위와 같은 IP주소 돌려막기(NAT)의 가장 큰 문제는 layer violation 이 된다는 것이다. 라우터가 원래해야할 일은 패킷의 헤더만 관찰하고 목적지 주소에 맞는 방향으로 forwarding 해주는 것인데 NAT에서는 라우터가 IP 패킷의 소스주소를 고쳐버리고 (layer violation), 데이터부분까지 파고들어가 데이터부분을 고쳐버린다.
앞선 내용을 정리하면 현재 Ip주소 구조는 Clasless Inter-Domain Routing(CIDR) 방식을 사용하고 있고, Network Address Translation 방식을 통해 약 40억개 정도의 한정적인 주소(IPv4 기준)를 GateWayRouter에서 같은 서브넷에 속해있는 개별 호스트들에게 뿌린다. 물론 IP돌려막기이고 Layer Violation의 문제점(라우터는 읽기 작업만 해야하는데 쓰기 작업을 하기 때문에)이 남아있기는 하다.
우리가 인터넷에 연결되기 위해 알고있어야하는 가장 기본적인 정보는 IP주소, 서브넷Mask, Router, DNS 네 가지이다. IP주소는 말그대로 글로벌하게 호스트 찾아가는 주소, 서브넷마스트는 네트워크 주소와 호스트 주소를 구분하고 NAT를 통해 개별 호스트에게 뿌린다. DNS(로컬 네임서버)는 우리가 입력한 naver주소를 ip주소로 바꿔준다. 위에서 복습하면서 살펴봤던 IP/Mask/Router/DNS 주소들도 누군가 Static하게 미리 적어둔 것이 아닌 동적으로 적히는 구조이다. 여기에 DHCP가 적용된다. DHCP란 IP Protocol의 일종으로 Dynamic Host Configuration Protocol 의 약자이다.
DHCP는 어디로 이동하든 동적으로 Host를 configure 해준다. 만약 고정 IP를 써서 어느 대학의 네트워크를 운영하면 최소 학생수(예를들어 1만개)만큼 IP주소를 할당해야할 것이다. 이때 DHCP를 적용하면 active한 주소 1000개정도로 크기를 줄일 수 있습니다. 이해를 돕기 위해 비유하자면 DHCP 는 호텔 프론트 데스크라 볼 수 있다. 손님(스마트폰, 맥 등..)이 호텔에 오면 프론트 데스크에서 특정 방번호를 패킷에게 준다. 이때 손님은 자기가 원하는 방을 아무렇게나 지정할 수 없고 특정 시간에만 배당받은 방을 보유하게 된다. 즉 디바이스가 네트워크에 접속할 때는 IP주소가 필요하고, 이때 DHCP는 사용가능한 IP주소를 호텔프론트마냥 빌려준다. 디바이스는 할당받은 ip주소를 lease time 동안 사용후 시간이 만료되면 다시 DHCP에게 요청한다.
DHCP 의 구체적인 동작방식에 대해 알아보자. 디바이스가 네트워크 처음 연결될 때 DHCP 프로토콜이 사용된다.(구글닷컴 입력하기 전에). 이러한 DHCP의 동작방식(DHCP를 이용한 클라와 서버의 통신)은 4가지 과정 discover, offer, request, ACK을 통해서 이루어진다.
- Discover: 클라가 서버에게 나 IP주소 필요해ㅠㅠ 라고 요청하는 단계로 아직 클라는 DHCP 서버의 주소를 모르는 단계이다
- Offer: 여기에서는 DHCP 서버는 사용가능한 IP주소를 쏴준다. 만약 DHCP서버가 여러개라면 클라는 다수의 offer를 받는다.
- Request: 클라는 DHCP 서버로 부터 받은 사용가능한 ip주소들 중 하나를 골라 (보통 가장 먼저 전달받은거) 서버한테 나 이거 쓴다? 라고 메세지를 보낸다.
- Acknowledge: 이단계에서 DHCP 서버는 그래 그거 써 라고 ACK메세지를 보내준다. 이 메세지에는 IP주소와 서브넷 마스크, DNS서버 주소등을 포함한다.
지금까지 IP헤더 안에 있는 정보중 IP주소를 알아보았다. 이번에는 IP 헤더 안에 있는 또다른 정보인 Fragment Offset 이 무엇인지 알아보자. IP는 전송계층의 패킷을 한 번 포장한 형태이다. 이러한 패킷을 보낼 때는 한 번에 통으로 보내는 것이 아닌 조각(fragment)을 나누어서 보낸다. 이 때 전송완료후 조각난 fragment 를 다시 합칠 때 어떤 순서로 합쳐야하는지 알 수 있는 정보가 필요한데 이것이 offset이다. (따라서 각 fragment는 offset을 가지고 있다.). 정리하자면 Fragment Offset은 나중에 퍼즐을 완성시킬 때 각 데이터가 자리해야할 위치를 알려주는 정보라고 할 수 있다.
만약 조각난 패킷의 Fragment가 유실되면 reassembly가 안된다. 따라서 같은 패킷의 fragment도 유실이 된다. 이렇게 되면 패킷의 타이머가 터져서 retransmission 된다.
네트워크 계층에서는 진단/오류 보고 역할을 수행하는 프로토콜도 존재한다. 바로 ICMP(Internet Control Message Protocol) 프로토콜로 네트워크의 전체 통신 프로세스에서 중요한 진단 및 오류 보고 역할을 수행한다.
전 시간에 살펴보았듯이 IPv4는 언젠가는 한계에 다다를 것이다. 분명 언젠가는 IPv6로 넘어가야할 것이다. 나중에 이런 과도기가 오면 IPv4를 감싸주는 IPv6 라우터들이 필요할 것이다. IPv4 → IPv6로 바뀌는데 있어서 IPv4를 읽어왔던 라우터들은 IPv6의 헤더를 읽지 못한다는 문제점이 발생한다. 따라서 새로운 버전(IPv6)의 패킷을 데이터로 퉁쳐서 IPv4 구조의 헤더로 감싸버리는 과정이 생기는 과정이 바로 터널링이다.
결국 엣지포인트를 제외하면 네트워크는 라우터로 구성된 그래프이다. 최소한의 라우터들만 거쳐 목적지에 도달하면 되기 때문에 사실상 알고리즘이다. 이를 라우터 알고리즘이라 부른다. 라우터 알고리즘 중 하나인 Link State 알고리즘을 살펴보자. 당연히 라우터를 통한 통신에서 가장 빠른 방법을 찾아내는 알고리즘으로 라우터들은 같은 로컬 네트워크에 있어 위치나 네트워크 정보를 공유하고 있는 상황의 알고리즘이다. LinkState 알고리즈의 범위는 하나의 도메인으로 한정지을 수 있다.
동장방식은 결론부터 말하자면 다익스트라 알고리즘을 사용한다. (다익스트라 알고리즘은 최단경로 탐색 알고리즘으로 최단거리를 알때까지 이전의 최단거리를 계속해서 갱신한다 → 라우터의 경우 경로마다 cost가 다르기 때문에 적은 라우터를 지나간다고 무조건 최단거리가 아니기 때문). Link State 알고리즘을 요약하자면 서로의 경로를 알고시작함 + 다익스트라 알고리즘 돌려버리기이다.
각 도메인 내의 라우터들의 최소경로를 찾아내는게 Link State 알고리즘이였다면 이번엔 도메인간의 최소경로를 찾아내는 알고리즘으로 또다른 라우터 알고리즘 중 하나인 Distance Vector Algorithm 에 대해 알아보자. Distance Vector Algorithm은 링크들 간 무언가 변경사항이 있을 때 업데이트 하는 데 있어 유용하게 사용되는 알고리즘이다.벨만-포드 알고리즘을 기반으로 하며 Distance Vector의 전달조건으로는 자기 distance vector의 전달조건이 하나라도 업데이트 된다면 전달한다. 즉 목적지에 대한 거리(벡터값)가 하나라도 업데이트 되면 전달한다. 구체적인 동작방식은 아래와 같다.
- x 에서부터 y까지 최단 경로로 가려면 반드시 먼저 x의 이웃 중 하나를 거친다.
- 만약 x의 인접 라우터 a,b,c가 있으면 a,b,c부터 y까지 최소경로를 가지고 있는 인접 라우터를 고르면 된다.
- 이를 계속 인접 라우터로 반복해버리는 알고리즘이다.
- 이때 x의 인접 라우터 v는 목적지 y,w,z 의 거리(벡터값)을 x에게 넘겨주게 된다. 따라서 Distance Vector 알고리즘이라고 부른다
하지만 Distance Vector Algorithm 에는 한 가지 문제가 있는데 네트워크 내의 어떤 라우터가 실패하거나 링크가 끊어질 경우, 라우터들이 이 변화를 인지하고 라우팅 테이블을 적절히 갱신하기 전까지 잘못된 정보를 계속 전파할 수 있다는 것이다. 이를 Count to Infinity 라고 한다. 이를 해결하기 위한 방법은 3가지가 있다.
- Split Horizon: 라우터 A를 original sender로 지정한다음에 B로부터 응답이 오는지 확인한다.
- Route poisoning: 만약 라우터 C가 B로부터 통신이 안된다면 모든 라우터에게 이를 알린다.
- Hold-downs: 위 방법을 통해 B라우터에 문제가 생겼다는 것을 깨닫게 된 순간부터 라우터들은 B라우터의 정보를 무시한다
앞서 도메인 내의 라우터들의 최소경로를 찾아내는게 Link State 알고리즘이고 Linked State 알고리즘의 전제조건은 같은 로컬 네트워크에 있어 위치나 네트워크 정보를 공유하고 있는 상황이라고 했었다. 즉 네트워크 통신에 서 Linked State알고리즘이 적용되려면 라우터간 정보가 공유(broadcasting)되어 있어야만한다. 하지만 현실 인터넷은 라우터의 개수가 엄청나게 많고 이를 전부 broadcasting 하는 것이 불가능하기 때문에 계층화를 시켜서 적용한다.
전세계 모든 Router에 broadcasting 하는 것은 불가능하다. 따라서 그룹별로 routing 알고리즘을 실행한다. 예를들어 중앙대 라우터에서 숭실대를 거쳐 서울대로 가야한다면 중앙대 안에서 라우팅 알고리즘을 돌리고 숭실대 안에서 돌리고, 서울대 안에서 돌린다음에 연결한다.이렇게 중앙대, 숭실대, 서울대 각각의 독립적인 시스템을 Autonomous Systems(AS)라 부르고 이러한 AS를 연결해 전달하는 방법을 intra-AS rounting 이라고 부른다. 모든 AS는 각자의 number를 가지게 되며 이를 ASNs(AS Numbers) 라고 부른다.
정리하자면 intra-AS rounting 으로 인해 출발지에서 목적지까지 각 AS들을 거쳐가게 된다. 이때 각 AS들은 자선단체가 아니기 때문에 통행료를 받는다 (AS 내부 네트워크를 유지하려면 돈이 들기 때문에). 이때 AS를 필요로하는 흔히 말하는 을이 customer가 되고 통행세 받는 갑이 provider가 된다. 이 관계는 상대적이라고 할 수 있다.
이때 각 AS 경계선에 있는 라우터들을 Border Gateway Router 라고 불리며 BGR을 어떻게 연결할 것인가에 대한 약속이 Border Gateway Protocol (BGP) 이다. BGP에 대해 생각해보면 당연히 각 BGR간 최소 거리라고 생각할 수 있겠지만 현실은 그렇지않다. 현실에서는 오직 비용이 우선시된다. 최적 경로와 상관없이 비용을 최대한 줄일 수 있게 한다. 비용을 줄이기 위해 먼저 자신을 Provider로 둘 수 있는 라우터로 먼저 트래픽을, 2순위로는 peer관계가 될 수 있는 라우터에, 최후의 방법으로는 customer가 되어 비용지불을 통해 트래픽을 전달한다.
'Computer Science > Network' 카테고리의 다른 글
무선 이동 네트워크 (0) | 2024.05.20 |
---|---|
링크 계층 (2) | 2024.05.14 |
| 컴퓨터 네트워킹 하향식 접근 | Ch1 컴퓨터 네트워크와 인터넷 (0) | 2024.05.07 |
전송 계층 (0) | 2024.05.05 |