CS/네트워크

[네트워크] 인터넷 네트워크와 URI

2025. 8. 16.

인터넷에서 컴퓨터 둘은 어떻게 통신할까?

클라이언트와 서버가 인터넷 망을 통해 Hello World 라는 메시지를 보내야 하는데 인터넷은 단순하지 않다. 수많은 중간 노드를 거쳐서 메시지가 전달되는 것이다. 그렇다면 어떤 규칙으로 전달되는 것일까? 이를 이해하기 위해서는 IP(인터넷 프로토콜)에 대해서 학습해야 한다.

복잡한 망에서 메시지를 보내려면 최소한의 규칙이 있어야 한다.

이는 IP 주소를 통해서 가능해진다.

먼저 클라이언트와 서버는는 IP 주소를 부여 받아야 한다. (ex. 100.100.100.1)

여기서 인터넷 프로토콜은 지정한 IP 주소에 메시지를 전달할 수 있도록 정해놓은 규칙이다.

그래서 패킷이라는 통신 단위로 데이터를 전달한다.

메시지를 그냥 보내는 것이 아니라 IP 패킷이라는 규칙에 맞춰 보낸다.

IP 패킷에는 출발지 IP, 목적지 IP, 전송 데이터 등이 담긴다.

출발 100.100.100.1
목적 200.200.200.2
Hello World

1. 클라이언트 패킷 전달

인터넷 망이 IP 패킷을 던지면 IP 프로토콜 규약을 따르고 있던 서버(노드)들이 IP 패킷을 해석하고, 이에 맞는 노드에 도달하기 위해 위해 서로 IP 패킷을 던진다.

그렇게 최종적으로 해당하는 노드(200.200.200.2)에 도달한다.

2. 서버 패킷 전달

이를 전달받은 서버는 출발지 IP주소, 목적지 IP주소, 응답 메시지를 서버 패킷에 담아 클라이언트에 다시 전송하고, 노드들을 거쳐 클라이언트에게 도달하게 된다.

⚠️ 인터넷 망이 복잡하므로 요청 주소와 응답 주소가 엇갈릴 수 있다.

IP 프로토콜의 한계

  • 비연결성
    • 패킷을 받을 대상이 없거나 서비스가 불능 상태여도 패킷이 전송된다.
      • 클라이언트는 대상 서버가 패킷을 받을 수 있는 상태인지 모른다.
  • 비신뢰성
    • 중간에 패킷이 사라질 수 있다. (패킷 소실)
    • 패킷이 순서대로 도착하지 않을 수 있다. (패킷 전달 순서 문제)
      • 데이터를 나눠 보낼 때 도착하는 순서가 보장되지 않는다.
  • 프로그램 구분
    • 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상인 경우 구분하는 데 한계가 있다.

💡IP 프로토콜의 한계를 해결해주는 것이 TCP 프로토콜이다.

인터넷 프로토콜 스택의 4계층

  1. 애플리케이션 계층 - HTTP, FTP
  2. 전송 계층 - TCP, UDP
  3. 인터넷 계층 - IP
  4. 네트워크 인터페이스 계층

프로토콜 계층

  • 애플리케이션
    • 웹 브라우저, 네트워크 게임, 채팅 프로그램
      • 프로그램이 Hello World 메시지 생성
    • 소켓 라이브러리
      • SOCKET 라이브러리를 통해 전달
      • OS 계층에 Hello World 메시지를 넘긴다.
  • OS (운영체제)
    • TCP, UDP
      • TCP가 Hello World 메시지에 TCP 정보를 씌운다.
    • IP
      • 그 위에 IP에 관련된 정보들을 씌어 TCP/IP 패킷을 만든다.
  • 네트워크 인터페이스
    • LAN 드라이버, LAN 장비
      • TCP/IP 패킷이 LAN 카드를 통하여 나갈 때 이더넷 프레임이 포함되어 나간다.
        • 이더넷 프레임: MAC 주소 같은 물리적인 정보를 포함한다.

TCP/IP 패킷 정보

  • IP 패킷
    • 출발지 IP, 목적지 IP 등
  • TCP 세그먼트
    • 출발지 PORT
    • 목적지 PORT
    • 전송 제어
    • 순서
    • 검증 정보 등
  • 전송 데이터

TCP 특징

  • 전송 제어 프로토콜이다.
  • 연결 후 데이터를 전송하므로 연결 지향적이다.
    • TCP 3 way handshake (가상 연결)
  • 데이터 전달을 보증한다.
  • 순서를 보장한다.
  • 신뢰할 수 있는 프로토콜이다.
  • 현재는 대부분의 애플리케이션에서 TCP를 사용한다.

TCP 3 way handshake

논리적인 연결을 뜻한다.

<연결 과정>

SYN = 접속 요청, ACK = 요청 수락

  1. 클라이언트에서 SYN 메시지 전달
  2. 서버에서 SYN + ACK 메시지 전달
  3. 클라이언트에서 ACK 메시지 전달
  4. 데이터를 전달한다.

🗂️ ACK와 함께 데이터를 전송할 수 있다.

