정글 49일차

윤종성·2024년 8월 19일
0

CSAPP

목록 보기
3/5

11. 네트워크 프로그래밍

11-1. 클라이언트-서버 프로그래밍 모델

모든 네트워크 응용 프로그램은 클라이언트-서버 모델에 기초한다.
이 모델에서 응용(Application)은 한 개의 서버 프로세스와 여러 개의 클라이언트 프로세스로 구성된다.[^11-1]
클라이언트-서버 모델에서 근본적인 작업은 트랜잭션 transaction이다.
트랜잭션은 클라이언트-서버 간 요청을 주고 받거나 작업을 처리하는 것으로 네 단계로 구성된다:

  1. 클라이언트가 서비스를 요구하기 위해, 요청 request을 서버에 보낸다.
  2. 서버는 요청을 받아 해석하고, 서버의 자원(resource)을 조작한다.
  3. 서버는 응답 response을 클라이언트로 보내고 다음 요청을 기다린다.
  4. 클라이언트는 응답을 받아 처리한다.

클라이언트-서버 모델 구분 이점

[^11-1]: 클라이언트-서버 모델에서의 클라이언트와 서버는 프로세스이다. 머신, 호스트가 아니므로 하나의 호스트 내에 클라이언트 프로세스와 서버 프로세스를 모두 갖는 것이 가능하다.

11-2. 네트워크

네트워크란 여러 컴퓨터들을 그물망처럼 연결한 통신 형태를 뜻한다.
많은 서비스들이 네트워크를 이용하여 제공되고 있다.

11-2-1. 네트워크 계층

네트워크는 각기 다른 위계 Hierarchy를 갖는 계층구조 시스템으로 이해할 수 있다.
계층으로 나누어 설명하는 이유는:

  • 모듈화: 각 계층이 독립적으로 역할만 수행하게 한다. 유지보수와 확장이 쉬워진다.
  • 호환성: 다양한 기술을 사용하는 기기들 간 통신을 가능하게 한다. 각 계층에서 표준 인터페이스를 제공한다.

OSI 모델은 이론적인 목적으로 ISO에서 제안한 반면, TCP/IP 모델은 ARPANET(인터넷의 전신)과 함께 발전한 실용적인 모델이다.

서로 다른 기술을 사용하는 네트워크와 통신하기 위해서, 각 계층에서는 하위 계층에서 요구되는 형식으로 헤더를 추가하여 데이터를 변환한다.
그림을 예시로 들면 TCP/IP 4계층에서 전송 계층은 응용 계층에서 받은 데이터가 텍스트이든 이미지이든 헤더를 붙여 변환한다. 인터넷 계층에서도 마찬가지로 전송 계층에서 TCP/UDP 어떤 프로토콜을 사용하든 헤더를 붙여 전송 가능한 데이터그램으로 만든다. 네트워크 엑세스 계층에서도 헤더를 붙여 프레임으로 만들고 비트로 변환하여 전송된다.
이런 변환 방식을 반복하면 최종적으로는 통일된 형식의 비트(데이터의 가장 미시적 단위)로 변환할 수 있으며 이런 상위 계층의 데이터를 감싸는 변환 방식을 캡슐화 encapsulation라고 한다.
캡슐화를 사용하면 각 계층에서 어떤 프로토콜을 사용하든 동일한 형식으로 전송할 수 있으며 인터넷 통신 방식의 핵심이다.
요약하자면, 계층화가 필요한 주된 이유는 계층 내 서로 호환되지 않는 기술을 하위 계층의 동일한 기술로 변환할 수 있도록 만들기 위해서이다.

