본문 바로가기
Learning-log -CS/Network

(컴퓨터와 네트워크) 네트워크 계층(IP, DHCP, ICMP)

by why제곱 2024. 2. 15.

본 게시물은 이석복 교수님의 네트워크 강의를 수강하며 작성한 강의노트와 추가 공부한 내용을 바탕으로 작성하였습니다.

  • 참고 강의 및 사이트

KOCW

 

KOCW

한양대학교 이석복 강의 내용 및 목표 인터넷을 동작시키는 컴퓨터네트워크 프로토폴을 학습한다. 주제분야 공학 >컴퓨터ㆍ통신 >컴퓨터공학 강의학기 2015년 2학기 수강 확인증 발급 안내 수강

www.kocw.net


네트워크 계층이란 ?

네트워크 계층을 지금까지 살펴본 애플리케이션 계층과 전송 계층 관점에서 생각해보면 네트워크란 복잡한 시스템이기 때문에 이 시스템을 잘 디자인하고 관리할 필요성이 있어서 계층화시켜놓은 것이라고 볼 수 있다. 따라서 상위 계층으로 갈수록 개념적이고 하위 계층으로 갈수록 디테일한 것이다.

애플리케이션 계층을 고려할 땐 Client와 Server가 request와 response를 주고 받는다고 할 때 데이터 유실을 고려하지 않았다.

이후 전송 계층에서는 패킷 유실 상황에 대한 대처를 다뤘다. 마찬가지로 지금까지만 해도 어떤 경로로 세그먼트가 가는 지는 논하지 않았었다. 이 부분을 바로 네트워크 계층에서 다루게 될 것이다.

네트워크 계층은 패킷을 목적지까지 배송시키는 일에 대해 관장한다. 네트워크 계층에서 이러한 일을 하는 프로토콜은 IP 인터넷 프로토콜이 있다. 네트워크 계층에서는 이 IP 프로토콜과 라우터들에서 어떤 방식으로, 어떤 경로로 패킷을 전달할 지에 대해 논하는 라우팅 알고리즘을 핵심적으로 살펴봐야 한다.

 

네트워크 계층이 하는 일

source부터 destination까지 어떤 경로로 데이터를 보낼 것인지에 대한 걸 다룬다.

라우터에서 패킷을 처음 받았을 때 하는 과정이 processing delay (패킷의 목적지를 보고 어디로 가야할 것이며, 헤더를 분석해서 에러여부를 판단하는 일)이며 패킷을 받아서 Network까지 끌어 올려 이 작업을 계속 반복하는 것이다.

 

라우터에서 하는 일

패킷이 들어오면 목적지의 방향으로 전달하는 것이다. 라우터 내의 특정 목적지를 향하기 위해서 어디로 가야하는 지에 대한 정보가 적혀있는 local forwarding table을 보고 판단해서 목적지의 방향으로 전달한다. 이 작업을 포워딩이라 한다.

 

포워딩이란, 들어온 패킷의 목적지 주소와 포워딩 테이블의 entry를 비교해서 entry의 link로 보내는 것을 말한다.

포워딩 테이블을 만들어놔야 포워딩이 가능할 것이다. 이 포워딩 테이블을 만들어 주는 것이 라우팅 알고리즘이 하는 일, 즉 라우팅이다.

그런데 포워딩 테이블을 모든 목적지별로 관리하면 너무 테이블이 커지므로 주소 범위로 포워딩 테이블을 관리한다.

실제적으로 라우터에서 하는 일은 포워딩과 라우팅으로 딱 두가지이다.

IP : Internet Protocol

이미지 출처 : 컴퓨터 네트워크(이석복) 강의자료

 

packet의 최소 단위는 40byte: packet header(20byte) + segment header(20byte) 이다. 실제 네트워크의 패킷을 보면 대부분이 40byte이다. 이러한 패킷들은 대부분 TCP ACK인 것이다.

  • time to live : 각 router를 거칠 때마다 -1을 한다. 한정된 시간 만큼만 네트워크에 존재하다가 사라지도록 하는 장치이다.
  • upper layer : upper layer는 TCP와 UDP 중 어느 것인지 명시해준다.

 

 

