Computer Science/Http 웹 지식

1. 인터넷 네트워크 - HTTP 웹 기본 지식

sh1mj1 2023. 1. 6. 01:17

이 글은 배민 기술이사 김영한 이사님의 인프런 강의 "모든 개발자를 위한 HTTP 웹 기본 지식" 을 기반으로 작성되었습니다. 문제 시 삭제 조치하겠습니다.

목차는 아래와 같습니다.

  • 인터넷 통신
  • IP(인터넷 프로토콜)
  • TCP, UDP
  • PORT
  • DNS

인터넷 통신

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

https://blog.kakaocdn.net/dn/bii2K5/btrC4gsii0Z/FO3kksKqcICRwKz1HxAes1/img.png

)

https://blog.kakaocdn.net/dn/cTcf3m/btrC7z5IXCU/lQYwKWBVeyYSOYWfyLIr8K/img.png

만약, 클라이언트와 서버가 가까이 있으면 케이블로 2PC를 연결하여 통신할 수 있다.

 

https://blog.kakaocdn.net/dn/caiie2/btrC7IuQjrW/Uc3L6J7EPH4QGSfaBYq3R0/img.png

하지만, 클라이언트와 서버의 거리가 멀면 그 사이에 있는 인터넷망을 통해서 Hello,world 라는 메시지를 보내야 한다.

b. 복잡한 인터넷 망

그런데 인터넷망은 너무 복잡합니다!
클라이언트(출발지)에서 인터넷 망 내부의 수많은 중간 노드(서버)를 거쳐 메시지를 서버(목적지)로 전달해야 한다.
그럼 어떤 규칙으로 수많은 노드들을 거쳐 목적지에 메시지를 전달할까요?

이를 이해하기 위해 IP 에 대해 이해해야 합니다.

IP(인터넷 프로토콜)

a. IP 주소 부여

https://blog.kakaocdn.net/dn/bl86nV/btrC6e2nWBF/XSlL28JR1VGNFQGoHuIbt0/img.png

메세지를 전달하기 위해서 클라이언트(출발지)와 서버(목적지)의 IP주소가 부여된 상태여야 한다.

b. IP(인터넷 프로토콜) 역할

  • 지정한 IP 주소(IP Adress)에 데이터 전달
  • 패킷(Packet)이라는 통신 단위로 데이터 전달
  • 클라이언트에서 여러 중간 노드를 거쳐서 서버로 데이터가 도착한다.
    • 중간 노드끼리 통신을 하면서 최적의 경로를 찾습니다. 

c. IP 패킷 정보

https://blog.kakaocdn.net/dn/dniP9H/btrC9mdhnal/r5UvFVzbT1hFM0GcRkE4X0/img.png

데이터를 전달할 때는 패킷 단위로 데이터를 전달합니다.

즉, 전송 데이터(보낼 메시지)와 함께 출발지 IP(클라이언트 IP), 목적지 IP(서버 IP) 등을 함께 묶어서 패킷으로 만든 후 전달한다.

d. 클라이언트 패킷 전달

https://blog.kakaocdn.net/dn/VzeFn/btrC9Mv072p/skGPZwJWjEoOBhkoCvH29K/img.png

e. 서버 패킷 전달

https://blog.kakaocdn.net/dn/52Jw3/btrC9lyFK3K/ROiLdFVKrKKN7oqdtY9hLK/img.png

f. IP 프로토콜의 한계

1) 비연결성

  • 패킷을 받을 대상이 없거나 서비스 불능 상태임에도  패킷 전송을 시도할 수도 있습니다.

2) 비신뢰성

  • 만약 전송 도중에 패킷이 사라졌을 때 해결하기 어럽습니다.
  • 패킷이 순서대로 도착하지 않았을 때 해결하기 어렵습니다.

3) 프로그램 구분

  • 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상일 때 구분하기 어렵습니다.
    • e.g. 한 PC로 게임을 실행하고, 음악을 들으면 두 개의 애플리케이션이 실행되어 IP가 같습니다.
      그래서 두 애플리케이션을 구분하는 별도의 방법이 필요합니다.

아래 그림에서 조금 더 설명하겠습니다.

 

ƒ-1. 비연결성 - 대상이 서비스 불능 상태일 때 패킷 전송

https://blog.kakaocdn.net/dn/bB5YFe/btrC8A3U6ys/IpUZq0TVn10cPsTgV7N7B1/img.png

클라이언트(출발지)에서 패킷을 전송하려고 할 때, 대상 서버(목적지)의 상태는 알 수 없다.

그래서 항상 패킷을 보내게 되는 문제가 있습니다.

 

ƒ-2. 비신뢰성 - 패킷 소실

https://blog.kakaocdn.net/dn/1rP4y/btrC6ftomAt/AKSK53ajk40297dmEB3z81/img.png

