[Network] IP (Internet Protocol)

0. Internet Protocol

 다른 계층과 마찬가지로 3계층인 네트워크 계층에도 여러 프로토콜들이 존재한다. 그러나 그 중에 가장 대표적이고 널리사용되는 프로토콜은 인터넷 프로토콜, IP이다. 인터넷을 사용하는 모든 컴퓨터는 자신의 고유 주소를 가지는데, 이러한 주소를 바로 IP주소라고 한다. 따라서 인터넷에서 전송되는 모든 데이터(패킷)들은 네트워크 계층의 IP를 기반으로 송수신되고, 전송 계층의 TCP에 의해 재조립되어 메세지를 전달한다.

 

IP를 사용하여 패킷을 전달하는데는 여러가지 문제가 있다. 송신자는 수신자 서버의 상태를 알 수 없고, 전달 과정 중 패킷이 유실될 수도 있고, 큰 데이터를 여러 패킷으로 나누어 데이터를 전송하는 과정에 패킷의 순서가 뒤바뀔 수도 있다. 이러한 문제는 IP프로토콜만으로는 해결할 수 없고, TCP와 같은 추가적인 프로토콜을 사용하여 해결할 수 있다.

 

 

 

1. Datagram Format

 데이터그램이란 네트워크 계층에서 교환되는 각각 패킷들의 구성을 의미한다. 데이터그램은 각 노드(라우터)에서 라우팅 과정을 통해서 정해진 경로로 포워딩되기 때문에, 네트워크망의 상태에 따라서 다른 경로로 보내지거나 순서없이(out of order) 전달될 수 있다. 그렇기 때문에 데이터그램은 관련된 기능을 가진 헤더를 사용한다.

 

 

IP 데이터그램의 헤더

ver: IP의 버전. 현재 주로 IPv4를 사용한다.
head len.: 헤더 크기. 일반적으로 IP의 헤더는 고정헤더 20bytes에서 옵션이 붙으면 최대 60bytes이다.
length: 데이터그램의 크기. 16bits로 최대 65535(2^16-1)bytes까지 저장 가능하다.
time to live(TTL): 존재시간. 라우팅 오류 등으로 최종 목적지에 오랜시간 도착하지 못한 패킷이 자원을 먹는것을 방지
flgs, fragment offset: 패킷을 쪼개서 보내는지 여부와 순서를 알 수 있다.
header checksum: 헤더의 오류 검출
source IP address, dest IP address : 송신/수신측의 IP주소(32bits)

 

- IP Fragmentation & Reassembly

네트워크 링크는 MTU(최대 전송 사이즈)라는 전송 크기 제한을 갖고있기 때문에 패킷을 쪼개서(fragment) 전송해야 한다. 그런데 앞서 말했듯이 라우팅 알고리즘에 따라 데이터그램들의 순서가 바뀌는 등의 상황이 발생할 수 있다. 그렇기 때문에 IP헤더(의 flag, offset)를 이용하여 전송 이후에 올바르게 조립(reassemble)될 수 있게 한다.

MTU가 1500바이트인 상황에서 4000바이트(헤더 20+데이터 3980)의 데이터그램을 전송하려 하면, 한 개의 IP 데이터그램에 최대 1480바이트(데이터그램 1500바이트 - 헤더 20바이트)를 전송 가능하므로 1480+1480+1020 세 부분으로 데이터를 나누어서 보내야 한다. 이러한 경우 헤더의 flag와 offset을 사용할 수 있다. 

flag: 아직 더 보낼 데이터가 있다면 1, 아니면 0
offset: 앞서 보낸 데이터의 양(바이트)/8

위와 같이 헤더에 정보를 표기하여 전송하면, 수신측에서 올바르게 조립할 수 있게 된다.

 

 

 

 

2. IPv4, subnet

현재 가장 보편적으로 사용되고 있는 인터넷 프로토콜 버전은 v4이다.

