ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 네트워크: Network Layer 정리2(IPv4, DHCP, NAT, SDN...)
    네트워크 2020. 10. 24. 18:36
     

    네트워크: Network Layer 정리(forwarding, routing, control plan, SDN...)

    이번 포스팅부터는 네트워크 계층에 대해서 다룬다. 네트워크 계층이 어떤 일을 하는지 알아보자 < 네트워크 계층(Network Layer) > 전송계층에서는 segment라는 패킷단위를 다루었다면 네트워크 계층

    seungjuitmemo.tistory.com

    이번 포스팅은 지난 포스팅에 이어서 전송 계층의 IP 인터넷 프로토콜에 대한 자세한 내용과 

    Control plane에 대해서 다룬다. 

     

     

     

    IP에 대해 알아보기 앞서 Network layer에서는 크게 routing 프로토콜, ip 프로토콜, icmp 프로토콜들이 사용된다.  

     

     

    라우팅 프로토콜을 통해 packet을 경로를 선택하고 

    IP프로토콜을 통해 packet을 datagram의 형태로 만들며 

    ICMP프로토콜을 통해 에러를 기록한다. 

     

    전송계층에서 네트워크 계층으로 내려온 segment는 IP 헤더가 추가적으로 붙어

    datagram의 형태로 패킷을 주고 받는다. 

     

     

     

     

    다음은 데이터 그램의 포맷이다. 

     

    < IPv4 Datagram Format >

     

    위에서부터 6줄은 ip header이며 그 밑 부분은 segment이다. 

     

     

     

    - ip header: IP 헤더는 한줄당 32bits = 4bytes, 5줄이므로 4 x 5 = 20bytes이다.

    만약 TCP/IP라 한다면 segment의 헤더까지 합쳐서 20bytes + 20bytes = 40bytes가 된다. 

    - time to live: datagram의 수명으로 라우터를 돌 때마다 datagram의 수명이 줄어든다.

     수명이 줄어들지 않으면 계속 순환해서 문제가 된다. 

    - length: total datagram length를 표시

    - fragment offset: IP data를 분할해서 보내기 위한 부분

     

     

     

     

    < IP fragmentation, reassembly >

    각각의 네트워크 링크들은 링크에서 최대로 보낼 수 있는 사이즈 MTU(Max Transfer Size)를 가지고 있다.

     

    당연히 링크 타입마다 다른 MTU를 갖고 있으며 이 MTU에 따라 IP datagram은

    여러개의 datagram으로 분할(fragmentation)되고 마지막 목적지 노드에서 합쳐(reassemble)진다.

     

    ※ 중간에 reassemble 됐다가 fragmentation되지 않는다.

     

     

     

    그렇다면 datagram은 어떻게 fragmentation 될까?

     

    다음 예시를 통해 4000 bytes의 datagram이 MTU가 1500bytes인 링크를 통해 전송될때

    어떻게 fragmentation되는지 알아본다. 

     

     

    1) length

    우선 4000bytes의 datagram은 3980 bytes의 데이터와 20bytes의 header로 구성된다.

    (실질적인 데이터 length는 3980bytes인 것이다)

     

    MTU를 고려하여 분할하면 마찬가지로 header의 비트를 생각하여 

    각각 1480 bytes까지 수용가능하다. 

     

    따라서 1480 + 1480 + 1020 = 3980으로  각각 fragmentation은 

    이 수치에 각각 20씩 더한 값을 length로 갖는다. 

     

     

    2) ID

    모두 같은 datagram에서 fragmentation이 되었을 때 같게 표시한다. 

    위의 경우는 같은 datagram의 경우 x로 표시 

     

     

    3) fragflag

    마지막 fragmentation의 fragflag만 0, 그 외는 1로 표시한다.

     

     

    4) offset

    각각의 분할된 datagram의 시작 bytes를 8로 나눈 값이다.

     

     

     

     

    3. IP Addressing

     

    IP 주소를 이해하기 위해서는 subnet에 대한 이해가 필요하다. 

     

    다음 그림을 보면서 subnet을 이해해보자. 

     

     

    우선 라우터는 여러개의 interface를 가지고 있고 인터페이스 마다 파란색으로 영역이 나누어진다. 

     

    이렇게 파란색으로 나누어진 영역들이 서브넷이라는 영역인데 서브넷이 같은 호스트들은

    라우터의 개입 없이 정보를 주고 받을 수 있다. 

     

    여기서 IP대역들을 자세히 살펴보면 subnet part host part로 나뉘는데

    위 그림에서는 233.1.1.1이라는 IP가 있을 때 했을 때 223.1.1까지가 subnet part(high order bits),

    뒤의 1은 host part (low order bits)로 사용되고 있다.  

     

    IP 대역에서 어디까지가 서브넷 파트고, 어디까지가 호스트파트인지 구분하기 위해 서브넷 마스크를 이용한다.

     

    전체 32비트중 앞부분 24비트가 subnet에 해당된다는 의미로 서브넷에서는 25번째 비트부터 값을 쓸 수 있다. 

    즉 25~ 32번째 비트까지 값을 쓸 수 있으며 256까지의 경우가 나온다. 

     

     

     

    ※ 호스트의 인터페이스는 몇개?

     

    호스트는 라우터와 연결되기 위해서 마찬가지로 한개 또는 두개의 인터페이스를 가지고 있다.

    CLI 창에서 ip address에 대한 커맨드를 입력해보면 eth0와 같은 것들이 보이는데 

    이런것들이 네트워크 인터페이스에 해당한다. 

    (wired Ethernet, wireless 802.11)

     

     

     

    ※ 몇개의 subnet?

     

     

    라우터와 호스트가 연결된 subnet 3개,

    router간 연결된 subnet = 3개로 총 6개의 subnet을 갖는다.

     

     

     

     

    < CIDR(Classless Inter Domain Routing) >

     

    간단하게 말하면 좀 더 세밀한 서브넷 마스크라고 생각할 수 있다.

     

    기존의 IP주소의 subnet mask는 8, 16, 24였다.

     

    subnet mask가 8이라면 2의 24제곱만큼의 공간,

    subnet mask가 16이라면 2의 16제곱만큼의 공간,

    subnet mask가 24이라면 2의 8제곱만큼의 공간이 생긴다.

     

    하지만 이는 공간이 너무 적거나 너무 많기 때문에

    다음과 같이 임의로 subnet mask를 정한다. 

     

    상위비트부터 23비트까지를 subnet mask로 정하여 내가 원하는 만큼 공간을 할당할 수 있는 것이다.

     

     

     

     

     

    < How to get IP address >

     

    이전에는 시스템 관리자에게 말해 호스트에게 수동으로 IP를 부여했다. 

     

    하지만 이는 너무 귀찮은 방법으로 현재는 

    DHCP(Dynamic Host Configuration Protocol)을 통해 IP를 동적으로 할당 받는다. 

     

     

     

     

    다음은 DHCP 서버가 IP주소를 할당 받는 과정이다. 

     

     

    - DHCP discover: client가 subnet에 도착하면 broadcast 방식으로 DHCP 서버가 있는지 물어본다.

    - DHCP offer: DHCP server는 client에게 IP주소를 제공한다. 

    - DHCP request: client는 server에게 IP address를 사용하겠다고 전달한다.

    - DHCP ACK: server는 client에게 ACK를 보내 확인메시지를 보낸다. 

     

     

     

     

     < IP address에서 subnet part나누기 >

     

    다음과 같은 ISP subnet이 있다고 할때 ISP와 연결된 8개의 기관에 subnet을 할당하고 싶다. 

    어떻게 해야할까?

     

     

    3bits를 이용하면 8개의공간의 담을 수 있으므로 ISP로부터 받은 IP주소를

    상위 21번째 비트부터 23번째 비트까지를(000부터 111까지를) subnet으로 만든다.

     

    이렇게 기관들에게는 24번째 비트부터 32번째 비트까지의 대역이 서브넷으로 할당되어 

    총 2의 9승만큼의 IP를 사용할 수 있다.  

     

     

     

     

    < NAT(network address translation) >

     

     

    좌측이 global한 주소, 우측이 private한 주소

    전 세계의 IP주소는 unique해야 서로 식별이 가능해진다. 

     

    하지만 모든 컴퓨터에게  unique한 주소를 부여하기에는 ip가 부족하기 때문에 private IP를 이용한다. 

     

    그래서 내부 네트워크에서 외부 네트워크로 나갈때는 public한 주소를 이용하여

    외부에서 138.76.29.7로 활동하고 내부에서는 10.0.0.x를 이용해서 통신하는 것이다.  

     

    이러한 방식의 통신을 가능케하는 것이 NAT인데 다음을 통해 NAT를 이해해보자.

     

    호스트 10.0.0.1이 128.119.40.186:80으로부터 무언가를 받아오고 싶다.

     

    어떤 과정을 거쳐야 할까? 

     

     

    1. 호스트는 128.119.40.186, 80으로 packet을 보내는데 임의의 포트번호(3345)를

    지정해서(10.0.0.1, 3345) NAT라우터로 보낸다.

     

    2. 라우터는 NAT table을 이용하여 IP주소를 138.76.29.7, 5001로 바꾸어

    128.119.40.186, 80로 패킷을 전송한다.

     

    3. 패킷을 받은 서버(128.119.40.186, 80)는 source router(138.76.29.7, 5001)로 패킷을 보낸다. 

     

    4. 패킷을 받은 라우터는 NAT translation table의 기록된 LAN side address로 

    translation해서  호스트(10.0.0.1, 3345)로 패킷을 보낸다. 

     

     

     

     

    < IPv6 >

     

    private ip를 부여함으로써 IP 부족 문제가 해결된 줄 알았지만 여전히 ip는 부족하다. 

    그래서 이제는 IPv4가 더이상 배정이 안된다고 한다. 

    이러한 ip부족 문제를 해결하기 위해 IPv6를 도입하였고, 

    IPv6는 IP address(32bits)의 4배인 128 비트의 주소를 갖는다. 

     

     

    IPv6의 Datagram format

     

    - header 사이즈 = 40bytes 크기 

    - next header를 달아 data의 상위 레이어 프로토콜을 알 수 있게 하였다. 

    - ICMPv6: 기존의 IPv4에서는 fragmentation하여 패킷을 보냈었다면,

    IPv6는 패킷을 fragmentation하지 않고, "Packet Too Big"이라는 메시지를 보내고

    이를 받으면 sender가 패킷을 줄여서 보내게 된다.

     

     

    IPv6를 이용하면 IP부족 문제는 해결되지만 사실상 현재 사용되는 대부분의 라우터는

    IPv4전용이므로 이를 모두 대체하기는 힘들다. 

     

    그러면 여기서 의문이 생긴다.

     

    대부분이 IPv4 라우터를 사용하고 있다면 IPv6는 사용 못하는 것 아닌가?

     

    이러한 문제는 터널링(Tunneling)을 이용하여 해결한다. 

     

     

     

    Tunnerling이란 기존의 네트워크 중 IPv4를 사용하는 곳이 많기 때문에 IPv6를 

    IPv4에 pay load형태로 담아서 보내는 것을 의미한다.

     

    Tunneling

     

     

    Tunnerling

     

     

     

     

    이제부터는 라우팅을 효율적으로 하기 위해 라우팅 프로토콜이 어떤식으로 구성되는지 알아본다.  

     

    < Generalized Forwarding and SDN >

     

    이전 포스팅에서 SDN에 대한 소개 정도만 했었는데 이번에는 좀 더 구체적으로 알아보자.

    (참고로 SDN은 아주 유망한 기술이라고 한다.)

     

     

     

    우선 SDN방식은 Control plane의 remote controller에서 flow table을 만들고 

    각각의 라우터들에게 flow table을 내려준다.  

     

    그리고 여기서 flow table을 만들 때는 다음과 같은 사항을 고려하여 만든다. 

     

    OpenFlow data plane abstraction

     

    1) pattern: header fields의 패턴과 받은 패턴을 match 시킨다.

    2) Action: 받은 패턴에 따라 drop, forward, modify등의 동작을 수행한다.

    3) priority: 패턴이 여러개라면 어떤것들이 우선순위가 높은 순으로 처리

    4) counters: 지금까지 받은 패킷의 바이트 갯수는 몇개인지 기록

     

    예를 들어 다음과 같은 경우가 있다. 

     

     

    이렇게 각각의 라우터들은 들어온 패턴에 대해서 어떻게 해야할지(match + action)

    flow table을 가지고 있다.

     

    위의 방식을 이용하여 flow table을 만들면 다음과 같은 역할을 할 수 있다. 

     

    match-action

    이렇게 하나의 SDN라우터는 다양한 기능을 수행할 수있다.

     

    반응형

    댓글

Designed by Tistory.