[Computer Network] IP Address
IP 주소는 컴퓨터나 라우터 등 인터페이스에 할당된다.
여기서 인터페이스는 호스트 / 라우터와 물리적 링크 사이의 연결 지점을 의미함.
즉, 디바이스 자체는 방이고, 인터페이스는 그 방으로 들어갈 수 있는 문, IP 주소는 그 문에 붙은 번호판으로 보면 된다.

노트북은 하나지만 C타입 포트도 있고 USB 포트도 있고 무선 와이파이도 잡을 수 있다.
그러면 노트북의 인터페이스는 3개. 라우터도 비슷하게 생각하자.
여러 네트워크를 연결해 줘야 하니 라우터는 연결된 네트워크 수 만큼 IP 주소를 가진다.
IP 주소를 표기할 때는 CIDR 쓰는데 이건 다 아니까 패스.. 원래 클래스 썼다가 CIDR로 바꿈. CIDR이 표준.
루프백 사설 브로드캐스트 등 특수 목적 IP 주소가 있고 IPv4가 부족해지면서 128비트 기반인 IPv6이 등장함.
서브넷은 라우터를 거치지 않고 직접 통신할 수 있는 인터페이스의 집합을 의미한다.
즉, 공유기 하나에 연결된 같은 네트워크 대역폭의 기기들이 하나의 서브넷을 구성함.
앞서 다룬 라우터의 진짜 역할을 기기를 연결하는게 아니라 서로 다른 네트워크(서브넷)를 연결하는 것.
공유기에는 내부망인 서브넷과 외부망인 인터넷을 연결해주는 라우터 + 기기를 연결해주는 스위치가 합쳐져있다.
ISP는 인터넷 서비스 제공 회사로, Backbone Router를 관리함.
집 라우터가 우리 집 주소만 관리한다면 ISP 라우터는 대전광역시, 대한민국 전체를 관리한다.
사설 IP 서브넷은 집이나 회사에서 쓰는 내부망이고, 공인 IP 서브넷은 인터넷에서 사용한다.
즉, 서브넷이라고 해서 꼭 내부망은 아니고.. 큰 회사는 관리를 위해 공인 IP도 서브넷으로 쪼개서 관리하기도 한다.
큰 IP 주소 공간을 여러 개의 작은 네트워크(Sub-network)로 분리하는 작업을 서브넷팅이라고 부름.
CIDR 표기에서 뒤에 /24가 있는데. 이게 서브넷 마스크. 어디까지가 네트워크 주소고 어디부터가 내 컴퓨터 번호인지 구분할 때 사용함.
반대로 여러 개의 작은 서브넷을 하나로 퉁쳐서 부를 수 있음.
라우터는 전 세계의 모든 서브넷 정보를 기억할 수 없으니 ISP는 여러 조직의 주소를 하나로 묶어서 상위 라우터에게 알려준다.
지하철에서 와이파이 잡을 때 IP 주소를 입력하지 않아도 되는건 DHCP 덕분.
Dynamic Host Configuration Protocol의 약자로, 서버로부터 IP 주소를 빌리고 다 쓰면 반납한다.

IP 주소는 논리적인 지도. MAC 주소는 물리적인 연결.
그러니 데이터가 이동할 때 기기에 적힌 MAC주소가 계속 바뀌면서 전달됨. (노트북 - 라우터 - 라우터 - ... 목적지)
Application(HTTP) - 사용자의 요청을 HTTP 메세지에 적는다
Transport(TCP) - HTTP 메세지를 TCP 세그먼트에 넣는다. 포트번호가 적힘.
Network(IP) - TCP 세그먼트를 IP 패킷에 넣는다. IP 주소가 적힘.
Link(Ethernet) - IP 패킷을 이더넷 프레임에 넣는다. MAC 주소가 적힘.
Physical - 이더넷 프레임이 0 1 비트로 바뀌고 케이블로 전달됨.

Path-Selection Algorithn 부분은 OSPF, BGP같은 프로토콜으로 Topology를 보고 경로를 계산해 Forwarding Table을 만든다.
IP 프로토콜과 Forwarding으로 실제 패킷을 처리한다.

