BOBO's Note

Network Layer (1) - DHCP, NAT 본문

Network

Network Layer (1) - DHCP, NAT

bobo_hee 2020. 7. 23. 02:43

Network Layer

네트워크 계층은 단말기 뿐만 아니라 라우터, 스위치 등 모든 네트워크 노드가 갖고 있는 계층이다. 네트워크 계층은 크게 2가지 기능을 한다.

  • Forwarding: 패킷을 노드 외부로 내보낸다. → Data Plane (전송부)
  • Routing: 목적지까지의 경로를 결정한다. → Control Plane (제어부)

 

전통적인 네트워크 구조에서는 각 라우터마다 전송부와 제어부를 갖는다. SDN(Software Defined Network)에서는 각 라우터가 전송부만 가지고, 제어부는 중앙 컨트롤러에 통합된다.

 

IP Fragmentation / Reassembly

네트워크 링크는 최대 전송 크기인 MTU(Maximum Transmission Unit)을 갖고 있다. 따라서 이보다 큰 segement는 네트워크 계층에서 여러 datagram으로 쪼개서 전송하는데, 이 과정을 fragmentation이라고 한다. 반대로 쪼개진 datagram을 하나의 segment로 합치는 과정을 reassembly라고 한다.

 

fragmentation과 reassembly를 위해 IP 프로토콜은 헤더에서 identification, flag, offset 필드를 가진다.

  • identification: 파편화된 datagram이 하나의 segment를 이루는지를 식별하기 위한 값이다.
  • flag: set되어 있으면, reassemble 해야 하는 datagram이 더 남아있다는 의미이다. 가장 마지막 segment는 flag가 unset되어 있다.
  • offset: 전체 segment에서의 해당 datagram의 offset, 바이트 단위의 offset을 8로 나눈 값을 저장한다.

 

 Subnet

같은 서브넷에 속하는 노드끼리는 라우터없이 바로 통신할 수 있다. 

 

Subnet Mask

서브넷 마스크는 IP 주소 4바이트 중 네트워크 주소와 호스트 주소를 구분하기 위한 비트이다. 서브넷 마스크를 이용하면 같은 서브넷에 속하는지 판단할 수 있다. 예를 들어 서브넷 마스크가 /24 (=255.255.255.0)이라면, 같은 서브넷에 속하는 노드는 IP 주소의 상위 3바이트가 일치한다.

 

DHCP

Dynamic Host Configuration Protocol의 약자로, 동적으로 IP 주소를 할당하는 프로토콜이다. DHCP는 4단계(4-way)로 동작한다.

  1. DHCP discover: 호스트가 DHCP 서버를 찾기 위해 broadcast한다.
  2. DHCP offer: 응답할 수 있는 DHCP 서버가 할당할 수 있는 IP 주소를 담아 호스트의 메세지에 응답한다.
  3. DHCP request: 호스트가 해당 DHCP 서버에 받은 IP 주소를 사용하고 싶다고 요청한다.
  4. DHCP ask: DHCP 서버가 호스트의 요청에 응답한다.

DHCP 동작 방식

 

NAT

Network Address Translation의 약자로, private IP를 public IP로 변환하는 프로토콜이다. DHCP는 호스트에게 해당 서브넷에서 사용가능한 private IP 주소를 제공하는데, private IP는 그 범위 내에서만 사용할 수 있다. 따라서 외부 네트워크의 노드와 통신하기 위해서는 public IP로 변환하는 작업이 필요하다. 

 

NAT 라우터는 outgoing 패킷의 src IP 주소와 port 번호를 자신의 IP 주소와 port 번호로 바꾸어서 내보낸다. 그리고 이러한 매핑 정보를 NAT translation table에 기록한다.

 

이후 incoming 패킷의 dest IP 주소와 port 번호를 NAT translation table을 참조해 내부 IP 주소 및 port 번호로 변환하여 들여보낸다.

 