만약 인터넷 망의 어떤 중간 노드(서버)가 문제가 생기면, 클라이언트(출발지)에서 보낸 패킷이 유실되는 문제가 있습니다.

 

f-3. 비신뢰성 - 패킷 전달 순서 문제 발생

https://blog.kakaocdn.net/dn/cxRTRi/btrC8S4z5vi/ZvAYzVkbCayOBLJLXGS9H0/img.png

패킷의 용량이 매우 클 때, 패킷을 분리해서 보내게 되는데 그 패킷들이 모두 같은 경로로(같은 노드들을 거쳐서) 이동하는 것은 아니기 떄문에, 패킷 전달 순서가 보장되지 않는 문제가 있다.

 

그렇다면 이러한 문제점과 한계점을 보완해주기 위한 별도의 방법이 있어야 겠죠? 대표적인 것이 TCP. 입니다.

TCP, UDP

앞서 보았던 IP 프로토콜의 한계점들을 해결해 주는 것이 바로 TCP 다.

여담으로 TCP 는 냉전시대 때 처음으로  미국이 군 부대의 네트워크를 연결하기 위해서 만들었다고 하네요~

 

a. 인터넷 프로토콜 스택의 4계층 (TCP/IP Ref Model)

OSI Ref Model 과는 조금 다릅니다. 아래와 같습니다.

 

https://blog.kakaocdn.net/dn/tnQJh/btrC6IJcnG3/YkzE7NuhBc8gOFzbVkv8KK/img.png

b. 프로토콜 계층

채팅 프로그램에서 Hello, world! 라는 메시지를 보내는 상황을 가정해봅시다.

https://blog.kakaocdn.net/dn/bHHuMz/btrC6HwL9Mu/5gSYGCeY71KVnNkf2MOte0/img.png

 

1) 채팅 프로그램이 Hello, world! 라는 메시지를 생성한다.

2) 생성된 메시지를 SOCKET 라이브러리를 통해 OS 계층에 넘긴다.

3) OS 계층TCP 계층에서 메세지 데이터(Hello, world!)를 포함해 TCP 정보를 생성한다.

4) OS 계층IP 계층에서 TCP 정보를 포함해 IP 패킷을 생성한다.

  • IP 패킷: (IP 관련 정보 + (TCP 관련 정보 + (메시지 데이터) ) )

5) IP 패킷이 LAN 카드를 통해 나갈 때 Ethernet Frame 이 포함되어 나간다.

  • Ethernet Frame: LAN 카드의 MAC 주소 등 물리적 정보가 포함됨

일단은 웹/HTTP 개발 공부에서는 IP 프로토콜까지만 깊이있게 공부합시다.

c. IP 패킷 정보

https://blog.kakaocdn.net/dn/W7Uq5/btrC7zFhMMo/RELYCQqwSECi63AYCHPw61/img.png

d. TCP/IP 패킷 정보

https://blog.kakaocdn.net/dn/B8gh0/btrC9MJULPM/U6sFoTrKhDCcYFwCPkdW51/img.png

TCP 정보가 추가되면서 IP의 한계점이 해결되었다.

  • TCP 정보: 출발지 PORT, 목적지 PORT, 전송 제어, 순서, 검증 정보 등..

e. TCP(전송 제어 프로토콜) 특징

1) 연결지향 - TCP 3 way handshake(가상 연결)

  • 먼저 연결을 한 다음 메시지를 보냅니다.
  • 여기서 말하는 연결은 물리적인 연결이 아닌, 논리적인 연결이다!
  • 이 연결 통로를 Session 이라고 하기도 합니다.

2) 데이터 전달 보증

  • 패킷 손실이 되어 서버가 메시지를 받지 못한 경우, 클라이언트가 알 수 있음

3) 순서 보장

4) 신뢰할 수 있는 프로토콜

 

현재는 대부분 TCP 사용합니다.

간단하게 위의 4가지 특징을 가집니다. 그림을 통해 더 자세히 알아봅시다.

 

e-1. TCP 3 way handshake

1) 클라이언트가 서버에게 접속을 요청하는 SYN을 보냄

2) 서버가 SYN을 받았으면, 서버에서 클라이언트로 접속을 요청하는 SYN과 함께 ACK를 보냄

3) 클라이언트가 SYN을 받았으면, 서버로 ACK를 보냄

3 way handshake 후, 클라이언트와 서버는 서로 연결되었다는 것을 인식한다!

4) 클라이언트가 서버로 데이터를 전송한다. (요즘은 3번 단계에서 ACK와 함께 데이터를 보내기도 함)

 

e-2. 데이터 전달 보증

https://blog.kakaocdn.net/dn/cptro1/btrC8mrBzpJ/kbgkiO1msEWX1iCxnTT3K1/img.png