IPv4 Address

  • 32bit의 주소체계
  • 사람이 읽기 쉽도록 8비트씩 끊어서 10진수로 바꿔서 표현한다.
  • IP Address: host가 아니라, 머신의 interface를 지칭하며, router의 경우 interface가 여러개 있기 때문에 IP Address도 다양하다.

 

IP 주소는 어떤 식으로 배정된 걸까?

hierarchical Addressing

아무 IP 주소를 배정하면 router 내의 fowarding table이 엄청나게 커져 문제 발생한다. 따라서 계층화를 통해 IP 주소를 관리한다. 32bit의 IP 주소를 두 부분으로 나누어 앞 부분은 네트워크 id, 뒷 부분은 그 네트워크에 속한 host ID를 의미하도록 정의해놓았다. 이 앞부분을 prefix, subnet id, 네트워크 id라 부르며 IP주소 중 어디까지가 Prefix인지 알려주기 위해 항상 IP 주소와 함께 다닌다.

이와 같은 방식은 새로운 호스트가 추가될 때, router의 forwarding table이 단순해질 뿐 아니라 새로운 host를 추가할 때도 해당 네트워크에서 마음대로 host id를 지정해도 상관 없게 해준다.

 

Classful Addressing

과거에 어떤 방식으로 IP 주소가 배분됐는지 살펴보자.

Prefix를 갖더라도 네트워크 규모에 따라 크기가 달라야하기 때문에 네트워크를 배정할 때 class라는 개념을 두고 배정했다. Class A, Class B, Class C .. 로 나누어 각각 Prefix의 길이를 /8, 16, /24 로 배정했다. 그러면 각각 2^24, 2^16, 2^8 개의 host를 배정할 수 있게 된다.

이 방식은 Class 별로 배정할 수 있는 host의 규모가 달랐으며 가장 큰 규모를 가진 Class A를 획들할 수 있는 기관은 128개 뿐이다. Class별로 배정을 하는 방식은 유연하지 않고 비효율적이라 이런 방식을 개선하게 된다.

이렇게 개선한 방식이 아래의 방법이다.

 

Class Inter-Domain Routing(CIDR)

ClassLess 방식

네트워크 크기에 맞춰서 prefix 지정하는 것이 가능해져 필요한 만큼 합리적으로 나눌 수 있게 되었다.

ex) 12.4.0.0/15 ...

  • forwarding table은 prefix 단위로 엔트리가 나뉘어있다.
  • Longest Prefix Match Forwarding : Router는 패킷의 Destination IP Address를 보고 여러개 매칭되는 것 중에서 가장 길게 매칭되는 Entry로 패킷 전송한다.

 

Subnets

같은 Prefix를 가진 Device의 집합이자 Router들을 거치지 않고도 접근이 가능한 host들의 집합이다.

Router는 IP주소를 여러개 갖는데 IP주소들의 Prefix가 다 다를 수 있다. 즉, Router는 여러 Subnet에 걸쳐있으며 각각 다른 Subnet에서 서로 이동하려면 router를 거쳐야하는 것이다.

 

 

NAT (Network Address Translation)