(+): IPv4의 주소 부족 문제를 해결할 수 있다(여러 호스트가 하나의 public IP 사용).

(+): 외부로부터 내부 호스트들을 보호할 수 있다.

(-): NAT를 제공하는 노드가 망가지면 외부와 통신할 수 없다.

(-): 내부 호스트들이 많아질수록 오버헤드가 커져 성능이 저하된다.

NAT Traversal

NAT는 내부 호스트에서 먼저 패킷을 내보낸 후에야 외부에서 패킷을 보낼 수 있다는 문제점이 있다. 즉, 외부에 있는 호스트에서 먼저 패킷을 보내고 싶어도 보낼 수 없다.

 

이 문제를 해결하기 위한 방법엔 여러가지가 있는데, 이러한 방법들을 NAT traversal이라고 한다. 편의를 위해 (호스트 B) → (호스트 A)로 먼저 패킷을 보내고 싶다고 가정하자.

 

방법 1. Static Entry

호스트 A가 DHCP로 IP를 할당받지 않고, 고정 IP를 사용한 후 NAT translation table에 static한 엔트리를 추가함으로써 해결할 수 있다.

 

외부의 호스트 B는 미리 알고있는 IP 주소 및 port 번호로 패킷을 전송하면, NAT는 static 엔트리를 참조하여 알맞게 변환한 후 포워딩해준다.

 

이 방법은 호스트 A의 public IP 주소와 port 번호가 잘 알려진 호스트의 경우만 사용할 수 있다는 한계가 있다.

 

방법 2. Connection Reversal

제3의 서버에 호스트 A의 public IP 주소 및 port를 등록해둔다. 호스트 B는 제3의 서버에 connection을 요청하면, 제3의 서버가 호스트 A에게 이 요청을 포워딩한다. 그러면 호스트 A는 호스트 B에게 역으로 먼저 connection을 요청한다.

 

이 방법은 결국 호스트 B가 곧바로 A에게 패킷을 보낼 순 없다는 한계가 있다. 또한 호스트 B의 IP 주소 및 port 번호가 잘 알려진 경우에만 사용할 수 있다.

 

방법 3. Relaying

제3의 서버가 호스트 B의 패킷을 호스트 A에게 그대로 포워딩해주는 방법이다. 그렇지만 제3의 서버가 관리하는 클라이언트가 많아질수록 서버의 부하가 증가한다.

 

이 방법은 호스트 A와 B 모두 서로의 IP 주소 및 port 번호를 모르더라도(잘 알려진 경우가 아니더라도) 사용할 수 있다.

 

방법 4. UDP Hole Punching

TCP가 아닌 UDP 통신을 함으로써 호스트끼리 직접 통신하는 방법이다. 이 방법 역시 처음엔 제3의 서버가 필요하다. 모든 호스트들은 제3의 서버에 자신을 등록해둔다. 그 후, 호스트 B에서 제3의 서버에 호스트 A의 public IP 주소와 port 번호를 요청해 알아낸다. 이후, 호스트 B는 이 정보를 그대로 이용해 호스트 A에 접속한다.

 

TCP는 point-to-point 통신이기 때문에 호스트 A와 제3의 서버 사이의 port 번호를 알더라도 호스트 B가 이 port로 A에게 패킷을 보낼 수 없다. 그렇지만 UDP는 가능하다!

 

이 방법은 호스트 A, B의 IP 주소 및 port 번호가 잘 알려진 경우가 아니더라도 직접 통신할 수 있다는 장점이 있다.

'Network' 카테고리의 다른 글

Transport Layer (2) - Reliable Data Transfer  (0) 2020.07.23
Transport Layer (1)  (0) 2020.07.22
Application Layer (4) - P2P  (0) 2020.07.20
Application Layer (3) - Web Cache, DNS, CDN  (0) 2020.07.20
Application Layer (2) - HTTP  (0) 2020.07.20
Comments