[네트워크] CSAPP 11장 네트워크 프로그래밍
![[네트워크] CSAPP 11장 네트워크 프로그래밍](https://firebasestorage.googleapis.com/v0/b/cruz-lab.firebasestorage.app/o/images%2Fheroes%2Fhero-1766484028579.webp?alt=media&token=4caa5ea1-1d21-48ee-bfce-d18c4e0ac183)
11.1 클라이언트-서버 프로그래밍 모델
CSAPP 11장은 네트워크 프로그래밍을 설명할 때 클라이언트-서버 모델을 중심에 둔다.
실제로는 P2P 같은 다른 구조도 있지만, 웹 서버 구현을 이해하려면 이 모델부터 잡는 편이 가장 직관적이다.
이 모델에서 애플리케이션은 하나의 서버 프로세스와 하나 이상의 클라이언트 프로세스로 구성된다.
-
서버 (Server): 특정 리소스를 관리하고, 클라이언트를 위해 그 리소스를 조작해서 서비스를 제공하는 역할
-
클라이언트 (Client): 서버에게 서비스를 요청하는 역할.
🤔 클라이언트랑 서버는 컴퓨터(호스트)가 아니라 프로세스다?!
보통 우리는 “클라이언트 = 내 노트북, 서버 = 원격 서버(ex: AWS EC2)”처럼 물리적인 머신(호스트)으로 생각한다. 하지만 네트워크 프로그래밍 관점에서는 클라이언트/서버를 “역할”로 정의한다.
클라이언트: 요청을 보내는 프로세스
서버: 요청을 받아 응답하는 프로세스
하나의 호스트(머신) 안에서도 클라이언트 프로세스와 서버 프로세스가 동시에 존재할 수도 있다.
따라서 이 클라이언트/서버 모델의 핵심 주체는 하드웨어가 아닌 소프트웨어라는 것을 명심해야 한다!
트랜잭션(transaction)
이 모델의 기본 연산은 트랜잭션이며, 4단계로 이루어진다.

-
클라이언트가 요청을 보냄
-
클라이언트가 서비스가 필요할 때 서버에 요청을 보내 트랜잭션을 시작
-
ex) 웹 브라우저가 파일을 필요로 할 때 웹 서버에 요청을 보냄
-
-
서버가 요청을 처리
-
서버는 요청을 받아서 해석하고, 리소스를 적절하게 조작
-
ex) 웹 서버가 브라우저로부터 요청을 받으면, 디스크 파일을 읽음
-
-
서버가 응답을 보냄
-
서버는 클라이언트에게 응답을 보내고, 다음 요청을 기다림
-
ex) 웹 서버는 읽은 파일을 클라이언트에게 다시 보냄
-
-
클라이언트가 응답을 처리
-
클라이언트는 응답을 받고 이를 처리
-
ex) 웹 브라우저가 서버로부터 페이지를 받으면 화면에 표시
-
11.2 네트워크
클라이언트와 서버는 종종 별개의 호스트에서 실행되며, 컴퓨터 네트워크의 하드웨어와 소프트웨어 자원을 사용해 통신한다. 프로그래머 관점에서 네트워크를 이해해보자.

호스트 입장에서 네트워크는 데이터를 위한 I/O 장치일 뿐이다.
데이터는 I/O 버스의 확장 슬롯에 꽂힌 Network adapter를 통해 네트워크와 물리적으로 연결된다.
네트워크에서 받은 데이터는 어댑터에서 I/O 버스와 메모리 버스를 거쳐 메모리로 복사되고, 반대로 메모리에서 네트워크로 데이터가 복사될 수도 있다.
💡 네트워크 인터페이스(Network Interface)
네트워크 인터페이스란?
네트워크 상에서 노드와 통신 매체가 연결되는 지점
노드와 네트워크 사이의 통로
네트워크 인터페이스마다 MAC 주소(물리적 주소)가 부여
이때 NIC(Network Interface Controller)라는 하드웨어가 이 역할을 담당한다.
즉, 위 그림에 나오는 Network adapter는 사실상 NIC를 지칭하는 말이다.
네트워크의 물리적 구조: LAN과 WAN

