인터넷(Internet)은 Internet protocol suite(TCP/IP)를 기반으로 하여 전세계적으로 연결이 되어있는 컴퓨터 네트워크 통신망을 일컫는 말입니다.
물리적으로 연결이 되어 있기도 하고, 무선 인프라(인공위성 등)을 통해서도 연결이 되어있으며 이러한 방식으로 WWW(World Wide Web)과 같은 큰 네트워크가 구축되었습니다.
인터넷 프로토콜은 네트워크 상에서 정보를 송수신하는 규칙을 의미합니다. IP라고 하면, 보통 숫자로 된 IP주소가 생각날 것인데, 이 IP 주소는 인터넷에서 서로를 식별하는 고유한 주소 역할을 합니다.
인터넷에서는 데이터를 패킷(Packet)이라는 단위로 전송합니다. 패킷에는 출발지(src IP), 도착지(dest IP)가 포함되어 있어서 어떤 기기들이 데이터를 주고 받는지 알 수 있습니다. 패킷은 header, payload, trailer로 구성이 되어있으며, 데이터를 주고 받았는지는 수신을 확인하기 위한 목적 등의 응답이 오고갑니다.
IP의 한계점을 보완하기 위한 프로토콜입니다.
서버와 클라이언트 간 데이터를 신뢰성있게 전달하기 위한 프로토콜입니다. 여기서 신뢰성을 보장하는 방법으로 3 Way Handshake라는 과정을 밟으며 논리적인 연결을 맺습니다.
위 과정을 통해서 통신하는 양쪽 모두 데이터를 주고 받을 준비가 되었는지 확인하고 연결을 성립시킵니다. IP의 한계점을 보완하기 위한 프로토콜인 만큼, 신뢰성도 보장하고, 연결성도 보장합니다. 하지만 위와 같은 과정 때문에 통신에서 시간이 조금 더 오래 걸립니다.
비연결성이고 신뢰성이 없는 프로토콜입니다. TCP와는 다르게 3 Way Handshake 없이 데이터를 빠르게 보낼 수 있습니다. 연결성을 보장하지 않고 신뢰성도 보장하지 않지만 빠르다는 장점이 있어 실시간성이 중요한 서비스(스트리밍, 게임 등)에서 많이 사용합니다.
그럼 IP랑 UDP의 차이는 무엇인가요?
IP는 어떤 application에 데이터를 전달해야하는지 모른다고 하였습니다. 네트워크 계층 구조에 따라서 IP는 3 계층인 네트워크 계층에 해당됩니다. 이는 출발지와 목적지 주소로만 패킷을 전달하게 됩니다.
이와 다르게 UDP는 4 계층인 전송 계층에 해당하여 어떤 application에 데이터를 전달해야 하는지 까지 구분할 수 있습니다. TCP도 마찬가지로 전송 계층에 해당합니다.
TCP, UDP 모두에서 사용하는 개념입니다. 위에서 설명한 대로, IP는 주소만 구별을 할 수 있고, TCP와 UDP는 application까지 구분할 수 있다고 하였습니다.
여기서 application을 구분하는 방법으로 port를 사용하는 것입니다. IP가 아파트라면, PORT는 동, 호수를 의미합니다. 패킷에는 출발지 port와 도착지 port가 포함되어 있으므로, 이를 통해서 어떤 application으로 데이터를 전달할지 식별할 수 있습니다.
자주 사용하는 port
FTP: 20, 21(TCP)
SSH: 22(TCP)
HTTP: 80(TCP)
HTTPS: 443(TCP)
DNS: 53(TCP/UDP)
DHCP:67(UDP)port는 0부터 65535까지 할당이 가능한데, 0부터 1023까지는 국제적으로 관리되는 예약 포트이기 때문에 이들은 주로 피해서 사용합니다.
DNS는 도메인 이름과 IP 주소를 서로 변환하는 역할을 합니다.
도메인 이름이라는 것은 사람이 읽기 쉽고, IP 주소라는 것은 컴퓨터가 읽기 쉽습니다. 이 둘을 서로 변환해주기 때문에, IP 주소를 굳이 외우지 않아도 웹사이트에 접속할 수 있습니다.
URI(Uniform Resource Identifier)는 인터넷 자원을 식별하는 고유 문자열입니다. URL과 URN은 URI의 하위 개념에 속합니다.
보통 URL을 많이 사용하고, URN은 많이 사용되지는 않습니다.
scheme://user(:password)@host(:port)(/path)(?query)(#fragment)
클라이언트와 서버가 통신할 때 사용하는 데이터 형식입니다. 언어와 플랫폼에 상관없이 데이터를 주고받을 수 있게 해줍니다.
서버를 한 대의 CPU, 메모리 등 하드웨어 성능을 높여서 처리력을 상승시키는 방법입니다. 단일 서버의 성능을 업그레이드 하는데, 성능이 좋아질 수록 비용이 기하급수적으로 증가합니다.
서버를 같은 사양의 서버들로 구성하는 방식입니다. 여러 대로 늘려 부하를 분산시킬 수 있어 동시에 더 많은 요청을 처리할 수 있습니다.
서버가 클라이언트의 상태 정보를 기억하는 것을 의미합니다.
서버가 클라이언트의 상태 정보를 기억하지 않는 것을 의미합니다.
Stateful의 방식은 서버가 클라이언트의 정보를 기억해야하기 때문에 서버가 종료되면 문제가 생기고, 리소스 또한 많이 차지하게 될 것입니다.
Stateless의 방식은 이와 다르게 클라이언트 측에서 필요한 상태 정보를 서버에게 보내야합니다. Scale out이 쉽고, 서버를 추가하거나 교체하여도 큰 문제가 없습니다. 다만, 클라이언트 측에서 보내는 데이터 전송량이 많아질 것입니다.
클라이언트와 서버가 연결을 유지하면서 통신합니다. 연결을 계속 유지하지 때문에 응답 속도가 빠르지만, 서버 자원이 지속적으로 소모됩니다.
요청마다 연결을 새로 하고, 응답 후에는 연결을 종료합니다. 서버 자원을 효율적으로 사용한다는 장점이 있지만, 요청이 많아지는 경우에는 연결/해제 과정이 반복해서 발생하므로 overhead가 발생할 수 있습니다.
어떤 걸 사용하는가?
HTTP는 기본적으로 Connectionless 방식을 사용하지만, HTTP/1.1부터는 Persistent Connection(지속 연결)을 도입하여 여러 요청을 한 번의 연결로 처리하여 속도를 개선하였습니다.
자료 및 코드 출처: 스파르타 코딩클럽