network 4강 - network layer
Network layer
- 네트워크 레이어는 전송계층에서 넘어온 segment를 패킷으로 포장한 뒤 연결되어있는 상대방에게 보내는 역할을 한다.
- 패킷은 여러 라우터들을 거치며 목적지를 향해 전송되는데 라우터들도 목적지가 어디인지 알아야하기 때문에 네트워크 레이어까지는 가지고 있으며 다음 라우터까지 패킷을 포워딩해준다.
Network layer가 하는 일
forwarding : 패킷의 목적지를 확인하고 forwarding table을 확인해 어디로 보낼지 결정한 뒤 전송하는 일
routing : forwarding을 위한 forwarding table을 만드는 일
Forwarding Table
forwarding table은 주소 범위로 이루어져 있다. (0 ~ 10번까지는 1번, 11~20번은 2번 등)
보통 범위 대신 *을 활용해 표현한다.
longest prefix matching : forwarding table에서 매칭되는 것 중 가장 자세히 적혀있는 곳으로 forwarding
- ex) 11001000 00010111 00011000의 경우 1번과 2번 모두 해당되는데 1번이 가장 자세하기 떄문에 1번에 forwarding
IP datagram format
- time to live : 특정 숫자를 헤더에 담아서 보내면 하나의 라우터를 지날때마다 1씩 줄어들다 0이되면 패킷 drop -> 루프를 도는 등 패킷이 목적지를 향해 못가는 경우 계속 오버헤드가 발생하기 때문에 필요함
- upper layer : TCP / UDP인지 확인용
IP Address (IPv4)
- 32bit 번호
- 보통 8bit로 끊어서 읽음
- 보통 IP Address라 함은 컴퓨터마다 장착되어있는 네트워크 인터페이스를 뜻함(랜카드 등)
IP Address 배정
- IP Address는 마구잡이로 배정되는 것이 아니라(포워딩 테이블의 크기를 줄이기 위해) 계층화되어서 배정이 된다.
2개의 계층으로 나뉘는데 앞 부분은 Network의 주소, 뒷 부분은 Host 주소를 뜻한다.
- 보통 주소를 표현할 때 12.34.158.5/24와 같은 식으로 표한하는데 이때 /24는 network 주소의 bit 수를 뜻한다.
- Network 주소는 Network ID, Subnet ID, prefix 등으로 불린다.
또 위 그림과 같이 Subnet Mask라 불리는 비트맵으로 네트워크 주소를 식별하기도 한다. 흔히 알고있는 subnet Mask = Network bit 수(크기)
이런 방식 계층화를 하면 forwarding table은 훨씬 단순해지고 크기도 줄어들 수 있다. 새로운 호스트 추가도 쉽다.
Classless Inter-Domain Routing(CIDR)
- 90년대 중반 이전에는 network prefix를 클래스 개념을 이용해 배정했다.
- Class A = /8, Class B = /16, Class C = /24
- 하지만 이런 class를 활용한 배정은 너무 비효율적이고 공간의 낭비가 심했기 때문에 새로 등장한 것이 CIDR이다.
- CIDR은 네트워크 prefix를 필요한 host의 갯수만큼 유연하게 조절할 수 있게 해주었다.
Subnets
- 서브넷은 같은 네트워크 주소를 가지는 device들의 집합이다
- 같은 서브넷 끼리는 라우터를 거치지 않고 접근이 가능하다.
- 라우터의 경우 여러 서브넷 집합의 교집합이다.
Network Address Translation(NAT)
- 지금까지는 IPv4를 기준으로 IP에 대해 알아보았다. 하지만 IPv4에 대해 살펴보면 32bit를 가지고 IP Address를 표현한다고 했는데 32bit는 40억 정도로 우리가 현재 사용하는 컴퓨터의 갯수보다 현저히 적은 숫자이다.
- 그래서 이런 문제를 해결하기 위해 1990년대에 IPv6라는 새로운 프로토콜을 개발하기 시작했다.
- IPv6는 128bit 주소 공간을 가지며 절대 부족할 일이 없는 프로토콜이다.
- 하지만 현재에도 IPv6를 사용하지 않고 IPv4를 사용하는데 어떻게 부족한 주소공간을 해결했을까?
- 정답은 주소를 재활용하는 방법이다. (NAT)
로컬 네트워크 안에서는 각 디바이스가 고유한 IP 주소를 가진다. 하지만 이 주소는 밖에서는 유일하지 않다.(재활용)
그때 로컬 네트워크에서 밖으로 보내는 요청을 보내면 NAT를 해주는 라우터에서 유일한 IP주소로 src IP Address를 변경한 뒤 보낸다. 응답이 오면 반대로 한다.
하지만 실제 응답이 올 때 어떤 디바이스로 보내야 되는지 어떻게 판단할까?
NAT에는 NAT translation table을 두고 거기에 요청을 보낸 디바이스의 IP와 port 등 정보를 저장해둔다.
그 다음 밖으로 나갈 때 NAT의 IP 주소로 rewrite한 뒤 NAT table에 보낸 디바이스의 정보를 저장하고 그 디바이스를 식별하기 위한 port 번호를 만들어서 요청을 보낸다. 흐름은 다음과 같다.
1
10.0.0.2 요청 -> 요청 헤더의 src IP를 라우터의 IP로 덮어씨우고, 식별을 위한 port 번호를 지정한 뒤 dest IP로 요청을 보냄 -> 응답이 오면 table에서 port번호로 디바이스 IP 주소 찾음 -> 10.0.0.2로 덮어씌우고 원래 port번호로 바꿈 -> 끝
하지만 NAT도 여러 문제를 가지고 있다.
라우터는 네트워크 레이어 장치임에도 전송 계층의 port 번호를 바꿈 -> 계층대로 동작 X
port 번호를 가지고 식별하기 때문에 NAT가 동작하는 라우터 안에는 서버를 만들 수 없음 -> 만약 80번 port를 가지는 웹 서버를 만들었다고 가정하면, NAT로 80번 port를 향한 요청이 들어와도 NAT에서 port 번호는 디바이스를 식별하기 위한 번호이므로 서버가 요청을 못 받음
해결책
이런 문제는 포트 포워딩으로 해결함 -> 게이트웨이 라우터에 특정 포트로 들어온 요청을 특정 디바이스의 특정 포트로 전달하도록 설정할 수 있음
Dynamic Host Configuration Protocol(DHCP)
- 우리가 컴퓨터를 사용하면 각자의 IP 주소를 가지고 인터넷을 자유롭게 사용하고 있다.
- 근데 이 IP 주소는 누구에 의해서 어떻게 할당되는걸까?
- 만약 어느 카페에 가서 와이파이에 접속했을 때 우리는 별다른 행동을 하지 않고 IP를 할당 받아 사용할 수 있다.
- 이렇듯 각 디바이스가 IP를 할당 받게 도와주는 것이 DHCP이다.
- 개념적으로는 DHCP에서 IP 풀을 만들어놓고 사용자가 접속하면 풀에서 IP를 꺼내서 할당해주고, 끝나면 회수하는 식으로 동작한다.
DHCP 시나리오
- 클라이언트가 처음 접속 -> DHCP 서버는 물론 어떠한 정보도 모르는 상태
- 클라언트가 src IP = 0.0.0.0을 통해 할당되지 않은 client라는 정보와 dest IP를 브로드캐스트(모든 비트가 1 -> 서브넷에 있는 모든 멤버들은 해당 메시지를 받음)로 보냄
- DHCP server만 해당 메시지에 반응(port = 67), 나머지는 버림
- DHCP는 자신의 src IP와 dest IP는 브로드캐스트로 할당 받을 IP 주소를 포함해 응답함 -> 아직 새로 IP 주소를 할당 받기 전
- 새로 접속한 클라이언트는 IP 주소를 할당받을 준비가 완료되었다는 의미로 transaction ID + 1 한 값으로 요청하고 똑같이 응답을 받으면 끝이다. -> 여기서 dest IP를 브로드캐스트로 한 이유는 DHCP 서버가 여러개 있을 수 있기 때문에 어떤 IP를 선택했는지 다른 DHCP 서버에게 알려주기 위해서이다.
- 보통은 게이트웨이 라이터에 DHCP server를 같이 둔다.
IP Header 중 flagmentation, reassembly에 대해
- 네트워크 링크 레이어에는 MTU(max.transfer size)라는 한번에 보낼 수 있는 데이터의 최대 양을 뜻하는 값을 가지고 있다.
- 이 MTU는 링크 레이어의 기술에 따라 다 다르다.(이더넷, 와이파이 등)
- 그렇기 때문에 위의 헤더가 필요하다.
- 만약 4000byte의 패킷을 sender가 보내는 도중에 한 라우터의 MTU가 1000이라고 가정해보자. 이 문제를 어떻게 해결할까?
- 가장 단순한 방법은 드랍 시키는 것이다. 하지만 이런 방식은 비효율적이기 때문에 IPv4에서는 다른 방식을 채택했는데, 바로 해당 패킷을 분리해서 전송하는 것이다.
- 자세한 방법은 다음과 같다.
위 필드 중 fragflag = 0이면 더 이상 나누어진 패킷이 없다는 뜻이다. fragflag = 1이면 나누어진 패킷이 있다는 뜻으로 해석할 수 있다.
만약 중간의 한 fragment가 유실된다면 reassembly가 될 수 없기 때문에 타이머가 터지고 재전송하게 된다.
Internet Control Message Protocol(ICMP)
- 만약 패킷 전송 중에 로스되거나 TTL에 의해 드랍된 경우 src에게 패킷을 드랍했다는 것을 어떤 방식으로 알릴까?
- 네트워크 계층에서는 전송 중 패킷의 상태가 변하면 src에게 메시지를 보내는 프로트콜인 ICMP를 사용한다.
Routing Algorithm
네트워크에 있는 수많은 라우터들은 결국 포워딩 테이블에서 longest prefix match를 통해 어디로 갈지 정하는 역할을 하는 것이다.
그렇다면 이 포워딩 테이블은 어떻게 만들어지는 걸까? 그 답은 다음부터 알아볼 라우팅 알고리즘을 이용한다.
Graph abstraction
- 기본적으로 라우팅 알고리즘들은 라우터들을 그래프의 노드라고 생각해 경로를 탐색하고 최단경로를 찾는 방식이다.
- 최단 경로를 찾는데 2가지 접근 방식이 있다.
- 모든 경로의 코스트를 알고 있음 : link state 알고리즘 사용
- 라우터들이 서로 이웃한 라우터들의 코스트만 알고 있음 : distance vector 알고리즘 사용
Link State Algorithm
link state는 모든 경로의 코스트를 알고 있어야 하는 방식이다.
그러기 위해선 모든 라우터들이 브로드캐스트로 자신의 state를 모두에게 알려야한다.
이 Link State 알고리즘은 다익스트라 알고리즘을 사용한다.
예제)
- D(n) = 해당 노드까지 가는 거리, N’ = 최소 경로를 찾은 노드의 집합
- Step 0 : 시작 노드인 u를 N’에 넣고 u에서 갈 수 있는 노드들의 거리를 구함 -> 그 중 가장 낮은 값을 N’에 넣음
- Step 1 : Step 0에서 넣은 N’의 노드에서 N’에 없는 노드 중 갈 수 있는 노드의 최단 거리를 구함 -> 그때 전에 구했던 값이 있다면 그 값과 자신을 통해 해당 노드에 가는 값을 비교(D(x)의 경우 전에 구했던 값이 5, D(w)를 통해 가는 값이 7이므로 5가 선택)
- Step 1에서 구한 값 중 가장 적은 cost의 노드를 N’에 넣고 반복
- 모든 노드가 N’에 들어가면 종료
Distance Vector Algorithm
- Distance Vector Algorithm은 DP를 활용한 알고리즘이다
- 이 그림과 같이 u에서 z까지의 촤단거리를 구할 때 u와 인접한 노드 + 해당 노드에서 z까지 가는 최단거리를 더하는 방식이다.
- 그럼 인접한 노드에서 z까지 가는 최단거리는 어떤 방식으로 구할까?
- 그것은 노드가 다른 노드들까지 가는 거리를 계산한 vector(array)를 이웃에게 보내줌으로써 계산이 가능하다. 그래서 Distance Vector Algorithm이다.
- 거리를 계산해 더 작은 값이 나오면 업데이트하고, 만약 더 이상의 업데이트가 일어나지 않는 안정화가 되면 끝난다.
- 만약 안정화가 된 상태에서 링크 cost가 더 작은 값으로 바뀐 경우는 한번의 교환으로 빠르게 다시 안정화 상태로 돌아갈 수 있다.
- 하지만 링크 cost가 더 늘어난 경우 무한굴레에 빠지는 Count-to-infinity라는 문제가 발생한다.
- poisoned reverse 기법으로 이 문제를 해결할 수 있다.
정리
- 보통 라우팅 알고리즘은 전세계 모든 라우터들간에 거리를 계산하는 것은 현실적으로 불가능하므로 하나의 네트워크(SKT, 한양대 등) 안에 있는 라우터들간의 거리를 계산할 때만 쓰인다.
- 네트워크들 간의 포워딩하는 것(ex) 한양대 -> SKT)은 다른 방법을 사용한다.
Hierarchical routing
- 하나의 네트워크(한양대 등)는 Gateway router를 통해서만 빠져나가고 그 안에 있는 라우터들을 어떻게 관리할지는 자치적으로 결정하게 된다. 이런 자치권을 가진 네트워크를 autonomous systems(AS)라고 부른다.
- 이런 AS간의 통신을 위해 네트워크는 계층화(내부와 외부)를 했고, AS 내부의 라우팅은 Intra-AS, AS끼리 라우팅을 Inter-AS라고 부른다.
BGP
- BGP는 Inter-AS에서 사용하는 프로토콜이다.
- Intra-AS의 경우 최단 cost라는 명확한 목표가 있지만, Inter-AS의 경우는 명확한 목표를 가지고 있지 않다.
- 전세계에 여러 네트워크들 간의 일이기 때문에 정치적이나 물질적인 요소들에 의해 결정이 된다.
Relationships Between Networks
- AS들 사실 같은 개념하에 묶여있지만 서로의 위상이 다르다. (미국과 한국의 위상이 다르듯)
- 위 그림처럼 서비스를 제공받는 customer와 돈을 받고 서비스를 제공하는 provider의 관계를 가지고 있다.
- 그렇다면 AS들간에 누가 provider고 누가 customer일까?
- 작은 AS들과 큰 AS들 간의 provider, customer 관계는 명확한데 비슷한 체급의 AS들 간에는 어떤 식으로 결정할까?
- 이런 경우에는 특수한 peer 관계가 맺어진다.
- 서로 윈윈하는 관계로 돈을 주고 받지 않는 관계이다.
- 하지만 중간의 검은색 트래픽은 불가능하다.
- 그 이유는 철저히 돈과 관련있다. 파란색 선 같은 경우 트래픽을 운반해주면 customer에게 서비스를 제공할 때 돈이 되지만, 검은색 선의 경우 중간에 운반만 해주는 AS에게는 아무 이득이 없기 때문에 해당 트래픽을 운반해주지 않는 것이다.
경로 설정
위와 같은 이유로 경로를 설정할 때는 꼭 최단 거리를 선택하지 않고 해당 AS의 정책에 기반해서 경로를 설정한다.
위 그림과 같은 상황에서 2번의 라우팅만에 도착하는 경로가 있지만 그 경로를 선택하기 보다는 트래픽을 보내면서 + 돈까지 벌 수 있는 Customer link를 선택하게 된다.
이를 구현한 것이 바로 BGP이다.
출처)
[컴퓨터네트워크 - 한양대학교 | KOCW 공개 강의](http://www.kocw.net/home/search/kemView.do?kemId=1169634) |