네트워크는 규모에 따라 크게 LAN과 WAN으로 나뉨
-
LAN(Local Area Network, 근거리 네트워크)
비교적 가까운 거리(가정, 기업, 캠퍼스)를 연결하는 한정된 공간에서의 네트워크
어떤 공유기를 통해 여러 기기가 인터넷에 연결되어 있다면:
-
해당 공유기를 기준으로 하나의 LAN이 구축되었다고 할 수 있음
-
해당 공유기와 연결된 네트워크 기기들은 모두 같은 네트워크(LAN)에 속해있다고 인식하여 자유롭게 통신 가능
-
오늘날 거의 모든 LAN은 이더넷이라는 기술을 표준으로 사용
-
-
이더넷(Ethernet)
각 호스트(컴퓨터)의 네트워크 인터페이스에 고유한(전 세계에서 유일) 48 비트 MAC 주소를 부여하고, 이 주소를 이용해 데이터를 프레임(Frame)이라는 작은 덩어리로 나누어 통신하는 방식
CSAPP 책에서는 구식 허브/브릿지 모델의 이더넷을 소개하지만, 현대의 이더넷 기반 LAN은 스위치(Switch)라는 장비를 중심으로 구성됨
-
과거의 허브는 들어온 신호를 모든 포트로 무작정 복사해서 보냄(브로드캐스트 통신)
-
스위치는 프레임에 적힌 목적지 MAC 주소의 포트로만 데이터를 정확하게 전달(유니캐스트 통신)
⇒ 이 덕분에 불필요한 트래픽이 발생하지 않고 네트워크 충돌을 막아 통신 효율 극대화
💡 스위치의 MAC 주소 학습과 MAC 주소 테이블 기능

-
스위치는 프레임 속 MAC 주소를 토대로 현재 어떤 포트에 어떤 MAC 주소를 가진 호스트가 연결되어 있는지 파악하고 (MAC 주소 학습)
- ‘포트, 연결된 호스트의 MAC 주소’의 대응 관계를 테이블의 형태로 메모리에 저장함 (MAC 주소 테이블)
⇒ MAC 주소 테이블을 생성하고 참조할 수 있기 때문에 스위치가 전달받은 신호를 목적지 호스트가 연결된 포트로만 내보낼 수 있게됨
-
-
-
WAN(Wide Area Network, 원거리 네트워크)
LAN과 LAN을 연결하는 더 넓은 범위의 네트워크
-
모든 네트워크 기기들이 같은 네트워크(LAN)에서만 정보를 주고받지 않음 ⇒ LAN 간의 통신도 빈번하며, 이 때 WAN을 통해 LAN 간 통신이 이루어짐
-
WAN은 멀리 떨어진 LAN들을 이어주는 광역망이다. 보통 ISP가 이런 구간을 구축하고 운영한다.
-
인터넷(internet)
인터넷은 전 세계의 수많은 네트워크를 **라우터(Router)**와 IP 프로토콜로 서로 연결한 거대한 네트워크 집합체다.
아래 그림처럼 각기 다른 LAN들이 라우터를 통해 WAN으로 연결되고, 또 다른 라우터를 거쳐 다른 LAN과 통신하는 구조

💡 internet vs Internet
소문자 internet은 일반적인 '상호 연결된 네트워크'라는 개념을 의미하고,
대문자 Internet은 우리가 아는 '글로벌 IP 인터넷'이라는 특정 구현을 지칭
인터넷은 어떻게 서로 다른 네트워크를 연결할까?
서로 다른 종류의 LAN 기술(이더넷, Wi-Fi 등)을 사용하더라도 문제없이 통신할 수 있는 이유는,
모든 호스트와 라우터가 인터넷 프로토콜(Internet Protocol, IP)이라는 공통의 약속을 따르기 때문.
IP의 핵심 아이디어는 패킷(Packet)이라는 데이터 덩어리에 있다.
각 패킷에는 출발지 호스트와 목적지 호스트의 IP 주소가 포함된 헤더가 붙어있으며,
이 IP 주소 덕분에 라우터는 패킷의 최종 목적지를 알 수 있고, 올바른 경로로 패킷을 전달할 수 있다.
아래 그림은 Host A가 다른 네트워크(LAN2)에 있는 Host B에게 데이터를 보내는 과정을 보여준다.