IP주소가 32비트라는 것은 2^32개의 hosts를 지정할 수 있다는 의미이다. 하지만 현대 시대의 네트워크 규모가 커지면서 host의 개수가 IP 주소를 초과할 수 있다는 게 예견되어 1996년, IPv6 라는 새로운 버전의 주소체계가 나왔다. 이 방식은 2^128개의 host에 배정할 수 있다. 하지만 여전히 IPv4를 사용하는 중이다. 모든 router를 교체해야하는 것이 쉽지 않기 때문이다. 따라서 부족한 IP 주소를 어떤 방법을 이용해 메꾸고 있다. 그 방법으로 사용되고 있는 NAT에 대해 알아보자.

  • 하나의 공인 IP주소를 사용해 여러 대의 호스트가 네트워크에 접속할 수 있도록 하는 방식이다. 집에 인터넷 회선을 개통하여 인터넷 공유기로 여러 PC를 연결해 사용하는 방식 또한 인터넷 공유기에 NAT 기능이 탑재되어 있어 가능한 일이다.
  • host의 IP 주소는 해당 네트워크 내에서만 유일하다. 이 IP주소 그대로 라우터 외부로 나가게 된다면 수신 측은 알 수 없는 사설망의 IP주소이므로 패킷을 어디로 보내줘야할 지 알 수가 없다. 따라서 패킷을 외부로 보낼 때 기존 IP주소가 아닌 Router의 IP주소와 Router의 PORT번호까지 바꾸어준다.
  • 따라서 나갈 때 WAN/LAN 주소를 NAT translation table에 기록하고, 들어올 때 table을 보고 다시 매칭한다.
  • PORT번호를 바꿔주는 이유는 내부에서는 IP주소가 고유하지, Port번호는 고유하지 않을 수 있기 때문이다. 해당 네트워크의 호스트들이 같은 목적지와 통신하고자 할 때, 되돌아오는 패킷의 최종 목적지가 어디가 되어야하는지 모르는 혼선이 생길 수 있다. 이러한 혼선을 해결하기 위해 별도의 추가 포트번호를 설정하여 패킷을 구분하는 방식인 PAT(또는 NPAT)을 사용하게 된다.
  • 결국 들어올 때는 모두 같은 IP로 들어오기 때문에 내부에서는 port번호로 식별을 한다고 볼 수 있다.
  • 또한 NAT과정에서 패킷에 변화가 생기기 때문에 IP나 TCP/UDP의 Checksum도 다시 계산되어 재기록해야하며 이는 필연적으로 네트워크의 성능에 영향을 미치게 된다.

문제점

  • NAT방식을 이용하면 NAT테이블을 통해 기록된 내용이 있을 때만 직접 통신이 가능하다. 패킷의 요청이 내부에서 외부로 나갔다가 들어오는 것은 가능핮미ㅏㄴ 외부에서 요청 패킷이 직접 사설 네트워크 대역으로 들어오는 것은 불가능하다. 즉, Server의 역할을 하기 힘들어진다는 것이다. 기존의 PORT번호는 HOST 내부의 Processing을 찾는 데에 사용해야 하는데 NAT 방식은 Host를 찾는 용도로 사용하기 때문이다.
  • 계층화의 핵심이 무너진다는 문제가 있다. Layer로 나뉘어 있는데, 다른 Layer의 정보를 열람해보고 심지어 수정을 가한다.ex) 네트워크 계층에서 packet 내부의 segment 내부의 header의 port 번호를 열람한다. port 번호는 전달 계층에서 애플리케이션 계층으로 올라갈 때 socket을 구분하는 용도인데, IP를 구분하는 용도로 변질되고 있다.
  • ex) 네트워크 계층에서 packet header의 IP주소를 수정함

 

DHCP

 

Dynamic Host Configuration Protocol

네트워크 내의 컴퓨터에 자동으로 네임 서버 주소, IP 주소, 게이트웨이 주소를 할당해주는 프로토콜로, 해당 클라이언트에게 일정 기간 임대를 하는 동적 주소를 할당한다.

  • DHCP Server Default Port : 67
  • DHCP Client Default Port : 68

Source Discover Message를 Subenet에 존재하는 모든 Host들에게 보내되, DHCP 서버만 이 메시지를 의미있게 받아들이고 나머지 Host들은 이를 무시한다. 이는 메시지를 67번 포트로 보내고 DHCP 서버만 67번 포트를 열어두고 다른 Host들은 67번 포트를 열어두지 않아 메시지가 드랍되는 것이다.

 

Discover

새로운 Client는 Server에게 67번 포트로 IP주소를 요청한다.

 

Offer

여러 서버들이 Client의 Discover에 응답한다.

 

Request