OSI 7계층:

  1. 물리 계층 (Physical Layer, L1): 비트를 전기 신호, 빛, 또는 무선 신호로 바꿔 물리적 매체를 통해 전달
  2. 데이터 링크 계층 (Data Link Layer, L2): 프레임을 사용해 물리 계층에서 안전한 전송(오류 검사 등)을 도움, MAC 주소를 통해 데이터 전송 경로를 관리
  3. 네트워크 계층 (Network Layer, L3): 패킷을 생성하고 IP 주소를 기반으로 네트워크 간의 경로를 결정
  4. 전송 계층 (Transport Layer, L4): 세그먼트(TCP/UDP)를 사용해 연결을 설정
  5. 세션 계층 (Session Layer, L5): 세션을 설정하고 관리하며, 데이터 교환의 시작과 종료를 제어
  6. 표현 계층 (Presentation Layer, L6): 데이터 형식과 인코딩을 처리하며, 암호화, 압축 등을 통해 데이터 표현을 통일
  7. 응용 계층 (Application Layer, L7): 사용자가 직접 접하는 응용 프로그램과 네트워크 간의 인터페이스를 제공, 다양한 네트워크 서비스를 지원

11-2-2. 일반 개념으로서 인터넷

일반적인 개념으로서의 인터넷 internet을 우리가 실제로 사용하고 있는 Internet, global IP Internet의 맥락(컨텍스트)에서 저수준 계층부터 설명한다.
인터넷은 (로컬)네트워크들 간의 연결을 구현한 것이다.

앞으로 사용하는 용어 중 개념을 가리키는 일반적인 용어(LAN, 네트워크 세그먼트, 인터넷 주소, 전송 프로토콜 등)와 개념을 구현한 기술을 가리키는 용어(주로 TCP/IP 컨텍스트에서. 이더넷/802.11, 이더넷 세그먼트, IP 주소, TCP/UDP 등)를 구분해야 한다.

11-2-2-1. 이더넷

가장 작은 단위의 네트워크는 LAN Local Area Network이며 사무실 내의 내부망을 떠올릴 수 있다.
이더넷 Ethernet은 이런 LAN을 구현한 기술로 1970년대 이래 진화를 거쳐 속도와 안정성이 높아졌다.

11-2-2-1-1. 이더넷 세그먼트(L1)

이더넷 세그먼트(이더넷 기술 외의 일반적인 표현은 네트워크 세그먼트)는 호스트와 허브로 구성된다.[^11-2]

  • 호스트: 네트워크에 연결된 컴퓨터나 기타 장치
  • 허브: 물리포트로 들어온 데이터를 다른 물리포트로 복사하는 장치. 물리 계층(L1)에서 동작한다.
    허브에 연결된 모든 호스트가 동일한 신호를 공유하게 된다.
    따라서 허브에 연결되어 있는 호스트들은 하나의 세그먼트 안에 있게 된다.
    호스트는 프레임(물리 계층에서의 데이터 단위)이라고 부르는 비트들을 다른 호스트로 보낼 수 있다.
    같은 신호를 공유하는 호스트들이 선택적으로(특정 호스트를 지정해서) 통신하기 위해서 각 호스트마다 주소를 사용하며 이를 MAC 주소라고 한다.
    각 이더넷 어댑터(호스트가 이더넷으로 전송하기 위해 사용하는)는 고유한 주소인 MAC 주소를 가진다.
    프레임은 프레임의 발송지 MAC 주소와 목적지 MAC 주소, 프레임의 길이를 보낼 데이터 앞에 헤더로 추가하여 발송한다.
    세그먼트 내의 모든 호스트가 프레임을 수신[^11-7]하지만 프레임 헤더의 목적지 주소와 일치하는 목적지 호스트만이 읽어들인다.

허브는 모든 신호를 모든 포트로 복사하기 때문에 호스트들이 동시에 발송을 시도하는 경우 충돌이 발생한다.
이를 이더넷 세그먼트 내의 호스트들이 하나의 충돌 도메인 Collision domain에 있다고 한다.

