-
[HTTP] IP, TCP, UDPHTTP 2024. 1. 3. 20:13
IP, TCP, UTP에 대해 알아보자.
____________________________________________________________________________________
1. IP (Internet Protocol)
서버와 클라이언트가 네트워크 상에서 데이터를 주고받기 위해 사용하는 프로토콜이다.
사진 출처 : 김영한 강사님의 '모든 개발자를 위한 HTTP 웹 기본 지식' 강의 (인프런) 데이터를 전송하기 위해서는 클라이언트의 위치 주소(출발지)와 서버의 위치 주소(목적지)가 필요한데, 이 위치 주소를 IP 주소라고 한다. 이 IP 주소들과, 전송하고자 하는 데이터를 패킷이라는 단위에 담아 클라이언트와 서버가 주고받는 방식을 인터넷 프로토콜(IP)라고 한다. 클라이언트가 전송한 패킷은 클라이언트-서버 사이의 여러 중간 노드들에 의한 n번의 전달 과정을 통해 목적지 IP에 맞는 서버에 도착하고, 서버가 패킷을 받아 해당 내부 로직을 수행하고 나면, 서버 역시 패킷을 만들어 똑같은 방식으로 클라이언트에게 전송한다.
다만, 인터넷 프로토콜만을 사용한 네트워크 통신은 거의 불가능하다.
첫 번째로, 목적지 IP로 설정된 대상 서버가 내부 점검 등의 다양한 사유로 인해 IP 패킷을 수신할 수 없는 경우, 심지어는 목적지 IP가 잘못 지정되어 패킷을 받을 대상이 존재하지 않는 경우, 혹은 중간 노드 서버들의 통신 장애가 발생한 경우, 클라이언트가 보낸 패킷은 서버에 도착하기 전에 중간에서 길을 잃게 된다. 또한, 패킷의 용량이 커지게 되면(=대략 1,500바이트 정도) 패킷을 n개로 끊어서 전송한다. 이 과정에서 분리된 n개의 패킷들은 모두 같은 경로가 아닌, 각자 다른 경로로 이동하게 되는데, 결국 최조적으로 서버에 도착하는 패킷의 순서가 꼬이게 되어 서버 측은 변질된 데이터를 수신하게 되는 것이다. 이 외에도, 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 두 개 이상인 경우, 클라이언트가 보낸 데이터를 어떤 애플리케이션이 받게 되는지 판단할 방법이 없게 된다.
____________________________________________________________________________________
2. TCP (Transmission Control Protocol)
사진 출처 : 김영한 강사님의 '모든 개발자를 위한 HTTP 웹 기본 지식' 강의 (인프런) 인터넷 프로토콜의 핵심 프로토콜 중 하나로, 클라이언트와 서버 간에 안정적으로, 오류 없이, 순서가 보장된 상태에서 데이터를 전송하는 방식이다. IP 패킷 내부에 TCP 세그먼트라는 단위가 존재하는데, TCP 세그먼트에는 출발지 PORT, 목적지 PORT, 전송 제어, 순서 등 데이터 전송에 필요한 여러 정보들이 들어있는데, 이 '정보'들이 바로 위에서 언급한 인터넷 프로토콜의 한계를 해결해준다.
TCP는 주로 IP와 함께 TCP/IP라는 명칭으로 사용하므로, 지금부터 그렇게 사용할 예정이다.
____________________________________________________________________________________
2-1. TCP/IP의 특징?
1) 연결 지향 (3 Way Handshake)
사진 출처 : 김영한 강사님의 '모든 개발자를 위한 HTTP 웹 기본 지식' 강의 (인프런) TCP/IP 프로토콜을 활용하여 데이터를 전송하기 전, 클라이언트와 서버는 다음과 같은 방식으로 연결된다.
[1] 클라이언트에서 서버로 SYN(Synchronized, 연결 요청) 메시지를 전송한다.
[2] 서버에서 ACK(Acknowledge, 요청 응답) 메시지와 함께, SYN 메시지를 클라이언트 측에 전송한다.
[3] 클라이언트가 서버로 ACK 메시지를 전송한다.
※ 최근에는 TCP/IP의 3 Way Handshake 방식에 대한 최적화가 잘 되어있는데, [3] 과정에서 클라이언트는 ACK 메시지만을 전송하는 것이 아니라, 보내고자 하는 패킷까지 같이 전송하여 데이터 처리 시간을 줄인다.
서버 점검 등의 다양한 사유로 서버가 클라이언트의 패킷을 수신할 수 없는 상태가 되면, 서버는 클라이언트가 보낸 SYN 메시지에 대한 ACK 메시지를 보낼 수 없기 때문에, 클라이언트는 서버가 현재 서비스 불능 상태임을 알게 되어 (TCP 세그먼트가 포함된) 패킷을 전송하지 않는다. 이렇게 '연결'이 보장된 경우에만 패킷을 전송하기 때문에 클라이언트와 서버 간의 신뢰성이 보장된다.
참고로, 3 Way Handshake 방식은 실제로 클라이언트와 서버가 물리적으로 연결되어 있는 것이 아닌, 가상으로 연결되어 있다는 점을 주의해야 한다. 따라서 3 Way Handshake 방식을 가상 연결 방식이라고도 부른다.
_
2) 순서 보장
사진 출처 : 김영한 강사님의 '모든 개발자를 위한 HTTP 웹 기본 지식' 강의 (인프런) 클라이언트가 패킷을 패킷1, 패킷2, 패킷3 순서로 전송을 했다고 가정하자. 이 때, 패킷이 서버에 패킷1, 패킷3, 패킷2와 같이 의도하지 않은 순서대로 도착을 하게 되면, 서버는 올바른 순서로 도착한 패킷1 이후의 패킷2부터 다시 전송을 해달라고 클라이언트에 요청을 하고, 클라이언트는 이 요청을 받아 패킷2부터 재전송하는 방식이다.
TCP 세그먼트 내의 전송 제어, 순서, 검증 정보가 TCP/IP의 연결성과 순서를 보장해준다.
____________________________________________________________________________________
3. UDP (User Datagram Protocol)
인터넷 프로토콜의 핵심 중 하나로, 비연결성, 비신뢰성, 비안전성, 순서 미보장 등의 특징을 가진 단순한 전송 방식이다. TCP/IP와는 다르게 기능이 거의 없고 단순하기 때문에 TCP/IP에 비해 빠른 전송 속도를 가진다. 인터넷 프로토콜과 거의 유사한 형태를 띠지만, 인터넷 프로토콜에서 PORT와 CheckSum의 개념이 추가되었다고 보면 된다.
※ TCP에서도 PORT의 개념이 있던데... PORT가 도대체 뭔가요?
예를 들어, 친구와 Discord 음성 채팅을 하며 FPS 게임을 즐기고 있다고 가정하자. 클라이언트(내 PC)는 Discord 서버, 그리고 FPS 게임 서버와 동시에 통신을 해야 한다. 이 때, 두 개 이상의 서버에서 전송한 패킷들이 내 IP로 수신되면, 이 패킷들이 각각 어떤 애플리케이션에 해당하는 패킷인지 어떻게 구분할 수 있을까?
인터넷 프로토콜만 사용한다면 이 문제를 해결할 수 없겠지만, TCP와 UDP는 PORT의 개념을 도입하여 이러한 상황을 해결한다. 하나의 IP에서 여러 개의 애플리케이션이 동작하는 경우, 애플리케이션을 PORT Number를 통해 구분하여 패킷이 올바른 목적지를 찾을 수 있게 도와준다. 한 마디로, IP 주소는 목적지 서버를 찾을 수 있는 기준이며, PORT는 해당 서버 내에서 동작하는 프로세스를 구분하게 해주는 기준이 된다. 구글링을 하다보면 IP 주소를 아파트의 동, PORT를 아파트의 호수로 비유하는 블로그가 많던데 참 적절한 비유인 듯 하다.
참고로, 유명 포트번호에는 TELNET 23, HTTP 80, HTTPS 443 등이 있다.이전에는 신뢰할 수 있는 데이터는 TCP/IP로, 이미지나 동영상처럼 훼손되어도 큰 문제가 없는 데이터는 UDP/IP로 전송하는 컨벤션이 있었다. 하지만, 최근 배포된 HTTP/3에서는 TCP/IP의 3 Way Handshake 방식의 처리 속도를 줄이는 최적화 과정에서 UDP/IP 프로토콜을 사용했다. 고차원적인 기능과 구조가 구현된 TCP/IP보다, 오히려 구현된 기능이 없어서 사용자 정의대로 각종 커스터마이징이 가능한, 흰 백지와도 같은 UDP/IP 프로토콜이 최근에 각광을 받고 있다.
____________________________________________________________________________________
'HTTP' 카테고리의 다른 글
[HTTP] API, REST (0) 2024.01.02