http://www.kocw.net/home/search/kemView.do?kemId=1169634
https://media.pearsoncmg.com/intl/ge/2021/cws/ge_kurose_compnetwork_8/cw/index.php
Network layer
Transport Layer의 역할과 기능에 대해 배웠다. 이번에는 전송 계층의 아래에 위치하는 네트워크 계층에 대해 배워보자. 전송 계층에서는 통신 상대와의 연결 수립 및 데이터가 올바른 프로세스에게 전달되도록 담당하는 계층이었다. 네트워크 계층은 송신자와 수신자 사이에 존재하는 여러 노드들을 거쳐가는 배송 '경로'를 책임진다. 그렇기 때문에 네트워크 코어에 있는 router들은 모두 network layer가 존재한다. (배송을 할 때마다 경로를 확인해야 하니까 배송 경로를 담당하는 네트워크 계층이 있어야 됨)
어쨌든 네트워크 계층은 배송 경로를 책임져야 하는데, 어떻게 최적의 경로를 파악할 수 있을까?
네트워크 계층의 두 가지 기능
forwarding
- 라우터의 입력에서 적절한 라우터 출력으로 패킷을 이동시키는 것.
- 전달받은 패킷의 헤더 value와 라우터가 갖고 있는 forwarding table을 확인하여 패킷을 알맞은 방향으로 이동시킨다.
routing
- forwarding 할 때 참고할 forwarding table을 만든다.
- forwarding table을 만드는 여러 가지 방법이 있고, 그 방법들을 라우팅 알고리즘(routing algorithms)이라 한다.
라우터가 패킷을 전달받았다고 가정해 보자. 이 라우터는 어느 쪽으로 해당 패킷을 전달해야 할까? A로 전달하든 B로 전달하든 C로 전달하든 네트워크는 모두 연결되어 있을 테니 어쨌든 모두 전달은 될 것이다. 그렇다고 아무렇게나 전달하면 안 되고 자신이 생각하는 최적의 방향으로 전달해야 한다. 라우터는 자신이 갖고 있는 forwarding table과 전달받은 패킷의 header에 있는 value를 확인하여 A 혹은 B 혹은 C로 전달받은 패킷을 내보낸다. 이것을 포워딩이라 한다.
포워딩은 쉽다. 그냥 패킷 헤더랑 포워딩 테이블 보고 적혀있는 대로 보내기만 하면 끝이다. 그런데 포워딩 테이블을 만드는 '라우팅'은 어렵다.
여러 알고리즘을 통해 포워딩 테이블을 만들 수 있다. 이 중 다익스트라와 distance vector에 대해 알아보자. 다익스트라 알고리즘은 routing 알고리즘에서 특히 link state라고 불리기도 한다.
<컴퓨터 네트워크 강의 12강, 13강에 설명이 잘 되어있습니다.>
다익스트라 알고리즘(link state)
- 다익스트라 알고리즘은 하나의 edge에서 다른 edge로 가는 비용을 모두 알고 있어야 사용이 가능한 알고리즘이다. 따라서 엄청 큰 네트워크에서는 사실상 사용이 불가능하고 작은 네트워크에서 사용하는 routing algorithm이다.
- 메모리 소비가 크며 계산이 무겁다는 단점이 있다.
distance vector 알고리즘
- 상태가 업데이트되면 계산을 새로 하고 계산 결과가 기존 결과와 다른 부분이 있다면 해당 결과를 이웃 라우터들에게 전달한다. 아무 변화가 없을 때까지 반복한다.
- distance vector의 경우 이웃하는 라우터로의 cost만 알면 된다. 따라서 한 라우터가 모든 라우팅 정보를 갖고 있지 않아도 되기 때문에 메모리 측면에서 이점이 있지만 라우팅 테이블에 생긴 변화를 모든 라우터가 인지하기까지의 시간이 오래 걸린다.
IP: Internet Protocol
인터넷 프로토콜(IP, Internet Protocol)은 패킷을 전달하기 위한 네트워크 계층의 통신 프로토콜이다. IP는 IP 주소를 기반으로 소스 호스트에서 대상 호스트로 패킷을 전달하는 작업을 수행한다. 이를 위해 IP는 전송 계층으로부터 전달받은 segment에 IP 주소가 들어있는 header를 붙여 캡슐화를 진행한다.
IP datagram format
세그먼트는 IP를 통해 캡슐화를 거치면 아래와 같은 모양을 갖추게 된다.
TCP header를 보면 TCP가 제공하는 기능을 알 수 있듯 IP header를 보면 IP가 어떤 기능을 제공하는지 확인할 수 있다.
ver: IP 버전이 몇 버전인지 나타낸다.
head len: header의 길이를 나타낸다.
type of servce: 우선순위를 나타낸다.
TOS(Type of Service) Field in an IPv4 header is used for QOS (Quality of Service) Purposes.
There are lot of different type of data travelling in a network and some has higher importance than other.
Higher priority data should be processed first because it could contain packets which are important to run network communication such as routing protocols data.
Thus TOS field categories difference priority of data, so that a network device could process important data first and less important after that.
TOS bit value, higer has more priority
000 (0) - Routine
001 (1) - Priority
010 (2) - Immediate
011 (3) - Flash
100 (4) - Flash Override
101 (5) - Critical
110 (6) - Internetwork Control
111 (7) - Network Control
- Aayush Kumar -
https://www.quora.com/What-is-the-TOS-type-of-service-field-in-an-IPv4-header
length: datagram의 전체 길이를 나타낸다.
16-bit identifier, flags, fragment offset: 단편화 및 재결합(fragmentation&reassembly)을 위해 사용된다.
time-to-live: 몇 홉(라우터를 한 번 거치는 것이 한 홉)까지 해당 패킷을 살려둘 것인지 설정하는 것이다. 만약 이러한 기능이 존재하지 않는다면 네트워크 안에서 영원히 목적지에 도달하지 못하는 패킷이 생길 수도 있다. 이러한 패킷이 네트워크에 쌓일 것이고 이는 네트워크 혼잡도를 높이는 주범이 될 것이다. 따라서 time-to-live를 설정하여 네트워크 내에서 뺑뺑도는 패킷이 없도록 하는 것이다.
32 bit source IP address, 32 bit destination IP address: 출발지부터 목적지까지의 전송을 위해 사용된다. 라우터에서 IP 라우팅을 할 때 자신의 forwarding table과 대조하는 값이 바로 이 IP address이다. header의 IP address와 라우터의 forwarding table과의 대조를 통해 패킷이 출발지부터 목적지까지 전송될 수 있다.
** 단편화 및 재결합
IP는 단편화 및 재결합을 지원한다. 이게 뭐냐면 너무 길어서 한 번에 보낼 수 없는 패킷을 나눠서 보내고 도착지에서 이들을 다시 재조립하는 것이다. 예를 들어, 한 번에 1500까지만 전송 가능한 중간 노드가 4000짜리 패킷을 받았다고 가정해 보자. 패킷의 최대 전송량은 1500이므로 4000 크기의 패킷을 총 세 번에 걸쳐 보내야 한다.
1500+1500+1040: header 크기가 20이고 모든 패킷은 헤더를 가져야 하므로 header 크기를 제외하면 1480 + 1480 + 1020 = 3980으로 원래 보내는 패킷의 data 크기와 같다.
이렇게 나눠 보내는 것을 단편화(fragmentation)라 하고 목적지에서 이들을 순서에 맞게 재조립하는 것을 재결합(reassembly)이라 한다. 이를 위해 identifier, fragflag, offset이 header에 존재한다.
identifier는 원래 같은 조각이었음을 나타내기 위해 존재한다. 위 그림에서도 단편화된 세 개의 패킷이 모두 같은 ID를 갖고 있다.
fragflag는 다음에 도착할 조각이 있는지 나타낸다. 1이면 다음에 도착할 조각이 남아있다는 것이고 0이면 자신이 마지막 조각이라는 뜻이다.
offset은 해당 패킷의 데이터가 원본의 데이터의 어느 위치에 들어가야 하는 것인지 나타내기 위해 존재한다. 위 예시에서 두 번째 패킷의 data는 1480에 붙여야 하는 data이다.(1480 + 1480 + 1020이었으므로) 이때 offset은 저장공간을 아끼기 위해 /8을 한다. 따라서 185(1480/8=185)를 offset으로 적어놓았다. 세 번째 패킷의 offset도 동일한 방법을 통해 370(2960 / 8 = 370)이 들어가 있다.
IP Address (IPv4)
32비트의 고유한(네트워크에 같은 IP 주소가 있으면 안 됨. 목적지 IP를 두 PC가 공유하면 누구한테 줘야 될지 모르게 되니 당연하다.) 숫자이다. (e.g., 00000000 00001000 11010110 01110100) network interface를 식별하는 식별자로 쓰인다.
네트워크 인터페이스란 컴퓨터를 네트워크에 연결하는 요소이다. 네트워크 인터페이스의 예로 LAN 카드가 있다. 따라서 하나의 기계에 여러 개의 LAN 카드를 꽂아서 여러 IP를 갖게 할 수도 있다. 이러한 예시로는 라우터가 있다.
** 같은 네트워크에 속한 기기들의 IP는 서로 비슷하다. 이는 실세계의 주소 체계와 비슷하다. 경기도의 행정 구역 안에 있는 가구들의 주소는 전부 "경기도" 까지는 같을 것이다. 다만 상세 주소가 다른 것이다. 이처럼 같은 네트워크라면 IP 주소의 앞부분은 동일한데 이를 Network ID 혹은 Subnet ID 혹은 Prefix라 부른다. 이렇게 함으로써 인식하기도 편하고 forwarding table 작성 시 효율적으로 작성이 가능하다.
** 같은 네트워크에 속한 기기들의 IP가 비슷한 것이 forwarding table 작성 시 도움이 되는 이유
: forwarding table에 모든 IP주소들을 전부 적어 놓을 수는 없다. IP 주소는 32비트 고유 주소이므로 IP 주소는 총 4,294,967,296개이기 때문이다. 라우터는 모든 IP 주소를 적어놓는 대신 대강의 주소만 적어놓고 그것을 토대로 포워딩을 진행한다. 같은 네트워크에 속한 기기들의 IP는 비슷하므로 이와 같은 작업이 가능한 것이다. 또, 포워딩 시 Longest prefix matching을 진행하는데 패킷의 헤더와 가장 길게 일치하는 것을 우선순위로 포워딩하는 것이다.
NAT(Network Address Translation)
NAT은 다음의 문제를 해결해 준다.
: IPv4는 2^32(약 43억) 개의 IP 주소를 사용할 수 있다. 우리는 보통 한 명당 3~4개 이상의 기기를 사용하고 기기마다 중복되지 않는 고유한 IP 주소가 있어야 하는데, 어떻게 고작 약 43개의 IP 주소로 그보다 많은 기기들을 커버할 수 있는 것일까.
NAT은 패킷이 라우터를 통해 외부로 전달되기 전 IP 헤더에 있는 IP 주소를 수정하는 것을 뜻한다. 이러한 작업을 거치면 외부에서는 변환되기 전의 IP 주소를 모르기 때문에 내부의 IP 주소와 외부의 IP 주소가 중복되어도 문제가 발생하지 않는다. 이러한 방법으로 IPv4가 제공하는 2^32개의 IP 주소만으로도 그보다 많은 기기들을 커버할 수 있는 것이다.
NAT 기능은 라우터가 지원해 주며 이러한 NAT 지원 라우터는 공용 네트워크와 개인 네트워크 사이에 설치된다. NAT 지원 라우터의 역할은 내부 비공개 IPv4 주소와 할당된 공용 IPv4 주소 간에 변환이다.
위 상황은 내부 네트워크에 있는 10.0.0.1라는 호스트가 3345 포트를 통해 외부 네트워크에 있는 128.119.40.186:80으로 데이터 전송을 하려는 상황이다. 이는 다음과 같이 진행된다.
1. 10.0.0.1:3345이 dest 128.119.40.186:80으로 패킷을 전송한다.
2. 중간에 있는 라우터가 패킷을 받아 source IP 주소, source Port number를 10.0.0.1:3345에서 138.76.29.7(본인 IP 주소):5001로 바꾼 뒤 이를 NAT translation table에 저장하고 패킷을 전달한다.
3. 128.119.40.186:80가 요청을 처리하고 138.76.29.7:5001에게 응답한다.
4. 라우터는 138.76.29.7:5001을 받고 NAT translation table을 참고하여 dest IP 주소, dest Port number를 138.76.29.7:5001에서 10.0.0.1:3345로 바꾼 뒤 패킷을 전달한다.
5. 10.0.0.1 호스트가 3345 포트로 응답을 수신한다.
NAT 내부의 어떤 기기의 요청이든 그것이 외부로 나갈 때면 NAT은 그것의 source IP 주소와 source Port number를 재작성한다. 내부 IP 주소는 해당 NAT IP 주소로 바뀌고(138.76.29.7) Port number는 내부 내트워크의 특정 기기, 특정 포트를 지칭하는 번호로 바뀐다.
NAT의 문제점
라우터가 datagram의 source IP address와 source Port number를 수정한다.
- NAT이 하는 일은 우편부가 편지 봉투의 내용과 편지지의 내용을 수정하는 것과 다를 바 없다. 우편부는 전달만 해야지 편지 봉투와 편지지의 내용을 변경해서는 안 된다.
라우터가 source IP address와 source Port number를 수정하는 작업이 추가되니 전송과정이 느려진다.
- IPv6를 사용하여 근본적인 IP 주소의 개수를 늘리면 되는데 NAT은 꼼수를 부린 것이다.
DHCP(Dynamic Host Configuration Protocol, 동적 호스트 구성 프로토콜)
동적으로 호스트의 정보를 구성하는 Application layer의 프로토콜이다.
IP는 아래 두 가지 방법으로 할당받을 수 있다.
static IP (정적 IP)
dynamic IP(동적 IP)
정적 IP는 말 그대로 한 기기가 고정된 IP를 사용하는 것이고, 동적 IP는 한 기기가 동적으로 이 IP도 썼다가 저 IP도 썼다가 하는 것이다. 한 학교에 총 1000개의 기기가 있다고 생각해 보자. 모든 기기가 정적 IP를 사용한다면 그 학교에 필요한 IP의 총개수는 1000개일 것이다. 반면 동적 IP를 사용할 경우 현재 인터넷에 접속하고 있는 기기들에게만 IP를 할당해 주면 되므로 그 수가 정적 IP 보다는 적을 것이다. 따라서 동적 IP 방식이 좀 더 경제적이다. (IP 주소 할당받는 것도 돈 내야 하는데 그 값을 아낄 수 있으니까)
DHCP를 통해 IP 등의 정보를 할당받는 방법
호스트는 처음 아무런 정보도 갖고 있지 않다. 자신의 IP 주소도 모르고 DNS 서버 주소도 모르고 라우터 주소도 모르고 그냥 아무것도 모른다. 그래서 호스트는 맨 처음 다른 누군가한테서 그러한 정보를 전달받아야 한다. 이를 DHCP가 해주는 것이다. 그런데 DHCP 주소를 모르니까 클라이언트(호스트)는 broadcast로 network 내의 모든 기기들에게 메시지를 보낸다. DHCP 서버는 해당 메시지를 수신하고 클라이언트에게 응답을 보낸다. 응답을 받은 클라이언트는 다시 DHCP 서버에게 그 메시지를 잘 수신하였고 보내준 offer를 수락한다는 메시지를 보내고 그 응답 메시지를 받은 DHCP는 해당 요청을 수락한다는 메시지를 보낸다. 이 네 번의 메시지는 모두 broadcast이며 굳이 offer를 보내고 수락하고 하는 과정이 있는 이유는 같은 네트워크 내에 둘 이상의 DHCP 서버가 있어 클라이언트가 여러 DHCP 서버로부터 여러 개의 IP 주소를 받는 경우가 생길 수 있기 때문이다. 여러 DHCP가 준 여러 offer들 중 클라이언트 마음에 드는 offer를 선택하여 수락하는 것이다.
** 클라이언트는 맨 처음에 아무것도 모른다면서 DHCP의 port number는 어떻게 알고 보내는 것일까
: DHCP의 port nubmer는 고정되어 있어서 67 혹은 68로 보내면 된다.
: 마찬가지로 기기가 동적 IP가 아닌 정적 IP를 사용한다면 고정된 IP를 사용하는 것이므로 DHCP에게 IP를 전달받지 않아도 된다. (단, DNS 서버 주소나 등등의 것은 DHCP 서버로부터 받아야 한다.)
** 상대방(DHCP)의 IP 주소를 모르는데 TCP(1:1 소켓 연결) 연결을 할 수는 없으니까 DHCP 서버와 정보를 주고받는 과정은 UDP(소켓 열어놓고 아무나 정보 주세요~)를 사용한다.
'네트워크' 카테고리의 다른 글
컴퓨터 네트워크 기본 - 마지막 (4) | 2023.01.17 |
---|---|
컴퓨터 네트워크 기본 9 (2) | 2023.01.15 |
컴퓨터 네트워크 기본 7 (0) | 2023.01.11 |
컴퓨터 네트워크 기본 6 (0) | 2023.01.09 |
컴퓨터 네트워크 기본 5 (0) | 2023.01.09 |