header length는 4바이트 단위로 기록된다. 기본 헤더 길이는 20바이트니까 이 필드 값은 5
Type Of Service로 패킷의 우선순위나 혼잡 상태를 표시한다.
패킷이 너무 클 때 여러 개로 쪼개고 합치기 위해 Identification, Flags, Fragment Offset을 사용한다.
라우터를 하나씩 거칠 때 마다 TTL이 1씩 줄어든다. 0이 되면 버려지고.. 루프 방지를 위해 필요함.
traceroute 명령어도 이 원리를 사용한다.
TTL을 1로 보내서 첫 번째 라우터가 죽게 만들고, TTL을 2로 보내서 두 번째 라우터가 죽게 만드는 식으로 경로상의 모든 라우터 IP를 알아냄.
네트워크마다 한 번에 보낼 수 있는 최대 크기인 MTU가 다르다. (이더넷은 1500)
4000바이트짜리를 보내려면 쪼개야 함.
라우터가 전송하려는 링크의 MTU보다 패킷이 더 크면 라우터가 쪼갠다.
최종 목적지에서 다시 조립하고, 중간 라우터는 조립하지 않음.
TCP가 Segmentation으로 데이터를 자르는데.. IP 계층에서도 Fragmentation이 발생하는거임..
TCP Segmentation은 보내는 사람의 PC에서 수행하지, 라우터는 관여하지 않음. Maximum Segment Size에 맞춰서 잘라내는 것.
IP Fragmentation은 라우터도 수행할 수 있다. TCP가 잘라서 보냈지만 MTU가 작은 링크를 만나면 잘라야 하니까.
다만 IPv6에서는 IP Fragmentation을 수행하지 않긴 함.
Identification - 쪼개진 조각들은 모두 같은 아이디를 가진다.
Flags - 뒤에 조각이 더 있음을 의미함. 마지막 조각에서는 플래그가 0.
Offset - 원본 데이터의 몇 번에 있는지를 알려준다.

IPv6에서는 IPv4와 다르게 40바이트 고정 길이 헤더를 사용한다.
체크섬이 삭제됐다. 어차피 2계층과 4계층에서 오류 검사를 수행하니 중간 라우터인 3계층에서는 검사하지 않는다.
라우터가 패킷을 쪼개느라 시간쓰는걸 금지한다. 너무 크면 그냥 버리고 에러만 뱉는다. (쪼개는건 출발지가 알아서)
Sender가 에러를 보고 알아서 패킷을 작게 쪼개서 다시 보냄.
애초에 TCP가 가장 좁은 길을 알면 참 좋은데, 그게 잘 안 되니까 Path MTU Discovery로 학습하는 방식.
IPv4에 있었던 옵션 필드를 제거했다. 추가 정보가 필요하면 헤더 뒤에 Next Header 형태로 붙인다.
TTL == Hop Limit
즉, 단순히 주소만 늘린게 아니고 라우터가 패킷을 더 빠르게 던질 수 있도록 최적화함.

이미 잘 작동하는 라우터를 모두 IPv6으로 바꾸는건 불가능. 터널링을 사용한다.
IPv6을 사용하는 두 네트워크가 IPv4 네트워크를 두고 통신함.
라우터 B와 E는 IPv4와 IPv6을 모두 이해하는 Dual-Stack 라우터이고, 라우터 B와 E가 협력해서 IPv4 전용 터널을 뚫는다.
A -> B : A가 보낸 IPv6 데이터그램이 Bdp ehckrgksek.
B -> E : B는 IPv6 데이터그램을 그대로 IPv4 데이터그램의 Payload에 집어넣고, 겉에 IPv4 헤더를 붙인다.
E -> F : IPv4 헤더를 벗겨내고 원래 있던 IPv6 데이터그램을 꺼내 F에게 전달한다.
ISP, 통신사처럼 높은 계층에서 관리하는 쪽에서 Dual-Stack 라우터를 사용함.
집 공유기는 웬만하면 IPv6 지원하긴하는데, 내부망은 IPv4써도 밖으로 나갈 때 NAT 해주면 되니 급하지는 않다.
사용자는 IPv6 쓰고싶은데, Backbone Network 중 일부 구간이 IPv4 장비를 사용할 수 있음.
이 때 통신사 경계에 있는 라우터를 Dual-Stack으로 사용해 호환성을 유지한다.
지금은 구글 접속 클라이언트의 약 40%정도가 IPv6을 사용하고 있음.
모든 통신이 IP 기반으로 수행되니 뭐 하나 바꾸더라도 IP는 유지되니까 편하다.. 디자인패턴에서 Facade Pattern과 유사한듯..