클라이언트가 데이터를 전송하고 서버가 데이터를 받았으면 클라이언트로 응답을 해준다.

 

e-3. 순서 보장

https://blog.kakaocdn.net/dn/bmNItW/btrC8mZrjhA/mcCFE2tPuktOhaOElls6ek/img.png

클라이언트에서 패킷을 보낸 순서대로 서버로 오지 않으면 서버가 클라이언트에 다시 순서대로 패킷이 전송되도록 요청한다.

 

f. UDP(사용자 데이터그램 프로토콜) 특징

UDP 는 단순하게만 정리합시다.

  • 3 way handshakeX , 데이터 전달 보증X, 순서 보장X
    → 클라이언트에서 추가 작업을 해줘야 함. (브라우저가 해주는 듯)
  • 단순하고 빠름
  • IP와 거의 유사(PORT, checksum 정도만 추가됨)
  • 애플리케이션에서 추가 작업 필요

PORT

a. 한 번에 둘 이상 연결해야 하면?

이제는 클라이언트 PC에서 게임, 화상통화, 웹 브라우저 요청도 하고 있는 상황을 가정해봅시다.

즉, 클라이언트 PC가 여러 개의 서버와 통신해야 하는 상황이죠.

https://blog.kakaocdn.net/dn/b1kAyI/btrC6IWCKUl/2xGF9CCiDLt9YlgTTzfd6k/img.png

서버가 클라이언트 PC로 패킷을 보내려면 클라이언트 IP로 패킷을 보내야한다.

하지만 IP만 사용하면, 클라이언트 입장에서는 받은 패킷이 게임, 화상통화, 웹브라우저 요청 중 어떤 프로그램으로 온 패킷인지 알 수 없는 문제가 있다.

그래서 프로그램을 구분하기 위해 PORT를 사용한다.

b. TCP/IP 패킷 정보

https://blog.kakaocdn.net/dn/blZYOg/btrC9LYlOco/9RiKwrec1oKkJmzqOdeVNK/img.png

위의 그림에서도 그렇듯 TCP/IP 패킷에는 출발지 IP, 목적지 IP와 함께 출발지 PORT, 목적지 PORT 가 포함되어 있습니다.

  • IP : 목적지 서버를 찾는 용도
  • PORT : 서버 내부에서 돌아가는 애플리케이션을 구분하는 용도
  • 예를 들어 TCP/IP 프로토콜로 수신한 데이터가 어떤 목적의 데이터인지 수신한 컴퓨터 내부에서 판단하기 위함!!!

c. PORT - 같은 IP 내에서 프로세스 구분

https://blog.kakaocdn.net/dn/cVJxaM/btrC6eO2bdq/Dpcb6GPYFmOtGuj5jAvnmK/img.png

PORT

  • 0 ~ 65535 할당 가능
  • 0 ~ 1023: 잘 알려진 포트, 사용하지 않는 것이 좋음
  • FTP - 20, 21
  • TELNET - 23
  • HTTP - 80
  • HTTPS - 443

DNS

IP 는 숫자의 연속으로 이루어져 있습니다. 그래서 아래와 같은 번거로움이 있지요.

 

a. IP는 기억하기 어렵다.

https://blog.kakaocdn.net/dn/c1SKsf/btrC7zd2x78/sQG7DHHbqecbRC30l02e2K/img.png

 

b. IP는 변경될 수 있다.

https://blog.kakaocdn.net/dn/nIJTp/btrC7A4Jn8Z/ZSn0LvMLK6Yvi8TujEz3u1/img.png

그리고 우리는 어떤 사이트에 접속할 때 저렇게 직접 IP 을 입력하지 않습니다.

 

c. DNS(Domain Name System)

DNS 도메인 명을 IP 주소로 변환시켜주는 것입니다. 일종의 전화번호부 역할을 하는 것입니다.

 

d. DNS 사용

https://blog.kakaocdn.net/dn/dufxSN/btrC8CaeOTI/UO4k3HkhKGudX8Okfya8gk/img.png

 

위 그림처럼 DNS 서버에 도메인 명에 대한 IP 주소를 등록해둡니다. 그리고 아래와 같은 과정을 거칩니다.

 

1) 클라이언트가 DNS 서버에 도메인 명에 대한 IP를 요청한다.

2) DNS 서버는 해당 도메인 명에 대한 IP 주소를 클라이언트에 전달한다.

3) 클라이언트는 해당 IP주소로 서버에 접근한다.

→ DNS를 사용하면 IP가 기억하기 어렵고, 변경될 수 있는 문제를 해결해준다.

 

설명하는 내용에 그림이 매우 많아서 이해하기는 어려움이 없었을 겁니다.

바로 다음 내용으로 넘어가 봅시다. 다음 글에서는 URI  와 웹 브라우저 요청 흐름 관련입니다.