UDP 특징

  • 사용자 데이터그램 프로토콜이다.
  • 기능이 거의 없다. (하얀 도화지)
    • 연결 지향 x, 데이터 전달 보증 x, 순서 보장 x
  • 데이터 전달 및 순서가 보증되지 않지만 단순하고 빠르다.
  • IP와 거의 비슷하며, PORT와 체크섬 데이터를 가진다.
    • PORT: IP로 도착하는 패킷이 어느 애플리케이션에 사용되는지 구분 가능하게 한다.
    • 체크섬: 이 메시지가 맞는지 검증해주는 데이터이다.
  • 애플리케이션에서 추가 작업이 필요하다.
  • HTTP3가 최적화되어 UDP 프로토콜을 사용하게 되며 최근에 각광을 받고 있다.

PORT

하나의 IP 주소에 둘 이상 연결하는 경우 IP 내에서 프로세스를 구분할 수 있게 한다.

  • ex. 게임 서버 → 8090번 포트, 화상통화 통신 21000번 포트

TCP/IP 패킷에 포함된다.

0~65535까지 할당 가능하다.

0~1023은 잘 알려진 포트이므로 사용하지 않는 것이 좋다.

  • FTP - 20, 21
  • TELNET - 23
  • HTTP - 80
  • HTTPS - 443

DNS

IP 주소는 기억하기 어렵고 변경될 수 있다.

그러므로 전화번호부처럼 DNS(Domain Name System)가 사용된다.

DNS는 도메인명을 IP주소로 변환한다.

  1. DNS 서버에 도메인명과 IP 주소가 쌍으로 등록되어 있다.
  2. 클라이언트가 도메인명으로 접속 요청을 보냈을 때 DNS 서버에서 IP 주소를 응답으로 준다.
  3. 응답받은 IP 주소로 접속한다.

 

URI

Uniform Resource Identifier

리소스를 식별하는 통합된 방법이다.

  • Uniform: 리소스를 식별하는 통일된 방식이다.
  • Resource: 자원은 URI로 식별할 수 있는 모든 것을 뜻한다.
  • Identifier: 다른 항목과 구분하는 데 필요한 정보이다.

URI는 로케이터(locator), 이름(name) 또는 둘 다 추가로 분류될 수 있다.

  • URI
    • URL (Resource Locator)
      • 리소스가 있는 위치를 지정한다.
      • foo://example.com:8042/over/there?name=ferret#nose
    • URN (Resource Name)
      • 리소스에 이름을 부여한다.
      • 위치는 변할 수 있지만 이름은 변하지 않는다.
        • urn:example:animal:ferret:nose
        • urn:isbn:8960777331
        • URN 이름만으로 실제 리소스를 찾을 수 있는 방법이 보편화되어 있지 않다.

URL 분석

scheme://[userinfo@]host[:port][/path][?query][#fragment]
  • scheme
    • 주로 프로토콜을 사용한다.
    • 프로토콜은 어떤 방식으로 자원에 접근할 것인가에 대한 약속 규칙이다.
      • http, https, ftp 등
      • http는 80포트, https는 443포트를 주로 사용하며, 포트는 생략 가능하다.
      • https는 http에 보안을 추가한 것이다. (HTTP Secure)
  • userinfo
    • URL에 사용자 정보를 포함해서 인증하게 한다.
    • 거의 사용하지 않는다.
  • host
    • 호스트명
    • 도메인명 또는 IP 주소를 직접 사용 가능하다.
  • PORT
    • 접속 포트
    • 일반적으로 생략하며 생략시 http는 80, https는 443이다.
  • path
    • 리소스 경로 (path), 계층적 구조이다.
    • /home/file1.jpg
  • query
    • key=value 형태
    • ?로 시작하고 &로 추가한다.
    • query parameter, query string 등으로 불린다.
      • 웹서버에 제공하는 파라미터, 문자 형태
  • fragment
    • html 내부 북마크 등에 사용된다.
    • 서버에 전송하는 정보는 아니다.
https://www.google/com/search?q=hello#start
  • 프로토콜 (https)
  • 호스트명 (www.google.com)
  • 포트번호 (443)
  • 패스 (/search)
  • 쿼리 파라미터 (q=hello&hl=ko)

웹 브라우저 요청 흐름

<https://www.google/com/search?q=hello&hl=ko>
  1. 클라이언트(웹브라우저)가 위 주소로 접속한다.
  2. DNS 서버에서 해당 도메인를 조회한다.
  3. www.google.com:443 에 해당하는 IP 주소가 200.200.200.2임을 찾는다.
  4. 웹 브라우저가 HTTP 요청 메시지를 생성한다.
  5. GET /search?q=hello&hl=ko HTTP/1.1 HOST: www.google.com
  6. 웹브라우저에서 SOCKET 라이브러리를 통해 HTTP 요청 메시지(데이터)를 TCP/IP 계층에 전달한다.
    1. TCP/IP 연결을 한다. (3way handshake)
    2. 데이터를 전달한다.
  7. HTTP 요청 메시지를 포함한 TCP/IP 패킷을 생성한다.
  8. 패킷이 서버 목적지로 인터넷에 던져진다.
  9. 패킷을 받은 구글 서버는 TCP/IP 패킷을 까서 HTTP 요청 메시지를 해석한다.
  10. 구글 서버는 해석을 바탕으로 HTTP 응답 메시지를 생성한다.
  11. HTTP/1.1 200 OK Content-Type: text/html;charset=UTF-8 Content-Length: 3423 <html> <body>...</body> </html>
  12. 서버가 응답 패킷을 클라이언트로 보낸다.
  13. 이를 받은 웹브라우저는 응답 패킷을 까서 HTML을 렌더링한다.