여러 서버들 중 한 서버와 연결하고 나머지 offer를 제공한 서버들은 release 한다. 이 때 Destination에 DHCP서버로 선택한 서버의 IP주소가 아닌 브로드캐스트를 적는 이유는 내부에 DHCP 기능을 하는 서버가 여러개 있을 수 있고 Client가 선택한 DHCP 서버가 아닌 오퍼가 왔던 DHCP 서버에게도 확실히 오퍼가 선택이 안됐다는 것을 간접적으로 알려주기 위함이다.

 

ACK

연결이 되었다는 피드백을 전달한다.

 

DHCP에서 IP를 제공할 때

  • IP address / Subnet mask
  • Gateway router IP address
  • DNS Server IP address

 

IP Fragmentation(단편화), Reassembly(재조립)

네트워크 링크는 MTU(Maximum Transmission Unit)를 가진다. MTU는 링크가 수용할 수 있는 최대 전송 사이즈를 의미한다. Sender가 전송하고자 하는 데이터그램의 크기와 물리적인 링크에서 수용할 수 있는 데이터의 크기가 달라 데이터그램을 전송하지 못하는 상황이 발생한다. 이러한 문제를 해결하기 위한 방법이 “Fragmentation”이다. 데이터가 크면 MTU에 맞춰 자르는 방법이다.

아래와 같은 상황에서 IP Fragmentation이 어떻게 이뤄지는지 살펴보자.

  • 4000 byte Datagram
  • MTU : 1500byte

4000byte는 헤더 20byte와 페이로드 1980byte로 이루어져 있다. 이를 MTU인 1500byte로 쪼갤 때 각각의 fragment에도 헤더가 존재해야 하므로 20byte의 헤더와 1480byte의 페이로드로 구성되어야 한다.

따라서 1480byte, 1480byte, 1040byte의 fragment로 아래와 같이 단편화할 수 있다.

 

이미지출처: 컴퓨터 네트워크(이석복) 강의자료

 

위 사진에서 ID, fragflag, Offest은 IP가 데이터를 주고 받을 때 헤더에 표기한다.

ID는 같은 데이터그램으로부터 쪼개진 frag임을 명시하기 위해 표기한다.

fragflag는 다음 flag가 존재하는 지의 여부에 따라 1(다음 frag 존재) 또는 0(마지막 frag)이 된다.

Offset은 나누어진 데이터그램의 순서를 알아보기 위한 값이다. 그 데이터그램의 시작부분에 8을 나눈 수로 표현한다. 8로 나누는 이유는 오프셋 단위가 8이기 때문이다.

이렇게 세 조각을 받은 수신자는 Offset을 보고 순서를 맞춰 재결합하여 원래의 데이터그램으로 복원시킨다.

 

 

ICMP

Internet Control Message Protocol

사용자 데이터가 아니라 네트워크 상에서 발생한 이벤트를 알기 위한 컨트롤 메시지를 운반하기 위한 프로토콜이다.

TTL이라는 필드가 라우터 거쳐갈 때마다 감소되는데 0이 되는 라우터에서는 데이터가 Drop되게 된다. 그냥 Drop만 되버린다면 무슨 일이 발생했는지 알 수 없기 때문에 소스에게 네트워크 상의 문제를 리포트해주기 위한 메시지 필요가 필요해 나온 프로토콜이다.

데이터 부분에 이유와 데이터를 드랍했다는 정보가 들어가게 되며 네트워크 진단을 위해 많이 이용된다. Trace route utility 가 ICMP가 사용된 예 중 하나이다.

 

IPv6

Transition from ipv4 to ipv6

변화할 때 과도기는 필연적이며, 이러한 과도기에 ipv4와 ipv6로 동작하는 라우터를 기존 ipv4가 이해할 수 있게 바꿔줄 필요가 있다. 터널링 라우터들이 필요할 것이다. 버전을 다르게 쓰는 라우터에 패킷을 보낼 땐 알아볼 수 있는 헤더로 감싸서 보내는 방식을 말한다.