Internet Control Message Protocol은 3계층 프로토콜으로 IP 패킷 처리 중 발생하는 오류를 보고하거나 네트워크 상태를 진단하기 위해 사용된다.
ICMP 메세지는 독립적으로 전송되지 않고 IP 데이터그램의 Payload에 실려서 전송됨.
IPv4에서는 Protocol Field 값이 1로 설정됐음이 뒤따르는 데이터가 ICMP 메세지임을 나타낸다.
IPv6에서는 Next Header Field 값을 58로 설정한다.
Type - ICMP 메세지의 종류를 나타냄.
Code - Type에 대한 하위 코드를 나타냄.
Checksum - ICMP 메세지의 무결성을 검증
ICMPv4 체크섬은 ICMP 데이터 영역만을 커버하고, ICMPv6 체크섬은 IP 헤더의 일부 필드를 포함한다.

IPv4 환경에서 사용되는 메세지와 표준 타입. Error와 Informational/Query 메세지로 구분된다.
E는 패킷 전송 중 문제가 발생했을 때 라우터나 호스트가 보내는 에러 메세지이고, I는 네트워크 상태를 진단하거나 정보를 요청할 때 사용.
ping 명령어는 Type 8 -> Type 0
Type 3은 라우터가 패킷을 목적지로 전달할 수 없을 때 보낸다.
IPv6으로 넘어오면서 Ipv4의 ARP, IGMP 기능이 ICMPv6으로 통합되어 ICMP의 역할이 훨씬 강력해졌다.
그러니까.. IP 프로토콜은 기본적으로 데이터만 보내고 잘 도착했는지 중간에 터졌는지 신경쓰지 않는다.
그래서 ICMP를 Error Log로 활용한다. 구체적인 에러 객체라고 보면 됨.
다만, IPv6으로 넘어오면서는 몸집이 좀 커짐. 네트워크 관리 기능이 하나로 묶였다.
그냥 spec임. 모든 OS와 라우터가 의무적으로 탑재하고 있는 spec.
traceroute 명령어도 내부적으로 ICMP를 활용한다. (TTL을 1씩 증가시키면서 전송)
IPv4 주소가 얼마 없는데, IPv6으로의 완전한 전환은 시간이 오래 걸리니 내부망과 외부망을 전환하는 Network Address Translation을 사용함.
외부에서 내부 서버로 접속해야하니 포트포워딩 설정이 필요하고, 라우터가 패킷을 전달할 때 IP주소와 포트번호를 변경해야 해 오버헤드가 좀 있지만 하나의 공인 IP로 여러 기기가 내부망을 사용할 수 있으니 굉장히 유용하다.
와이파이 공유기(AP)도 NAT 기술을 기반으로 작동하고, 내부 네트워크의 IP 주소가 외부에 노출되지 않으니 방화벽 효과도 얻음.

