- 네트워크 계층은 여러 개의 노드를 거칠 때마다 경로를 찾아주는 역할을 수행한다.
- 경로를 찾기 위해 사용되는 주소로 IP 사용
- 이런 경로를 설정해 주는 것을 라우팅이라 하고, 이를 수행하는 장비를 라우터라고 부른다.
- 네트워크 대역 간에 신뢰성 있는 정보를 전송한다.
- 라우팅, 흐름 제어, 오류 제어와 같은 기능이 존재한다.
IP( Internet Protocol )
- 네트워크 계층에서 사용되는 프로토콜
- 네트워크 장치간 데이터 패킷을 전송하고 라우팅을 하는데 사용한다.
- 인터넷에서 사용되는 기본 프로토콜이다.
- 네트워크 장치에 논리 주소인 IP 주소를 부여한다.
- 패킷( Packet ) 또는 데이터그램( Datagram )이라는 전송 단위를 사용한다.
- IPv4와 IPv6 두 종류가 존재한다.
IPv4의 헤더를 살펴보자.
Version
- Internet Protocol의 버전을 나타내는 4 bit 크기의 필드
- IPv4와 IPv6 두 종류가 존재한다.
IHL( Internet Header Length )
- IP 헤더의 길이를 나타내는 4 bit 크기의 필드
- 보통은 20byte 크기고, Options 필드에 따라 변동한다.
- Word 단위로 헤더 길이를 표시한다.
TOS( Type Of Service )
- 서비스의 우선 순위를 제공 하는 1 byte 크기의 필드다
- 우선순위, 전달 지연, 처리량, 신뢰성을 설정 가능하다.
Total Length
- IP 헤더와 실제 데이터의 크기를 모두 합친 크기를 나타내는 2 byte 필드
Identification
- 보내려는 데이터에 단편화가 일어났을 경우 단편화 된 패킷을 구분하기 위한 일련번호다.
- 단편화( Fragment ) : IP 헤더의 Identification과 IP Flag, Fragment Offset을 이용하여 패킷을 나누어 보내는 작업
- 단편화 발생 시 조각을 다시 결합하기 위해 사용한다.
- 2 byte
Flags
- 단편화에 대한 정보를 알려주기 위해서 사용되는 3 bit 필드다
- 첫 번째 비트( x ) : 예비로 사용되며, 항상 0 으로 셋팅
- 두 번째 필드 DF는 단편화 유무에 대해서 표현한다.
- D( DF ) : 1 - 패킷이 목적지 까지의 경로를 따라 라우터에 의해 단편화 되지 않아야 한다는 것을 의미한다.
- 단편화를 진행하지 않기 때문에 너무 큰 패킷이 전달되면 ICMP가 Fragment needed라는 에러를 보내준다.
- 마지막 비트 값인 MF는 단편화 패킷 중 마지막 패킷인지에 대해 표현한다.
- M( MF ) : 0 - 마지막 단편화 데이터 1 - 단편화 데이터가 더 있음을 의미
Fragmentation Offset
- 8 byte 단위로 표시하며, 단편화가 이루어 지기 전 위치를 나타내는 13 bit 필드
TTL( Time To Live )
- 패킷이 살아있는 시간을 지정하는 1 byte 크기의 필드
- 여기에서의 시간은 몇 개의 라우터를 이동할 수 있는지에 대한 값
- 라우터를 지날 때 마다 1 씩 감소한다.
- TTL이 있기 때문에 라우터를 무한 순환하는 사태를 막아준다.
Protocol Identifier
- 상위 계층 프로토콜을 의미하는 1 byte 크기 필드
- 상위 계층 프로토콜이란 4계층에서 사용되는 프로토콜을 의미한다.
- 1 : ICMP, 2 : IGMP, 3 : TCP, 17 : UDP
Header Checksum
- IP 헤더 내용이 바르게 교환되고 있는지를 점검한다.
- 2 byte
Source address
- 발신지의 IP 주소로 4 byte 크기의 필드
Destination address
Options
- TOS 필드 처럼 특별한 처리 옵션을 정의 가능
- 보안기능, QoS, 라우팅 등
Data( Payload )
- 상위 계층의 데이터에 따라 최대 65535 byte의 크기를 가진다.
- 일반적으로 MTU 크기 까지 가능하다.
- MTU( Maximum Transmission Unit ) : 최대 전송 단위
단편화
- 커다란 패킷을 나누어 보내는 작업
- IP 헤더의 Identification과 IP Flags, Fragment offset을 이용한다.
패킷을 나눠 보내는 이유
택배를 받을 때 택배는 커다란 트럭에 담아져서 오게 된다. 트럭은 최대 적재량이라는 것이 있다.
최대 적재량이란 트럭에 가득 실을 수 있는 무게가 되는데, 이러한 개념이 네트워크에도 있다.
- MTU( Maximum Transmission unit )라는 최대 전송 단위가 존재한다.
- 2계층의 데이터 링크에서 하나의 프레임 또는 패킷에 담아 운반 가능한 최대 크기를 의미한다.
- Ethernet의 경우 기본 값이 1500 Byte 다.
정리하면 데이터 링크( 2계층 )에서 전송 가능한 크기가 있기 때문에 상위 계층인 네트워크 계층( 3계층 )에서
단편화를 이용해 패킷을 전송하게 되는 것이다.
MTU 확인
- netsh interface ipv4 show interface 명령을 통해 MUT를 확인할 수 있다.
MTU가 1500 byte 이며, 168 byte의 데이터를 보낼 때 IP Header를 살펴보자.
Total Length : 패킷의 총 길이는 168 byte이므로 단편화 필요가 없다.
Identification : 식별 값을 111로 설정한다.
Flags : 0으로 설정하여 패킷이 단편화 되어 있지 않다는 것을 나타낸다.
Fragment Offset : 단편화 된 패킷이 아니기 때문에 Offset은 0으로 설정한다.
MTU가 1500 byte 이며, 4000 byte의 데이터를 보낼 때 IP Header를 살펴보자.
위 그림 같은 패킷을 전송할 수 있을까?
Total Length가 1500 byte를 초과하여 전송하기 위해서 단편화가 필요하다.
단편화 과정을 알아보자.
- MTU가 1500 Byte 이며, 4000 byte의 데이터를 보낼 때 IP Header
- 총 패킷 길이 : 4000 byte
- IP Header 20 byte + Payload 3980 byte
- 단편화 시켜야 하는 Payload : 3980 byte
- 첫 번째 단편 : MTU 1500 byte 크기
- IP Header 20 byte + Payload 1480 byte
- Length : 1500 byte
- Flag : 1 ( 뒤에 데이터가 남아 있는 패킷이 있음 )
- Offset : 0
- 남은 데이터 : 2500 byte
- 두 번째 단편 : MTU 1500 byte 크기
- IP Header 20 byte + Payload 1480 byte
- Length : 1500 byte
- Flag : 1 ( 뒤에 데이터가 남아 있는 패킷이 있음 )
- Offset : 이전 단편들의 Payload / 8
- 1480( 첫 번째 데이터 크기 ) / 8 = 185
- 세 번째 단편 : 남은 데이터
- IP Header 20 byte + Payload 1020 byte
- Length : 20 byte + ( 3980 - 1480 - 1480 ) byte / 20 byte + 1020 byte
- Flag : 0 ( 뒤에 데이터가 남아 있는 패킷이 없음 )
- Offset : 이전 단편들의 Payload / 8
- ( 1480 + 1480 ) / 8 = 370
IP Header는 각각의 요소가 중요한 의미를 가지고 있어 2계층의 스위치처럼 상위 6 byte만 읽고 전달하는 것이 아닌 헤더 전체를 해석한 이후에 패킷을 전달하게 된다.
IP 주소
- IPv4는 8 bit의 수 4개, 4 byte로 구성
- IPv6는 16 bit의 수 8개, 16 byte로 구성
IPv4 주소
- IPv4의 주소 체계는 8 bit의 수 4개로 32 bit ( 4 byte )다.
- IP Header를 확인하면 Source 및 Destination 주소가 4 byte임을 알 수 있다
- 모든 비트가 0일 때 부터 모든 비트가 1일 때까지 표현이 가능하고 그 개수는 2^32( 43억개 )다.
- 4 byte, 즉 32bit로 표현하게 되면 11000000101010000000000001100100와 같다.
2진수가 이어진 형태의 IP 주소는 너무 보기도 어렵고, 사용하기 어렵기 때문에 이를 해결하고자 나온 표기법이
Dot-Decimal notation이다.
Dot-Decimal notation
- 점으로 구분한 십진수 표기법이다.
- 10진수 문자열로 구성되며 각 옥텟( 8개의 비트 모임 )을 점으로 구분한 표기법이다.
- aaa.bbb.ccc.ddd와 같이 표기한다.
11000000101010000000000001100100을 Dot-Decimal notation으로 변환하여 보자.
위 그림의 192.168.50.139에 핑을 보냈을 때와 3232248459에 핑을 보냈을 때 결과가 동일한 것을 확인할 수 있다.
네트워크 부와 호스트 부
- IP 주소는 어떤 네트워크의 호스트( 누구, 어떤 PC인지 )를 식별하는 주소다
- IP는 네트워크 주소를 의미하는 네트워크 ID와 호스트 ID로 구성된다.
- 다른 네트워크와 구분하는 역할을 네트워크 ID로 한다.
- 해당 네트워크의 어느 호스트인지를 나타내는 역할을 호스트 ID로 한다.
- 호스트는 컴퓨터 뿐안 아니라 IP 주소가 할당되는 라우터도 포함된다.
- 호스트 ID는 네트워크에 속한 호스트 중에서 고유한 값을 가지고 있어야 한다.
- 네트워크 ID도 인터넷에 접속되어 있는 네트워크 중에서 고유해야 한다.
과거에는 클래스를 기준으로 네트워크 부와 호스트 부를 나누는 방식을 사용했지만,
현재는 서브넷마스크를 통해 네트워크 부와 호스트 부를 구분하는 CIDR이라는 기법을 사용하고 있다.
서브넷 마스크와 IP 주소를 AND 연산하여 나온 값이 네트워크 부가되고, 나머지 0 부분이 호스트 부가 된다.
위 그림에서는 192.168.56이 네트워크 부가되고 마지막 부분이 호스트 부가 들어올 수 있는 범위가 된다.
즉, 192.168.56.0 ~ 192.168.56.255 까지의 범위가 호스트가 할당받을 수 있는 IP가 된다.
이처럼 서브넷 마스크를 통해 네트워크 부와 호스트 부를 구분할 수 있고,
Prefix로 표현하면 192.168.56.1/24와 같이 표기할 수 있다.
이때 24는 서브넷 마스크를 2진수로 나타냈을 때 연속된 1의 개수다.
IP 클래스
- 과거에 각각의 네트워크 대역에 Class라는 개념을 도입해서 목적과 상황에 따라 IP를 분류 하였다.
- 하지만 호스트의 수가 늘어나며 턱없이 부족해지는 IP의 수로 인해 더이상 사용하지 않고, 지금은 CIDR 방식을 사용하여 IP를 분류하고 있다.
- IP 클래스에 대해서는 '과거에 이런 기준을 통해 IP를 분류하였구나' 정도로 생각하고 넘어가면 된다.
IP를 할당받을 때 사용할 수 없는 호스트 주소가 있다.
특수 목적을 위한 IP 주소
- 호스트 ID가 전부 1로 채워진 IP와 0으로 채워진 IP는 사용할 수 없다.
호스트 ID가 전부 0인 IP
- 네트워크 주소를 의미하며 해당 네트워크를 대표하는 주소의 의미이기 때문에 사용이 불가능하다
- ex) 192.168.56.0
호스트 ID가 전부 1인 IP
- Broadcast 주소로 전체 네트워크에 데이터를 전송할 때 사용
- ex) 192.168.56.255
- 192.168.56.255로 데이터를 전송하면 192.168.56.0의 네트워크에 있는 모든 호스트가 데이터를 수신
라우팅
- 네트워크에서 통신 데이터를 보낼 때 최적의 경로를 선택
- 출발지로부터 최종 목적지까지 논리적으로 주소가 부여된 패킷의 전달 과정
소프트웨어를 이용한 라우팅
하드웨어를 이용한 라우팅
route print -4 명령어를 cmd에 입력하면 라우팅 테이블을 확인할 수 있다.
위 그림은 네트워크 대상에 0.0.0.0, 네트워크 마스크에 0.0.0.0이 입력되어 있는데 이는 모든 IP 패킷을 의미하게 된다.
192.168.50.139 인터페이스로 오는 모든 IP 패킷을 게이트웨이 192.168.50.1에 보내라는 의미를 가지고 있다.
라우터를 통해 패킷이 들어오면, 라우터의 인터페이스로 수신한 패킷의 목적지 IP에 따라 라우터는 어떤 인터페이스를 통해 전송할지를 결정한다. 또한 라우터는 네트워크 보안이나 QOS 등의 기능도 제공한다.
네트워크 계층에서 라우팅을 해주는 라우터는 서로 다른 네트워크 대역의 경로를 설정해 줘야 하기 때문에 연결된 네트워크의
수만큼 IP가 필요하게 된다.
네트워크 계층 프로토콜 ( TCP, IP를 제외한 )