IPv4는 32비트로 구성되어 있는데, 이것은 IPv4를 이용하면 인터넷에서 최대 2^32개의 기기에 IP주소를 부여할 수 있음을 나타낸다. 흔히 우리가 알고있는 IP주소(ex.223.1.1.1)는 이 32비트 주소를 바이트 단위로 쪼개어 10진수 표현한 것이다.

 

 이러한 IP주소는 네트워크 부분과 호스트 부분으로 나누어지는데, 말 그대로 네트워크 부분의 주소가 동일한 IP 주소는 호스트 부분의 IP주소가 달라도 동일한 로컬 네트워크에 위치하고 있음을 의미한다. 이 때 동일한 로컬 네트워크 안에 위치한 호스트들은 반드시 전송계층의 게이트웨이를 통해서 데이터를 전송한다.

 

서브넷 마스크를 이용하면 동일한 로컬 네트워크에 접속하는 호스트들의 IP대역을 외부 네트워크와 명확하게 구분할 수 있다.

16.1.1.1/8
132.147.1.1/16
221.138.62.1/24

 

위는 CIDR 표기법을 이용하여 서브넷 마스크를 표현한 것이다.

 

00010000 00000001 00000001 00000001/8
10000100 10010011 00000001 00000001/16
11011101 10001010 00111110 00000001/24

 

10진수로 표현한 IP주소들을 2진수 32비트로 나타낸 것이다. '/'뒤에 붙어있는 숫자는 서브넷 마스크의 크기(즉, 네트워크 주소의 범위)를 의미한다.

즉. 첫번째 IP(16.1.1.1/8)은 앞의 8비트는 네트워크 주소를 나타내며, 뒤의 24비트는 모두 호스트 주소를 나타내며 24비트의 호스트 주소가 바뀌어도 동일한 로컬 네트워크상에 위치한다는 것을 의미한다. 세번째 IP(221.138.62.1/24)은 앞의 24비트가 네트워크 주소를 나타내며, 뒤의 8비트만이 호스트 주소를 나타냄을 의미한다.

 

 

 

 

 

 

 

 

3. NAT(Network Address Translation)

 

 

NAT는 하나의 공인 IP주소를 여러개의 사설 IP주소로 나누어서 쓸 수 있게하는 변환 기능이다. (이 사설 IP주소는 라우터 바깥에서는 유효하지 않은 주소이다.) 라우터 등의 장비를 사용하여 하나의 공인 IP주소를 이용하여 여러 호스트가 인터넷에 접속할 수 있게 하는데, NAT기능을 탑재하는 대표적인 장비로 인터넷 공유기가 있다. 

 

 

NAT 밖에서는 마치 하나의 IP주소에 하나의 호스트가 사용하고 있는 것처럼 보이지만, NAT가 공인IP주소 사설IP주소로 변환하여 내부에서는 여러명의 호스트가 사용할 수 있다. 그런데 패킷을 주고받을때 외부에서는 한 명의 호스트와 통신하는 것처럼 보이기 때문에 외부에서 들어온 패킷을 어떤 호스트에 전달해야 할 지 구분할 수 없다.

 

이러한 문제는 NAT 내부 호스트들에 대해서 고유 포트번호를 할당해 줌으로써 해결한다. NAT 라우터는 별도의 table을 두어 사설 IP주소를 공인 IP주소로 변환하는 과정에서 사설 IP주소와 포트번호 정보를 매칭시켜 저장해 둔다. 그 이후에 외부에서 응답이 오면 NAT table에 매칭시킨 포트번호를 참고하여 올바른 호스트에게 응답이 전달되도록 돕는다.

 

적절한 NAT의 사용은 IPv4상의 한정된 IP(2^32개) 개수를 절약하고, 보안상의 이익을 가져올 수 있다.

'[ CS기초 ] > 네트워크' 카테고리의 다른 글

[Network] HTTP와 HTTPS, TLS (Transport Layer Security)  (0) 2022.04.08
[Network] Network Layer  (0) 2022.03.04
[Network] UDP, TCP  (0) 2022.02.15
[Network] Transport Layer  (0) 2022.02.11
[Network] 웹과 HTTP  (0) 2022.02.08