패킷이 공유기를 통과할 때는 4가지 단계로 표현할 수 있음.
1. 내부 -> 공유기 요청
집컴에서 외부 웹 서버로 데이터를 보낸다.
2. NAT Translation
집컴은 바로 외부 웹 서버로 데이터를 보낼 수 없음. 공유기에게 먼저 보낸다.
공유기는 패킷을 받아서 출발지 주소를 공인 IP로 바꾸고 포트번호도 아무거나 남는거 대충 쓴다.
이 때 Translation Table에 이 정보를 기록함. (138.76.7:5001 -> 10.0.0.1:3345)
3. 외부 -> 공유기 응답
웹 서버는 요청을 처리하고 응답을 보낸다. 서버 입장에서는 보낸 사람이 138.76.29.7 이니까 그쪽으로 보낸다.
4. 공유기 -> 내부 역변환
공유기는 도착한 패킷의 목적지 포트가 5001임을 확인하고, Translation Table을 조회해 목적지 주소를 사설 IP 주소로 복구한다.
라우터는 원래 IP주소인 3계층까지만 봐야 하는데.. NAT는 포트번호인 4계층까지 건드리기에 네트워크의 기본 원칙을 깬다.
IP 주소와 포트번호를 바꾸면 패킷 내용이 달라지기에 무결성을 확인하는 Checksum을 공유기가 다시 계산해야 함.
TCP 연결이 Client -> NAT -> Server 구조로 분리되는것도 단점.
Translation Table은 영구적이지 않다. 언제 적고 언제 지우는지에 대한 규칙이 있음.
내부 -> 외부 : 외부로 패킷을 보낼 때 공유기가 테이블을 생성하고, 통신이 끝나거나 일정 시간이 지나면 테이블에서 지운다.
외부 -> 내부 : 외부는 내부 사설 IP를 모르니 먼저 들어올 수 없다. 내부에서 트래픽을 생성했거나 포트포워딩을 해 놔야 가능.
포트포워딩을 해 두면 외부에서 들어오는 입력을 받을 수 있는데, 보이스톡 하려고 공유기 설정 페이지에 들어가서 특정 포트를 여는건 사실상 불가능함;
그러나 몇 가지 방법이 있다.
Hole Punching - 내부 단말이 외부에 있는 중계 서버에 미리 패킷을 보내서 공유기에 매핑 정보를 저장한다.
STUN (Session Traversal Utilities for NAT) - 외부 서버에 물어봐서 자신의 공인 주소를 알아내는 프로토콜.
TURN (Traversal Using Relays around NAT) - P2P 연결이 불가능할 때 중계 서버를 두고 데이터를 대신 전달하는 방식.
ICE (Interactive Connectivity Establishment) - STUN과 TURN을 조합해 최적의 연결 경로를 찾아준다.
공유기도 그냥 리눅스가 깔린 작은 컴퓨터. SSH로 공유기 자체에 접속해서 상태를 확인할 수 있다.
리눅스의 방화벽 툴인 iptables로 NAT를 수행함.
사실 NAT는 핫스팟, 도커, LTE 등 여러 분야에서 사용됨.
내 폰(S25)에서 핫스팟을 켜면 폰이 공유기로 작동한다. Termux로 확인해보자.

rmnet은 LTE/5G 데이터 통신을 담당하는 인터페이스이고 wlan0은 와이파이 인터페이스.
swlan0은 핫스팟에 노트북을 연결했을 때 기본 게이트웨이로 잡히는 주소를 의미함.
rmnet0에서 받은 데이터를 swlan0에 연결된 노트북에게 NAT로 변환해서 전달한다.
정리하면.. 공유기가 하는 역할은..
IP Router / NAT / DHCP / Ethernet Switch / WiFi AP / DNS Server
그냥 종합선물세트
'Computer Science > Computer Network' 카테고리의 다른 글
| [Computer Network] Cryptography (1) | 2025.12.14 |
|---|---|
| [Computer Network] Multimedia Streaming (0) | 2025.12.14 |
| [Computer Network] Router (0) | 2025.12.13 |
| [Computer Network] Congestion Control (0) | 2025.11.02 |
| [Computer Network] Transmission Control Protocol (1) | 2025.10.15 |
댓글
이 글 공유하기
다른 글
-
[Computer Network] Cryptography
[Computer Network] Cryptography
2025.12.14 -
[Computer Network] Multimedia Streaming
[Computer Network] Multimedia Streaming
2025.12.14 -
[Computer Network] Router
[Computer Network] Router
2025.12.13 -
[Computer Network] Congestion Control
[Computer Network] Congestion Control
2025.11.02