인터넷 - #2. TCP/IP 스택의 계층 구조 (2)
전편이랑 이어집니다!
3. 네트워크 계층(Network Layer): 링크 계층 위에 논리 주소 체계 인프라 구축
링크 계층의 부족한 점
1) MAC주소가 하드웨어 각인되어 유연성 부족
- NIC 카드에 이상이 생길 경우 새로운 NIC카드를 장착하고 이에 의해 MAC주소는 이전과 다르게 됨
2) 인터넷을 보다 작은 네트워크망으로 나눌 수 없음
- 모든 컴퓨터가 단일 네트워크망으로 연결되어 각 프레임들을 모든 호스트에게 전달하고 각 호스트가 해당 프레임의 수신자가 자신인지 판단해야 함 -> 과부화
- 서로 다른 보안 영역으로 구분할 수 없음 (회사, 기업 내의 개별 네트워크 생성 불가)
3) 링크 프로토콜 간의 번역할 수 있는 수단이 없음
- 물리 계층과 링크 프로토콜 계층은 다양한 종류가 있고, 사용하는 용도에 맞춰 최적으로 구현하는 것인데 번역할 수 없다면 의미가 없어짐
이러한 링크 계층의 한계점을 개선하기 위해 네트워크 계층을 두고, 네트워크 계층에서는 논리 주소 체계를 구축하여 하드웨어 교체나 서브 네트워크(Subnetwork), 다른 종류의 링크 프로토콜 간의 통신을 가능하게 하였다.
IPv4
Internet Protocol version 4
1) IP주소
- 32 bit 숫자 (4개의 8bit 숫자를 마침표로 구분)
- 이를 통해 패킷 헤더에 목적 호스트의 IP주소를 기록하여 전송한다.
IPv4 패킷: 헤더(네트워크 계층 기능에 필요한 데이터) + 페이로드(전송할 데이터)
[0 - 31 비트]
버전 헤더 길이 서비스 종류 길이 총합 분열 식별자 플래그 분열 오프셋 TTL 프로토콜 헤더 체크섬 발신지 주소 목적지 주소 옵션
1) 0 - 3 (4비트): 버전
- 이 패킷이 지원하는 IP종류 표현 ex) IPv4: 4
2) 4 - 7 (4비트): 헤더 길이
- 헤더의 길이를 32비트 워드로 표시함
- IP 헤더 뒷부분의 옵션필드에서 길이가 가변적이다! 페이로드가 어디서부터 시작하는 지 알기 위해 헤더 길이를 명시해주어야 한다.
- 4비트로 표현할 수 있으므로 최대 15까지로 나타낼 수 있으며 이 15라는 숫자는 헤더가 열다섯개의 32비트 워드를 가지고 있음을 뜻함(15 x 4 = 60 바이트)
- 헤더는 최소 20바이트여야 하므로 이 숫자가 5보다 작을 수 없음
- 모든 패킷 헤더는 4바이트의 배수이므로 바이트 길이의 마지막 2비트는 항상 0이됨 -> 32비트 워드 사용
3) 8 - 15 (8비트): 서비스 종류
- 혼잡제어, 서비스 식별자 등
4) 16 - 31 (16비트): 길이 총합
- 전체 패킷의 길이를 바이트 단위로 표시함
- 헤더 + 페이로드 길이
- 16비트로 나타낼 수 있는 숫자는 0 ~ 65,535이므로 최대 패킷의 길이는 65,535바이트
- 헤더의 최소 바이트는 20바이트이므로 페이로드의 최대 바이트는 65,515
- 모든 패킷 헤더는 4바이트의 배수이므로 바이트 길이의 마지막 2비트는 항상 0이됨 -> 32비트 워드 사용
[32 - 63 비트]
1) 32 - 47 (16비트): 분열 식별자
- 분열된 조각이 원래 어느 패킷에 있었는지 나타냄 -> 한 패킷에서의 조각들은 이 값이 같음
2) 48 - 50 (3비트): 분열 플래그
- 원래 패킷에 더 이상 남은 조각이 없다는 걸 확인하는 필드
3) 51 - 63 (13비트): 분열 오프셋
- 원래 패킷의 시작 지점부터의 이 조각의 위치
-> 분열된 패킷들을 다시 조립하는 데에 사용한다.
[64 - 95 비트]
1) 64 - 71 (8비트): TTL(Time To Live)
- 패킷을 전달할 수 있는 횟수 제한
2) 72 - 79 (8비트): 프로토콜
- 페이로드 내용 해석에 쓰이는 프로토콜 명시
- 이더넷 프레임의 이더필드(종류)와 비슷함
3) 80 - 95 (16비트): 헤더 체크섬
- IPv4의 헤더의 무결성 점검
- 페이로드의 무결성을 검증하진 않음!! 헤더만 검증한다..
[96 - 127 비트]
1) 96 - 127 (32비트): 발신지 주소
[128 - 159 비트]
1) 128 - 159 (32비트): 목적지 주소
- 특수 주솟값 사용시 여러 호스트에 동시에 패킷을 보낼 수 있다.
2) 직접 라우팅과 주소 결정 프로토콜(ARP)
[호스트 A]
IP: 18.19.0.1
MAC: 01:01:01:00:00:10
[호스트 B]
IP: 18.19.0.2
MAC: 01:01:01:00:00:20
예를 들어 두 호스트가 있고 각 호스트는 NIC를 장착하여 MAC주소를 가지고 있다고 해보면
호스트 A에서 호스트 B에게 네트워크 계층 패킷을 보내려면 발신지 IP주소, 목적지 IP주소로 패킷을 준비한다.
그러나 이더넷 모듈은 IP주소만으로는 패킷을 전달할 수 없다.
IP주소는 네트워크 계층에 한해서만 적용되는 개념이므로 IP주소를 MAC조소로 변환하는 방법이 필요하다.
이 때 이 변환하는 것을 링크 계층의 주소 결정 프로토콜(ARP)가 수행한다.
(ARP는 링크 계층에 존재하는 링크 계층 프로토콜이긴 하지만 IP주소등 네트워크 계층도 포함하고 있어 링크 계층 프로토콜만으로 보기 힘들다.)
ARP: 패킷 구조(NIC가 어느 MAC 주소에 대응되는 지 질의함) + 테이블(IP와 MAC의 주소 쌍)
ARP 패킷 구조
[0 - 7 바이트]
Hardware Type
(하드웨어 종류)Protocol Type
(프로토콜 종류)Hardware Length
(하드웨어 주소 길이)Protocol Length
(프로토콜 주소 길이)Operation
(오퍼레이션)Sender Hardware Address (발신지 하드웨어 주소) Sender Protocol Address
(발신지 프로토콜 주소)Sender Protocol Address
(발신지 프로토콜 주소)Target Hardware Address (목적지 하드웨어 주소) Target Protocol Address (목적지 프로토콜 주소)
1) 하드웨어 종류 (16비트)
- 링크 계층이 호스트된 하드웨어 종류 정의
2) 프로토콜 종류 (16비트)
- 네트워크 계층 프로토콜의 이더타입 값
3) 하드웨어 주소 길이 (8비트)
- 링크 계층 하드웨어의 주소 길이
- MAC 주소는 6바이트
4) 프로토콜 주소 길이 (8비트)
- 네트워크 계층 논리 주소의 바이트 길이
- IP 주소는 4바이트
5) 오퍼레이션 (16비트)
- 1(정보 요청) 또는 2(응답)의 값
[8 ~ ... 바이트]
1) 발신지 하드웨어 주소 & 발신지 프로토콜 주소~ (가변길이)
- 이 길이는 앞선 하드웨어 주소 길이, 프로토콜 주소 길이와 일치해야 한다.
2) 목적지 하드웨어 주소 & 목적지 프로토콜 주소 (가변길이)
- 오퍼레이션 값이 1(정보 요청)일 때 목적지 하드웨어 주소는 알 수 없는 상태이므로 패킷 수신지는 이 내용을 무시한다.
[ARP를 이용해서 패킷을 보내는 과정]
1) 수신자의 IP주소에 대응하는 MAC 주소를 ARP에서 매칭 시킨다.
2) MAC 주소가 존재한다면 해당 MAC 주소를 포함한 링크 계층 프레임을 만들어 전달한다.
3) 테이블에 존재하지 않는다면 ARP 모듈이 링크 계층 네트워크에서 도달 가능한 모든 호스트에 ARP 패킷을 발신하여 MAC 주소를 찾는다.
- 이 때 오퍼레이션 값은 1, 이더넷 브로드캐스트 주소 FF:FF:FF:FF:FF:FF로 발신한다.
4) 수신한 모든 호스트들은 ARP 패킷의 목적지 프로토콜 주소와 자신의 IP주소를 비교한 후 일치한다면 자신의 ARP 패킷을 만들어 응답한다.
- 이 때 오퍼레이션 값은 2, 자기 주소를 발신지로, 정보 요청이 온 주소를 목적지로 한다.
5) 정보 요청을 보낸 호스트에서는 응답한 호스트의 MAC 주소를 ARP 테이블에 갱신한 후 IP 패킷을 이더넷 프레임에 포함하여 해당 MAC 주소로 전송한다.
3) 서브넷과 간접 라우팅
서브넷 마스크(subnet mask)
- 32비트 숫자
- 어느 두 호스트의 IP 주소를 각각 서브넷 마스크와 비트 AND 연산하여 그 결과가 같으면, 두 호스트는 같은 서브넷에 있다.
ex)
서브넷 마스크 255.255.255.0인 서브넷
18.19.100.1과 18.19.100.2는 이 서브넷에서 유효한 IP 주소이다.
18.19.200.1은 같은 서브넷에 있지 않다.
서브넷마다 네트워크 주소, 브로드캐스트 주소는 예약되어 있어 호스트에 할당할 수 없다.
- 네트워크 주소: 서브넷 내 유효 IP 주소를 마스크와 비트 AND 연산한 값
- 브로드캐스트 주소: 서브넷 마스크의 보수를 네트워크 주소와 비트 OR 연산한 값
- 브로드캐스트 주소로 지정된 패킷은 해당 서브넷의 모든 호스트에 전달되어야 한다.
네트워크 주소는 해당 서브넷의 시작 주소, 브로드캐스트 주소는 끝 주소라고 생각하면 된다.
호스트 | IP 주소 | 서브넷 마스크 | 서브넷 네트워크 주소 | 서브넷 브로드캐스트 주소 |
A1 | 18.19.100.1 | 255.255.255.0 | 18.19.100.0 | 18.19.100.255 |
B2 | 18.19.200.1 | 255.255.255.0 | 18.19.200.0 | 18.19.200.255 |
서브넷 네트워크 주소가 같은 그룹을 서브넷이라고 하는데, 서브넷 마스크와 네트워크 주소만 있으면 특정 서브넷을 지칭할 수 있다.
예를 들어, 위 표에서 A1이라는 호스트의 네트워크의 서브넷은 네트워크 주소 18.19.100.0과 마스크 255.255.255.0으로 정의할 수 있다.
CIDR(Classless Inter-domain Routing) 표기법
네트워크 주소 뒤에 /로 구분한 뒤 서브넷 마스크의 1인 비트의 개수
A1의 네트워크 서브넷을 표기하면, 18.19.100.0/24 가 된다.
[IPv4에서 서로 다른 네트워크의 호스트들이 패킷을 주고받는 방법]
호스트들은 IP 모듈을 가지고 있고, 이 IP 모듈은 라우팅 테이블을 보유하여 서브넷 간 패킷 전달을 맡는다.
[호스트 A1의 라우팅 테이블]
행 번호 | 목적지 서브넷 | 게이트웨이 | NIC |
1 | 18.19.100.0/24 | NIC 0(18.19.100.2) | |
2 | 18.19.200.0/24 | 18.19.100.1 | NIC 0(18.19.100.2) |
[호스트 B1의 라우팅 테이블]
행 번호 | 목적지 서브넷 | 게이트웨이 | NIC |
1 | 18.19.200.0/24 | NIC 0(18.19.200.2) | |
2 | 18.19.100.0/24 | 18.19.200.1 | NIC 0(18.19.200.2) |
[호스트 R의 라우팅 테이블]
행 번호 | 목적지 서브넷 | 게이트웨이 | NIC |
1 | 18.19.100.0/24 | NIC 0(18.19.100.1) | |
2 | 18.19.200.0/24 | NIC 1(18.19.200.1) |
* 목적지 서브넷: 대상 IP 주소가 포함된 서브넷
* 게이트웨이: 다른 서브넷의 링크 계층으로 패킷을 전달하기 위해 거쳐야 할 현재 서브넷상 다음 호스트의 IP주소
-> 게이트웨이 란이 비어 있으면 목적지 서브넷 전체가 직접 라우팅으로 도달 가능하다.
* NIC: 패킷을 전달하는 데 사용할 NIC가 어느 것인지
[18.19.100.2에 위치한 호스트 A1이 패킷을 18.19.200.2의 호스트 B1에 전달하는 과정]
1. 호스트 A1이 IP 패킷을 만든다. (수신자 주소: 18.19.200.2)
2. A1의 IP 모듈이 라우팅 테이블에서 수신자 주소를 포함하는 목적지 서브넷 중 첫번째 것을 찾는다.
-> 같은 주소가 여러 항목에 대응될 수 있으므로 순서가 중요하다.
3. A1의 제 2행의 게이트웨이는 18.19.100.1이므로 이더넷 프레임을 꾸려 18.19.100.1에 해당하는 MAC 주소로 발신한다.
4. 발신된 패킷은 호스트 R에 도착하고 도착한 프레임의 페이로드가 IP 패킷임을 감지하고 IP 모듈에 올린다.
5. 호스트 R의 IP 모듈은 패킷 수신자 주소가 18.19.200.2이므로 라우팅 테이블에서 해당 IP 주소를 포함하는 서브넷 항목을 찾는다.
6. R의 라우팅 테이블의 2행에 게이트웨이가 없으므로 직접 도달할 수 있다. IP 모듈은 NIC 1의 이더넷 모듈에 패킷을 넘겨 준다.
7. IP 모듈은 ARP 와 이더넷 모듈을 이용해 패킷을 이더넷 프레임으로 꾸려 IP 주소 18.19.200.2에 해당하는 MAC 주소를 가진 호스트로 발신한다.
8. 호스트 B1이 프레임을 받고, IP 모듈로 올려보낸다.
9. 호스트 B1의 IP 모듈은 수신자 IP 주소가 자기 것임을 확인하고 페이로드 내용을 윗단 계층으로 올려보낸다.
이들 네트워크에서 인터넷을 패킷을 보내려면 ISP로 부터 공인 IP와 게이트웨이를 제공받아야 한다.
이 때 목적지 서브넷 주소 0.0.0.0/0은 기본 주소로, 모든 IP가 이 서브넷에 포함되게 된다.
게이트웨이가 패킷을 받아 전달할 때마다 IPv4 헤더의 TTL 필드 값이 하나씩 차감되는데, 이는 패킷이 인터넷에 영원히 떠돌아다니는 것을 방지한다.
또한 NIC가 처리를 감당할 수 없을 정도로 전달해야할 패킷이 많다면, 일부가 누락될 수 있다.
따라서 IPv4를 포함하여 모든 네트워크 계층의 프로토콜은 비신뢰성의 특징이 있다.
전달 여부 및 전달 순서를 보장하지 않는다.
중요 IP 주소
1) 127.0.0.1: 루프백(loopback) 또는 로컬호스트 주소(localhost address)
패킷을 127.0.0.1로 보내려하면 IP 모듈은 외부로 패킷을 보내지 않고 해당 패킷을 윗단 계층이 처리하게 올린다.
127.0.0.0/8 전체가 루프백이긴 하지만 일부 운영체제는 127.0.0.1의 정확한 주소로만 작동하는 경우도 있다.
2) 255.255.255.255: 제로 네트워크 브로드캐스트 주소
패킷을 현재 로컬 링크 계층 네트워크의 모든 호스트로 브로드캐스트하지만, 라우터를 통해 외부로 보내진 못한다.
IPv6
앞으로 몇 년 간은 게임 개발에 있어서 IPv6의 중요성이 그렇게 크진 않다.
IPv6의 IP 주소의 길이는 128비트이고, IPv6 주소는 8묶음의 네 글자 16진수로 표현한다.