들어가기 앞서
해당 글은 널널한 개발자님의 인프런 강의 '외워서 끝내는 네트워크 핵심이론 - 기초'의 section3를 보고 공부한 내용을 정리한 글입니다.
IPv4 주소
IP 주소는 IPv4와 IPv6로 나눌 수 있다. IPv4는 보다 고전적인 형식의 IP 주소, IPv6는 IPv4를 보완하기 위해 나온 새로운 IP 주소이다. IPv6가 세상에 나온 계기는 전세계 상의 호스트(네트워크를 이용하는 컴퓨터)의 수가 IPv4가 감당할 수 있는 범위보다 많아졌기 때문이다. 해당 글에서는 IPv6에 대해서는 별도로 언급하지 않고 IPv4에 대해서만 살펴보도록 하겠다.
IPv4는 32bit 주소 체계를 사용하며 주로 8bit를 4개로 나누어 가운데 점(.)을 두어 각각의 8bit를 구분한다. 8bit는 비트 값으로 0000 0000인 십진수 숫자 0부터, 비트 값으로 1111 1111인 십진수 숫자 255까지 총 256개의 경우의 수를 가지고 있어 IPv4 주소체계로 표현할 수 있는 모든 주소의 수는 256의 4제곱이 된다.
IPv4 주소는 네트워크 ID와 호스트 ID를 갖는데 네트워크 ID는 라우터 등으로 얽혀 있는 LAN 등 특정 네트워크의 집합적인 위치를, 호스트 ID는 네트워크 ID를 공유하는 각각의 호스트의 위치를 가리킨다. 비유하자면 네트워크 ID는 택배 시의 주소, 호스트 ID는 상세주소 격이다. 네트워크 ID는 '경기도 ... ㅇㅇ아파트' 정도, 호스트 ID는 '102동 1402호' 정도인 느낌.
패킷
L2 수준의 데이터 단위가 Frame이라면 L3 수준에서는 패킷(Packet)이 데이터를 전송하는 기본 단위이다. Packet은 L3 IPPacket 이라고 표현할 수도 있으니, 패킷을 떠올릴 때는 항상 L3 계층을 함께 생각하도록 하자.
Frame과 마찬가지로 패킷 또한 Header와 데이터를 담는 Payload로 나뉘고, 전송 시 가능한 최대 크기를 MTU(Maximum Transmission Unit, 최대 전송 단위)라고 한다. MTU는 통상 1500 bytes를 의미하지만 필수적인 스펙은 아니어서, 어떤 패킷의 MTU는 1400 바이트일 수도, 4000일 수도 있다. 이와 같은 MTU의 차이는 후에 기술할 단편화 기술의 원인이 되기도한다.
패킷을 택배 시스템에 비유하자면 택배 상자 정도로 비유할 수 있다. 택배를 담고, 그 위에 송장을 붙여 출발지 주소, 도착지 주소, 송신인, 수신인의 이름을 확인할 수 있는 택배 상자 말이다. 송장은 패킷의 Header에 비유할 수 있다.
Encapsulation과 Decapsulation
Encapsulation과 Decapsulation는 각각 캡슐화, 역캡슐화를 의미한다. 마찬가지로 택배로 비유를 하자면 전자인 Encapsulation은 택배 물건을 택배 박스에 담고, 택배 박스를 트럭 위에 싣는 과정을, 후자인 Decapsulation은 택배 트럭에서 택배 상자를 내리고, 택배 상자에서 택배를 꺼내는 과정이라고 생각하면 된다.
네트워크에서는 애플리케이션 단, 그리고 소켓 수준에서의 stream이 TCP와 IP 레이어에서 각각 segment, packet으로, 그리고 이더넷 등의 L2 계층에서 Frame으로 변경되는 것을 encapsulation, 그리고 반대의 과정으로 데이터가 stream으로 바뀌는 과정을 decapsulation이라고 한다.
참고로 encapsulation이 된 frame은 내부에 패킷과 세그먼트 등을 가지고 있는데, 이러한 관점에서 본 frame의 모습은 아래와 같다.
패킷의 생성과 전달 그리고 소멸
패킷의 생성
- 컴퓨터의 저장장치(HDD, SSD)에서의 데이터(File)이 Process를 통해 소켓으로 들어온다. (Socket이라는 커널 모드로 접근 가능한 파일에 해당 데이터를 write. 네트워크에서는 소켓에 send 한다고 표현)
- 이 때의 데이터는 stream 형태이고, stream 형태의 데이터가 소켓에서 TCP/IP 단으로 넘어가며 패킷으로 캡슐화 된다.
- 데이터의 형태는 대략 다음과 같이 변경된다. (File -> stream -> segment -> packet)
패킷의 전달
- L3 단에서 생성된 패킷은 NIC 드라이버를 통해 L2로 들어가 frame 형태로 캡슐화 된다.
- 이후 NIC -> L2 Access 스위치 -> L2 Distribution 스위치 등의 순서를 통해 게이트웨이인 라우터로 업링크 되어 인터넷으로 흘러 들어간다.
- 방대한 인터넷 환경에서, 한 라우터에서 다른 라우터로, 다시 다른 라우터에서 또 다른 라우터로 frame이 전달되며 목적지로 이동한다. (목적지로 향하는 근거는 패킷에 적혀 있는 목적지 IP 주소)
패킷의 소멸
- 목적지에 도착한 패킷은 다시 L2 계층에서부터 하나하나 역캡슐화를 거치며 L3, L4 계층으로 이동한다.
- 그 중 L3 계층에 도착하면, 목적지 호스트의 운영체제에 의해 패킷이 역캡슐화 되며 패킷이 소멸한다.
- 패킷을 소멸하는 주체가 운영체제인 것은 L3가 커널 모드에 있기 때문이다. (커널은 운영체제가 관리)
IP 헤더의 형식
IP 헤더는 일반적으로 20bytes를 갖는다. IP 헤더는 패킷의 헤더를 의미하고 위의 그림에서 20 Bytes라고 적힌 1번 행부터 5번 행까지가 IP 헤더라고 생각하면 되겠다. 각각의 행은 32bit로 이루어져 있고 4비트씩 쪼개 헤더의 정보가 할당되어 있다. 첫 번째 행부터 다섯 번째 행까지 나타나는 헤더의 정보는 다음과 같다.
첫 번째 행
- version : 해당 IP의 버전을 말한다. (v4, v6)
- IHL : Internet Header Length로 IP 헤더의 길이를 말한다. 일반적으로 20bytes
- TOS : Type of Service. 서비스의 우선 순위를 제공한다. 보통 / 비용최소화 / 신뢰성 최대화 / 보안 최대화 등이 있다.
- Total Length : 패킷의 길이를 의미한다. 2의 16제곱까지 가능하기 때문에 IP 패킷의 최대 길이는 64KB까지 가능한데, 일반적으로 64KB까지 싣는 경우는 거의 없고, MTU를 두어 MTU까지만 데이터를 싣는다.
두 번째 행
두 번째 행은 단편화와 관련이 있다.
세 번째 행
- TTL : Time to Live. 패킷의 생존을 결정하는 요소로, 세포의 텔로미어와 비슷한 역할을 한다. 1부터 255까지 값을 지정해서 라우터에서 라우터로 hop(점프)할 때마다 값을 감소시킨다. 이 과정을 겪다 TTL이 0이 된 패킷은 인터넷 상에서 폐기된다.
- Protocol : 상위 계층의 프로토콜을 적는다. TCP, UDP 등이 적혀 있을 수 있다.
- Header Checksum : IP 헤더의 체크섬을 저장한다.
네 번째 행
네 번재 행은 출발지의 IP 주소를 적는다.
다섯 번째 행
다섯 번째 행은 도착지의 IP 주소를 적는다.
서브넷 마스크
서브넷 마스크는 IP 주소의 네트워크 ID를 획득하기 위한 것으로, IP 주소와 같은 형태로 32비트로 되어 있다. 흔히 255.255.255.0으로 되어 있는 경우가 많은데, 네트워크로부터 패킷이 도착하게 되면 호스트는 이 서브넷 마스크와 도착한 IP 주소를 AND 비트 연산하여 도착한 패킷의 목적지 IP 주소가 나의 IP 주소의 네트워크 ID와 같다면, "아 이 패킷이 나한테 온 패킷이구나"를 판단해 패킷을 가진다.
위의 그림을 보면 파란색으로 시작하는 두 번째 줄이 서브넷 마스크인데, 이진수인 1111 1111 ... 0000 0000을 십진수로 변환하면 255.255.255.0인 서브넷 마스크임을 알 수 있다. 192.168.0.10이 도착한 패킷의 목적지 IP 주소라면 서브넷 마스크는 해당 IP 주소와 자신을 AND 연산해 아래의 계산값을 도출해 낸다. 이후, 도출된 계산의 네트워크 ID 부분과 목적지 IP 주소의 네트워크 ID 부분이 갖다면, '나한테 온 패킷이구나'를 판단하는 것이다.
아래에 서브넷 마스크가 잘 설명된 게시글을 첨부한다. 절대 설명하기 어려워서 첨부한 것이 아니다. (사실 맞다)
https://nordvpn.com/ko/blog/what-is-subnet-mask/
CIDR (Classless Inter-Domain Routing, 사이더)
사이더는 클래스 없는 도메인간 라우팅 기법을 의미하는데, 해당 개념은 서브넷 마스크 그리고 클래스를 이용한 네트워크 구분 체계와 관련이 있다. 클래스가 있는 네트워크 방법을, 네트워크의 환경 그리고 네트워크 및 컴퓨터 하드웨어의 성능 향상으로 클래스 없이 라우팅 하는 방식으로 조금 더 진화시킨 방법이라고 할 수 있겠다.
기존의 클래스 체계는 IP 주소를 A, B, C 클래스로 규격화 해 해당 정보를 토대로 라우팅을 진행했다. 사이더는 이러한 클래스 규격을 없앤 라우팅 기법으로 AWS 등을 이용할 때 한번쯤 본 IP 주소 형태로 표현 가능하다. 아래처럼 말이다.
- 192.168.100.10 / 24
위의 CIDR 표기법은 IPv4 주소의 네트워크 ID가 앞에서부터 24개의 비트로 구성되어 있음을 보여준다. 이런 식으로 뒤에 / 를 그은 후 네트워크 ID의 위치를 구별하는 것이다.
브로드캐스트 IP
이전 글에서 L2 수준의 브로드캐스트를 수행하기 위해서는 MAC 주소의 모든 비트를 1로 두면 된다고 언급하였다. 즉, FF-FF-FF-FF-FF-FF인 것인데, IP에서의 브로드캐스트도 마찬가지로, IP 주소의 호스트 ID의 비트값을 모두 1로 두면 브로드캐스트 IP가 된다. 만약 특정 네트워크 IP의 네트워크 ID가 192.168.2.0이라고 가정한다면, 해당 네트워크에서의 브로드캐스트 IP는 호스트 ID를 0에서 255로 바꾼 192.168.2.255가 된다. (255는 이진수로 1111 1111이다)
Host 자신을 가리키는 IP 주소
네트워크 관점에서는 조금 이상해 보일 수 있지만 생각보다 호스트가 자기 자신과 통신해야 하는 경우가 왕왕 있을 수 있다. 이는 네트워크를 이용하는 주체가 호스트이기 이전에 Process이기 때문인데, 한 호스트 내부에서 서로 다른 프로세스들이 서로 통신을 해야 하는 경우가 있을 수 있기 때문이다.
호스트가 네트워크 상에서 자기 자신을 호출하기 위해서는 IP를 127.0.0.1로 두면 된다. 127.0.0.1은 특별한 IP 주소로 자기 자신을 가리키는 네트워크 상에서의 약속이라고 생각하면 된다. 만약 특정 프로세스가 127.0.0.1로 된 IP 주소를 호출한다면 커널 모드에까지 내려간 패킷은 드라이버를 통해 NIC로 넘어가지 않고, 그대로 다시 계층을 타고 올라와 목적지 프로세스로 가 닿는다. 즉, 호스트 내부에서만 통신이 이루어 지는 것이다.
이 때 특정 프로세스가 같은 호스트에서의 다른 프로세스를 식별하여 호출하는 데는 포트가 사용되며 주로 IPC(Inter Process Communication, 프로세스 간 통신)을 구현할 때 사용된다. 127.0.0.1은 루프백 주소라고 한다.
TTL
앞서 설명한 것처럼 TTL 즉, Time to Live는 패킷의 수명을 결정하는 요소이다. 패킷은 인터넷 상으로 전송되는 순간부터 라우터들을 거치며 인터넷을 활보하게 되는데, 라우터들을 거쳐갈 때마다 TTL이 감소하도록 되어 있다. 그리고 TTL이 0이 되는 순간, 라우터는 해당 패킷을 더이상 네트워크 상에 전송하지 않고 해당 패킷을 폐기한다.
TTL이 있는 이유는 인터넷이란 상당히 방대하고 변수가 많아 통제가 불가능한 공간이기 때문이다. 만약 네트워크 상에서 특정한 문제가 있어 목적지 네트워크로 패킷이 전송될 수 없는 경우가 생긴다면, 인터넷 상을 떠도는 패킷은 영원히 인터넷 상의 라우트를 순회하며 좀비처럼 돌아다니게 될 것이다. 만약 이런 패킷들이 제대로 폐기되지 않아 좀비 패킷이 많아지게 된다면 네트워크에 또 다른 문제가 될 수 있기 때문에, TTL을 두어 문제가 생긴 패킷들이 소멸되도록 하는 것이다.
이는 세포의 텔로미어와 같은 역할을 하는데, 세포의 텔로미어도 세포가 복제될 때마다 길이가 조금씩 줄어들어 세포가 무한 증식하는 것을 막는다.
참고로, 패킷이 라우터에서 라우터로 이동하는 것을 '홉(hop)'이라고 한다. 홉은 '깡총 뛰다'라는 뜻인데, 이름이 참 귀여운 것 같다.
단편화(Fragmentation)
패킷의 MTU는 패킷이 전송할 수 있는 최대 크기를 명시하는 단위이다. 보통 1500 bytes를 MTU로 두고 있는데, MTU는 절대적인 것이 아니어서 특정 라우터나 특정 스위치 혹은 특정 호스트는 MTU 단위를 1500 바이트보다 크거나 작게 설정할 수 있다.
앞서 언급한 것처럼 인터넷은 거대하고 통제할 수 있는 공간이 아니어서 많은 변수들로 넘쳐난다. 단편화가 필요한 이유는 패킷이 인터넷 공간에서 목적지 IP까지 수많은 라우터를 거쳐가기 때문인데, 만약 1500 바이트를 MTU로 설정한 패킷이 라우팅 과정에서 1300 바이트를 MTU로 둔 라우터를 만난다면 정상적으로 데이터가 전송되지 않는 일이 생길 수 있다. 이 때 라우터는 해당 패킷을 단편화 해 패킷을 자신이 설정한 MTU 보다 작은 단위로 잘게 나눈다. 즉, 단편화는 패킷이 네트워크 전송 과정 중 분할되는 것을 의미한다.
참고로 분할된 패킷은 일반적으로 목적지 호스트의 L3 레이어에서 합쳐진다.
DHCP
호스트가 처음 부팅 된 후, 혹은 처음 네트워크를 사용할 준비를 마친 후, IP 주소와 서브넷 마스크 등을 직접 할당하는 것은 결코 쉬운 일이 아니다. 내가 사용할 수 있는 IP가 어떤 IP가 있는지 일일히 조회해 적절한 IP를 할당하는 것도 일이고, 인터넷으로 접속하기 위해 내가 사용할 수 있는 게이트웨이의 IP를 획득하는 일도 결코 쉬운 일이 아니다. DHCP는 Dynamic Host Configuration Protocol(동적 호스트 구성 프로토콜)의 약자로 어렵고 번거로운 인터넷 사용 설정을 호스트를 대신 해 처리해준다.
DHCP 동작 과정
네트워크에 연결이 필요한 호스트는 자신이 인터넷 등을 사용할 수 있는 IP 등을 요청하기 위해 브로드캐스팅 등을 이용해 DHCP 서버와 통신을 개시한다. 호스트의 IP 할당 요청을 받은 DHCP는 호스트로 IP를 할당한 후 호스트의 주소 이용을 모니터링 한다.
ARP
ARP는 Address Resolution Protocol(주소 결정 프로토콜)의 약자로 IP 주소를 이용해 MAC 주소를 알아내는데 쓰인다. 인터넷을 통한 네트워크 통신을 위해서는 송신지 호스트에서 게이트웨이의 MAC 주소를 반드시 알아야 하는데, DHCP는 게이트웨이의 MAC 주소까지 알려주지는 않는다. 따라서 ARP를 통해 게이트웨이의 IP 주소로 MAC 주소를 알아내는 메커니즘이 필요한 것이다.
추가적으로 ARP를 통해 획득한 게이트웨이의 MAC 주소는 L2 Frame에서의 목적지 MAC 주소에 적히게 된다.
RTT
RTT(Rount Trip Time, 왕복 시간)은 인터넷을 통해 목적지에 패킷을 보낼 때, 패킷이 목적지에 도착하고나서 응답지로 요청이 오기까지의 시간을 의미한다. RTT는 네트워크의 성능을 체크할 때, 네트워크 연결의 속도와 안정성을 검토하기 위해 사용된다. 일반적으로 출발지와 목적지의 거리가 길 때, 즉 서울에서 부산으로 네트워크가 오고 가는 것보다 서울에서 뉴욕으로 네트워크가 오고 가는 과정에서 RTT가 클 확률이 크지만 언제나 그런 것은 아니고 호스트 혹은 라우터의 성능, 트래픽의 양 등 다양한 요소들이 영향을 끼치게 된다. RTT의 크기가 너무 커 서비스의 응답이 너무 늦다고 판단되는 경우 CDN 등을 이용해 서비스의 응답속도를 높히기도 한다고 한다.
Ping과 RTT
게임을 하다보면 ping이 너무 높아 게임 접속이 원활하지 않다고 말할 때가 있다. 하지만 사실 이 말은 반은 맞고 반은 틀린 것인데, 사실 높은 것은 ping이 아니라 RTT값이 높은 것이다. ping은 사실 RTT를 측정하는 프로그램의 이름으로 ICMP(Internet Control Message Protocol)을 이용해 RTT 값을 측정한다. ping은 DoS(Denial of Service)로 악용되기도 한다.
'네트워크' 카테고리의 다른 글
[외워서 끝내는 네트워크 핵심이론 - 응용] Inline, Out of Path, Proxy 구조 (0) | 2023.04.04 |
---|---|
[외워서 끝내는 네트워크 핵심이론 - 기초] L4 수준에서 외울 것들 정리 (0) | 2023.03.29 |
[외워서 끝내는 네트워크 핵심이론 - 기초] L2 수준에서 외울 것들 정리 (0) | 2023.03.20 |
[외워서 끝내는 네트워크 핵심이론 - 기초] Internet 기반 네트워크 입문 정리 (0) | 2023.03.17 |
HTTP 비연결성 (feat. 지속 연결) (0) | 2023.02.07 |