클라이언트가 서버에게 메세지를 보내고자 할 때, 두 컴퓨터가 직접적으로 연결되어있지 않은 이상 인터넷이라는 통신망을 거쳐야 한다.
이때 어떤 규칙을 통해 메세지가 전달될 수 있을까?
클라이언트는 자신의 IP 주소와 내가 메세지를 보내고자 하는 서버의 IP 주소를 알아야 한다. 여기서 IP는 클라이언트가 지정한 IP 주소에
패킷(Packet)
이라는 통신 단위로 데이터를 전달하게 된다.
패킷에는 클라이언트의 IP 주소와 서버의 IP 주소가 담기게 되고, 인터넷 망 내 노드들 간에 패킷이 전달되면서 최종 목적지에 도착하게 된다.
위 과정은 서버에서도 똑같은 방식으로 진행된다. 서버는 클라이언트의 데이터를 잘 받았다는 의미로 패킷을 전달하게 된다.
비연결성
패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷을 전송한다.
비신뢰성
패킷 전송 후 패킷이 사라지거나, 패킷을 여러 개 보냈지만 순서대로 도착하지 않을 가능성이 있다.
프로그램 구분
같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 두 개 이상이라면, 프로그램을 구분하기 어려울 가능성이 있다.
이러한 한계점들을 극복하기 위해 우리는 TCP 를 사용한다❗️
TCP/IP 패킷의 형태는 위와 같다. 따라서 IP만으로 해결되지 않았던 순서 제어 등의 문제가 TCP를 통해 해결된다.
TCP는 전송 제어 프로토콜로, 다음과 같은 특징을 가진다.
이와 같은 특징들로 인해 TCP는 신뢰할 수 있는 프로토콜이며, 현재 대부분 TCP를 사용하고 있다.
위와 같은 과정을 거쳐 클라이언트와 서버가 상호 간의 신뢰를 형성하게 되고, 이후 데이터 전송이 가능하다.
UDP는 사용자 데이터그램 프로토콜로, 다음과 같은 특징을 가진다.
한 번에 두 개 이상의 서버 컴퓨터를 연결해야 한다면, 패킷을 전송하면서 이 패킷이 어떤 용도로 사용되어야 하는지 구분하기가 어렵다.
이 때 IP와 함께
PORT
라는 개념을 사용한다. IP는 목적지 서버를 찾을 때 사용하며, PORT는 하나의 목적지 서버 내 프로세스들을 구분하는 역할을 한다.
정리하면 위 그림과 같다.
내가 게임을 위한 패킷을 전달하고자 한다면, 하나의 TCP/IP 패킷에 클라이언트 IP, 서버 IP, 클라이언트 PORT(8090), 서버 PORT(11220), 전송 데이터를 모두 포함시키면 된다.
0 ~ 65535의 PORT를 사용할 수 있으나, 0 ~ 1023은 잘 알려진 포트로 사용하지 않는 것이 좋다. 예를 들어 HTTPS는 443, HTTP는 80 등이 있다.
IP는 사람이 기억하기 어려우며, 언제든지 변경될 수 있다는 특징을 가지고 있다.
DNS는 일종의 전화번호부 개념으로, DNS 서버에 도메인명으로 요청하면 해당 도메인의 IP 주소를 응답한다. 따라서 클라이언트는 응답 받은 IP 주소를 이용해 서버에 접속이 가능하게 된다.