본문 바로가기
Computer science

[HTTP] 인터넷 프로토콜이 뭐야?(IP, TCP, UDP)

by Jiyoon-park 2021. 12. 24.

😎 TL;DR

복잡한 인터넷 망에서 메세지를 주고 받기 위해서는 IP 프로토콜이 필요하다. 하지만 IP 프로토콜은 여러 한계(비연결성, 비신뢰성, 프로그램 구분 불가능)를 가지고 있어 메세지가 잘 도착했는지 도무지 확신할 수가 없다.

IP 프로토콜이 가진 이런 한계를 보완하는 기능들을 가진 프로토콜이 등장하게되는데, 바로 TCP 프로토콜 이다. TCP 프로토콜은 3 way handshake, 데이터 전달 보증, 순서 보장과 같은 기능을 가지고 있어 믿을 수 있다.

TCP 프토토콜과 같은 전송 계층의 친구로 UDP 프로토콜도 있는데, 이 프로토콜은 포트 정보만 추가되고 TCP가 가진 기능들은 없는 백지같은 프로토콜이다. 아무 기능없는데 왜 사용하냐 의문일 수 있겠지만, 이렇게 단순한 덕분에 빠르고 기능 덧붙이기도 좋다는 장점이 있다.

IP(인터넷 프로토콜)

택배를 보낸다고 가정해보자. 택배차의 수많은 택배들이 각각 목적지까지 배송될 수 있음은, 택배 박스에 보내는 사람과 받는 사람의 주소가 적혀져 있기 때문이다. IP 프로토콜은 택배 박스의 주소와 같다. 인터넷은 아주 복잡한 망으로 연결되어 있다. 클라이언트에서 보낸 데이터가 서버로 도착하고, 서버에서 보낸 데이터가 클라이언트로 잘 도착할 수 있음은 이런 IP 프로토콜(인터넷 프로토콜) 덕분이다.

인터넷 프로토콜을 아래와 같이 데이터를 전달한다.

  • 지정한 IP 주소에 패킷이라는 통신 단위로 데이터를 전달한다
  • IP 패킷 정보(출발지 IP, 목적지 IP, message...)를 인터넷 망에 던지면, 노드끼리 목적지까지 패킷 정보를 던진다. 그럼 최종적으로 목적지 IP 주소까지 도달하게 된다. => 클라이언트 패킷 전달
  • 목적지에 도착하면, 반대로 성공했다는 메세지를 서버에서 클라이언트로 던진다. => 서버 패킷 전달

 

하지만, IP 프로토콜에는 💩한계💩 가 있다.

  • 비 연결성
  • 서버의 상황을 클라이언트가 알 방법이 없다. 패킷을 받을 상대가 없거나 서비스가 불능 상태여도, 패킷은 전송된다.
  • 비 신뢰성
  • 패킷이 전송되다가 중간에 소실되어도 클라이언트는 알 수 없다. 더불어 클라이언트가 큰 메시지를 여러개로 끊어 순서대로 보냈을 때, 클라이언트가 보낸 순서대로 서버에 도착할 것이란 보장이 없다.
  • 프로그램 구분 불가능
  • 같은 IP를 사용하는 애플리케이션이 여러개일 때, 어떤 애플리케이션 클라이언트가 패킷을 보낸 것인지 구분할 수 없다.

 

이러한 이유들로, IP 프로토콜로 메세지를 보냈을 때, 해당 메세지가 제대로 도착했는지 확신하기엔 어려움이 따른다. 그래서, 이런 IP 프로토콜을 보완해줄 수 있는 프로토콜이 나오는데, 그게 바로 ✨TCP✨ 이다.

TCP(전송 제어 프로토콜)

TCP는 세그먼트라는 통신 단위로 데이터를 전달하며, 세그먼트 내에는 출발지 *PORT, 목적지 PORT, 전송 제어, 순서, 검증 정보 등의 정보가 함께 들어있다.

 

* PORT란?

같은 IP 안에서 동작하는 애플리케이션을 구분하기 위해서 사용된다. IP가 아파트라면, PORT는 몇동 몇호이다. 애플리케이션마다 PORT 번호를 구분해 사용하기 때문에, 어떤 애플리케이션이 보낸 데이터인지 구분할 수 있다.

 

해당 정보들을 가지고, TCP는 IP를 보완해 신뢰할 수 있는 데이터 송수신을 한다. TCP의 대표적인 특징들을 살펴보자면, 연결지향(3way handshake), 데이터 전달 보증, 순서 보장 등이 있다.

  • 연결 지향: TCP 3 way handshake를 통해 클라이언트와 서버와의 연결을 확인하고 데이터를 전송한다.❗️여기서 중요한 것은, 가상 연결이라는 것이다. 연결되었다는 것이 클라이언트와 서버 사이에 존재하는 수많은 노드들이 다 연결되었다는 뜻이 아니다. 데이터 전송을 위한 랜선이 보장되었다고 이해하기 보다는, 그냥 논리적으로 클라이언트랑 서버가 연결되었구나~~ 하는 연결이다.
  • SYN : 접속요청 / ACK : 요청 수락
    • 클라이언트 => SYN => 서버
    • 클라이언트 <= SYN + ACK <= 서버
    • 클라이언트 => ACK => 서버
  • 데이터 전달 보증: 클라이언트가 서버로 데이터를 전달하고 서버가 받았다면, 나 잘 받았어! 라고 서버에서 클라이언트로 응답을 보내준다.
  • 순서 보장: 클라이언트에서 보낸 순서대로 서버에 도착하지 않는다면, 잘못된 순서에 대해서 다시 보내달라고 클라이언트로 요청한다. 순서를 어떻게 아냐고? TCP 세그먼트 안에 순서 정보가 있다 👏

인터넷 프로토콜 스택 4계층 중 전송 계층인 TCP 와 같은 계층에 있는 인터넷 프로토콜이 하나 더 있다. UDP. UDP는 비교적 간단하게 소개하고 넘어가려한다.

UDP (사용자 데이터그램 프로토콜)

  • TCP와 같은 계층에 있는 프로토콜이다.
  • 하얀 백지 같은 친구이다. 기능이 거의 없다. TCP처럼 연결 지향도 아니고, 데이터 전달을 보증하지도 않고, 순서를 보장하지도 않는다. 다만, PORT 가 추가된다.
  • 그럼에도 불구하고 요즘 UDP가 뜨고 있는데, TCP와 같은 기능들이 없어 단순하고 속도가 빠르기 때문이다. 백지이기 때문에 기능을 추가하기에도 좋다.