[^11-2]: 허브를 이용하지 않고 단일 호스트로만 세그먼트를 구성할 수도 있다.
[^11-7]: 의도한 것이 아니라 자연스럽게 모든 호스트가 프레임을 수신하도록 하게 된다. 호스트들은 같은 통신 기술을 공유하고 신호(이더넷 같은 유선 통신에서는 전기신호)를 주고 받을 수 있는 상황에 놓여지기 때문이다. 후술할 인터넷 프로토콜이 필요한 이유, 브로드캐스트 도메인이 각 네트워크 세그먼트로 한정되는 이유로 연결되는 중요한 아이디어이다.

11-2-2-1-2. 브릿지로 연결된 이더넷 세그먼트(L2)

브릿지를 사용하여 충돌 도메인을 분리하고 둘 이상의 이더넷 세그먼트를 연결할 수 있다.
이를 브릿지형 이더넷 세그먼트 *Bridged Ethernet Segments**이라고 한다.

  • 브릿지: 이더넷 세그먼트를 연결하는 장치. 허브와 달리 브릿지는 프레임을 수신하면 목적지 MAC 주소를 확인하고 해당 주소가 위치한 세그먼트로만 복사(포워딩 forwarding 또는 스위칭 switching)하여 충돌을 방지한다. 헤더를 읽어들이므로 데이터 링크 계층(L2)에서 동작한다.
    브릿지는 프레임 헤더의 발신자 MAC 주소를 확인해 장치들의 물리포트 위치를 학습하여 프레임을 포워딩한다.
    학습되지 않은 MAC 주소를 도착지로 하는 프레임은 모든 포트로 보내게 된다.

스위치[^11-3] 역시 헤더를 조회해 브릿지처럼 이더넷 세그먼트를 연결하며 충돌 도메인을 분리한다.
그러나 브릿지는 소프트웨어를 기반으로 CPU와 소프트웨어가 MAC 주소 테이블을 관리하고 프레임 포워딩하는 반면, 스위치는 전용으로 설계된 ASIC와 TCAM을 이용하여 하드웨어적으로 처리한다.
따라서 브릿지에 비해 처리 속도가 매우 빠르므로 대규모 네트워크 환경에 유리하며 포트 수도 보통 수십개이다.

[^11-3]: 스위치는 프레임을 받고 적절한 경로를 결정해 발송(포워딩)해주는 네트워킹 장비를 말한다. 하지만 일반적으로 '스위치'라고만 하면 L2에서 작동하는 스위치를 의미하며, 다른 계층에서 작동하는 스위치는 L3 스위치, L4 스위치 등으로 구분해 부른다. 허브는 항상 모든 포트로 발송하므로 스위치가 아니다.

11-2-2-2. IP(L3)

internet은 둘 이상의 network(예를 들어 이더넷)들을 연결한 것(inter-network)이다.
주로 라우터[^11-4]를 이용해 네트워크들을 연결하게 된다. 즉, 라우터는 네트워크(또는 브로드캐스트 도메인[^11-5])을 구분한다.
하나의 라우터로 연결된 네트워크들을 가장 작은 internet이라고 생각할 수 있다.

  • 라우터: 다른 네트워크 간 데이터를 전달하는 컴퓨터. 최종 목적지 호스트가 아닌 프레임 어느 네트워크로 보낼 지만을 결정하므로 네트워크 계층(L3)에서 동작한다.

[^11-4]: 라우터는 일반 컴퓨터로도 구성할 수 있으나 주로 라우터 전용으로 나온 컴퓨터 단말을 사용한다.
[^11-5]: 브로드캐스트란 목적지 호스트를 정하지 않고 네트워크의 모든 호스트에 발송하는 것을 말한다. 라우터는 브로드캐스트를 수신해도 다른 물리포트로 포워드하지 않으므로 각 물리포트들은 다른 브로드캐스트 도메인에 있게 된다. 브로드캐스트는 한 번의 신호 발송으로 네트워크 내의 모든 호스트들에 전달하는 것이므로 라우터가 복사하여 전달할 필요도 없으며 해서도 안 된다.