-
캡슐화 (Encapsulation):
-
Host A는 보내려는 데이터(Data)에 최종 목적지(Host B)의 IP 주소가 담긴 패킷 헤더(PH)를 붙여 인터넷 패킷을 만듬
-
그리고 이 패킷을 LAN1을 통해 라우터로 보내기 위해, 라우터의 주소(MAC 주소)가 담긴 프레임 헤더(FH1)를 다시 한번 덧붙여 LAN1 프레임을 만듬
-
-
라우터의 역할:
-
라우터는 LAN1 프레임을 받아 겉포장인 FH1을 제거
-
속포장인 패킷 헤더(PH)를 보고 최종 목적지가 Host B임을 확인
-
이제 이 패킷을 LAN2로 보내야 하므로, Host B의 주소(MAC 주소)가 담긴 새로운 프레임 헤더(FH2)로 재포장하여 LAN2로 전달
-
-
최종 전달: Host B는 전달받은 LAN2 프레임의 FH2와 PH를 차례로 제거하고, 마침내 원본 데이터를 얻게 됨
정리하면, 인터넷은 각 네트워크 구간에 맞는 프레임 헤더는 바꿔가면서도, 패킷 헤더에 담긴 최종 목적지 IP 주소를 기준으로 데이터를 전달한다.
11.3 글로벌 IP 인터넷
앞서 말했듯이 LAN을 넘어 다른 네트워크와 통신을 주고받으려면, 네트워크 계층 이상의 기술이 필요하고,
이 때 특히 중요하게 사용되는 핵심 프로토콜이 IP(Internet Protocol)이다.
IP의 목적과 특징은 다음과 같다.
-
IP의 목적: 주소 지정, 단편화
-
IP의 특징: 비신뢰성 통신, 비연결형 통신
주소 지정
주소 지정은 비부호형 32비트 정수(IP 주소)에 의해 이루어짐
⇒ IP 패킷 헤더 내 송신지 IP 주소, 수신지 IP 주소 필드가 존재
이 때 패킷을 올바르게 전송하기 위해서는 MAC 주소와 IP 주소가 모두 필요하지만, IP 주소가 우선적으로 활용됨
-
라우터: IP 주소를 바탕으로 목적지까지 IP 패킷을 전달하는 네트워크 장비
-
라우팅: IP 패킷을 전달할 최적의 경로를 결정하고 해당 경로로 패킷을 내보내는 과정
단편화
-
MTU(Maximum Transmission Unit) : 최대 전송 단위
-
전송하고자 하는 IP 패킷(IP 헤더 및 페이로드)의 크기가 MTU라는 단위보다 클 경우, 패킷을 MTU 이하의 여러 패킷으로 쪼개서 전송하고, 쪼개서 전송된 패킷들은 수신지에서 재조합됨
-
이 때 일반적인 MTU 크기는 1500바이트이며, 이는 프레임을 통해 주고받을 수 있는 최대 페이로드 크기 ⇒ IP 패킷의 헤더 및 페이로드는 프레임의 페이로드가 되기 때문
-
비신뢰성 통신
패킷이 수신지까지 제대로 전송되었다고 보장하지 않는 프로토콜
- 패킷이 유실되거나 목적지에 순서대로 전송되지 않더라도 이에 대해 조치를 취하지 않음
비연결형 통신
패킷을 주고받기 전에 사전 연결 과정을 거치지 않는 프로토콜
- 상대 호스트의 수신 가능 여부는 고려하지 않고, 수신지를 향해 그저 패킷을 전송
IP주소의 구조
하나의 IP 주소는 10진수 4개(32bit)로 표기되며 크게 네트워크 주소와 호스트 주소로 이뤄짐

-
네트워크 주소(네트워크 ID, 네트워크 식별자) : 호스트가 속한 네트워크를 특정하기 위해 사용
-
호스트 주소(호스트 ID, 호스트 식별자) : 네트워크에 속한 호스트를 특정하기 위해 사용
⚠️ 이 때 하나의 IP 주소에서 네트워크 주소를 표현하는 크기와 호스트를 표현하는 크기가 유동적일 수 있음