MAC 주소를 이용한 통신은 같은 기술을 사용하는 호스트 간에 사용했다.
되짚어 보자면, 이더넷이나 와이파이와 같이 서로 같은 방식의 물리 신호를 주고받을 수 있는 상황에서 호스트를 선택적으로 통신하기 위해서 MAC 주소를 사용했다.
다르게 말하면 MAC 주소로는 다른 종류의 네트워크와 통신할 수 없다.
LAN 내부에서 통신했던 것과 달리 LAN들은 서로 호환되지 않는 기술들을 사용할 수 있다.
따라서 다른 네트워크로는 직접 통신이 불가능할 수 있다.
예를 들어 이더넷은 유선 통신으로 구현된 LAN이지만 WLAN은 무선통신으로 구현되었으므로 이더넷에서 WLAN으로는 직접 통신할 수 없다.
이렇게 비호환 네트워크일 수 있는 다른 LAN과 통신하기 위해서는 새로운 규약(인터넷 프로토콜)이 필요하다.
인터넷 프로토콜은 호스트들과 라우터들이 데이터를 전송하는 방법을 규정한 것이며 우리가 사용하는 인터넷(Global IP Internet)은 IP Internet Protocol를 사용한다.

IP를 포함한 인터넷 프로토콜은 아래 두 가지 기본 기능을 가지고 있다.

  1. 명명법 Naming scheme
    호스트의 주소로 사용할 통일된 형식을 정의한다.
    각 호스트는 internet 주소를 한 개 이상 가지고 있다.
    IP에서는 IP 주소와 포트를 사용한다.
    [[#11-3-1. IP 주소|IP주소에 대한 자세한 설명]]은 뒤에서 하기로 하고 일단은 IP에서 사용하는 주소라고만 하겠다.

  2. 전달기법 Delivery mechanism
    서로 다른 길이와 인코딩 방식의 데이터를 통일된 방식으로 묶기 위해서, 데이터 비트를 패킷(IP에서는 데이터그램으로도 부름)이라는 단위로 묶는 방법을 정의한다.
    패킷은 패킷 크기, 소스 호스트 주소(IP 주소), 목적지 호스트 주소(IP 주소)를 포함하는 헤더를 데이터 앞에 붙여 구성한다.

    (IP에서 패킷의 예)
    IP를 통해 통신하는 모든 호스트들은 고유한 IP주소를 가지고 있다.
    네트워크가 하나의 외부 IP를 공유하는 경우에는 네트워크 내 호스트들은 고유한 내부 IP를 가지고 있다.

네트워크 간 IP로 통신하는 방식:
다른 네트워크의 호스트와 데이터를 주고 받을 때엔 MAC 주소 대신 규약으로 정해진 주소(명명법, IP 주소)가 포함된 헤더를 데이터 앞에 추가하게 된다. 이를 데이터그램/패킷이라고 한다.
이 패킷을 네트워크 내에서 주고 받을 때에는, 하위 계층의 헤더(MAC 주소)가 추가로 붙게 되므로 실제 1계층에서 주고 받게 되는 데이터는 (프레임 헤더)+(패킷 헤더)+(패킷 데이터) 의 형태가 된다.

  1. 호스트는 다른 네트워크로 데이터를 보내기 위해 목적지 IP주소를 기록한 패킷 헤더를 데이터에 추가하고, 라우터의 MAC 주소를 기록한 프레임 헤더를 더해 발송한다.
  2. 라우터는 미리 다른 라우터들과 교신을 통해서 주변 네트워크들의 정보를 기록해둔 라우팅 테이블을 만들어 놓는다. 프레임을 수신하면 프레임데이터그램 헤더에서 읽은 도착지 IP 주소를 라우터 테이블과 비교해 적절한 다음 경로의 MAC 주소로 발송한다(라우팅).
  3. 이런 과정을 반복해 도착지 네트워크로 진입하게 되면, 라우터는 포트 번호 별로 할당된 내부 IP 테이블을 사용해 도착지 주소를 내부 IP로 변경한다(NAT[^11-6]).
  4. 라우터가 내부 IP에 해당하는 MAC 주소로 프레임을 생성하고 적절한 물리포트를 결정하여 발송하면 네트워크 세그먼트로의 전달이 완료되고 이후에는 하위 계층(L2, L1)의 통신방식을 통해 호스트로 전달된다.

[^11-6]: 내부 네트워크의 호스트들은 사설(내부) IP 주소를 사용한다. 인터넷에 접속하기 위해서는 공인(외부) IP 주소가 필요하며, 하나의 공인 IP 주소를 사용하여 모든 내부 호스트가 외부 인터넷과 통신한다. NAT는 같은 공인 IP를 사용하더라도 포트 번호를 사용하여 내부 호스트들을 구분할 수 있게 하는 기술이다. 내부 호스트가 외부 인터넷에 패킷을 보내면, 라우터는 패킷의 출발지(내부 호스트) IP 주소를 공인 IP 주소로 변환한다. 이와 함께, 포트 번호도 변환하여 NAT 테이블에 기록한다(NAT 테이블). 이 포트 번호는 내부 호스트와의 세션을 식별하는 데 사용된다. 라우터는 외부에서 오는 (공인 IP와 포트번호를 가진) 응답 패킷을, NAT 테이블을 참조하여 원래의 내부 IP 주소와 포트 번호로 변환하여 내부 호스트에 전달한다. 이 때 특정 포트 번호로 오는 패킷을 특정 내부 IP로 변환하여 보내도록(포워딩하도록) 변환하는 작업을 포트포워딩이라고 한다. 사용 중이거나 포트포워딩한 포트가 아닌 나머지 포트로 온 패킷을 모두 특정 내부 IP로 변환하여 보내도록 하는 것은 DMZ라고 한다.

네트워크 내에서 IP로 통신하는 방식
같은 기술을 사용하는 네트워크 안에서는 IP를 사용하지 않고도 통신할 수 있지만, 외부 네트워크와 같은 프로토콜로 통신하여야 하는 경우가 있을 수 있다.

  1. IP를 가진 호스트의 MAC 주소를 알아야하며, 이를 위해서 ARP 프로토콜을 사용한다. 발송하려는 호스트는 ARP 패킷으로 브로드캐스트[^11-5]로 IP주소를 가진 호스트의 MAC 주소를 요구한다. 해당 IP의 호스트가 패킷을 수신하면 자신의 MAC 주소를 회신한다. 이 정보는 ARP 테이블(캐시)에 저장되어 일정 시간동안은 ARP 요청을 다시 하지 않는다.
  2. 하위 계층(L2, L1)의 통신방식과 같다. MAC 주소를 포함한 프레임 헤더를 붙여 물리 신호를 발송한다.

라우터 요약:
라우터는 IP 주소를 기반으로 패킷을 라우팅 테이블에 따라 최적의 경로로 전달한다. 즉, 네트워크 간의 경로를 결정(라우팅)한다.
브로드캐스트 도메인을 분리하고 각 브로드캐스트 도메인을 독립적으로 관리한다.

알아두기(게이트웨이)
게이트웨이는 일반적으로 다른 프로토콜의 두 네트워크 간에 프로토콜의 변환 기능을 수행하는 장치
즉, 이질적인 망을 연결시키는 개체(Entity)를 가리키는 일반적인 용어
TCP/IP에서 볼 때는 망간의 연결을 담당하는 '라우터'를 의미 하기도 하나, 주로, 상위계층(L4-L7)에서 상이한 프로토콜들 간의 특수한 변환을 담당하는 서버를 의미함

(계속)

profile
알을 깬 개발자

0개의 댓글