위키백과에 따르면 다음과 같다.
컴퓨터로 연결하여 TCP/IP 통신 프로토콜을 이용해 정보를 주고 받는 컴퓨터 네트워크이자, 네트워크와 장치 사이의 통신을 목적으로 상호 연결된 ‘글로벌 컴퓨터 네트워크 시스템’이다.
간단하게 말하면 여러 컴퓨터들이 서로 연결되어 있는 컴퓨터 네트워크 통신망을 말한다.
인터넷에서 컴퓨터 둘이 통신한다고 하자.
케이블로 연결된 컴퓨터 두 대가 있다. 그렇다면 클라이언트가 요청을 하면 서버에서 바로 해당 요청을 받고 응답을 해주면 된다.
그런데, 다른 공간에 컴퓨터 두 개가 있다고 하자. 그렇다면 클라이언트가 요청을 하려면 인터넷 망을 통해야 한다.
이 인터넷은 중간에 어떤 과정을 거칠 지 모른다. 이 복잡한 과정을 어떻게 헤쳐 나가는지 이해하려면 인터넷 프로토콜이라고 하는 것을 알아야 한다.
복잡한 인터넷망에서 메시지를 컴퓨터 A에서 컴퓨터 B로 보내려면 최소한의 규칙이 있어야 한다.
인터넷에 연결된 컴퓨터(Host)에 IP 주소라는 식별자를 부여함으로써 이 통신을 가능하게 해준다.
클라이언트와 서버에 각각 IP 주소를 부여 한다. 그러면 이 주소에 메시지를 전달할 수 있도록 정해놓은 규칙을 인터넷 프로토콜이라고 한다.
메시지는 IP 패킷이라는 규칙을 정해 보낸다.
데이터에 출발지 IP, 목적지 IP를 추가하여(감싸서) 보낸다.
인터넷 망에는 노드라고 불리는 것들이 있고, 이 노드들을 통해 IP 패킷이 전달된다. 노드들끼리 목적지 IP까지 쭉 던진다.
그러면 목적지 IP에서 데이터를 받은 후, 다시 출발지 IP와 목적지 IP를 넣고 메시지를 돌려준다(응답).
그런데, 이 방식에는 다음과 같은 한계가 있다.
IP 프로토콜에서 발생했던 문제들을 TCP 프로토콜이 해결해준다.
그림은 ‘널널한 개발자’ 분의 유튜브 강의에서 따와서 그렸다.
이 계층에 대해서는 여기에서 자세히 다루지 않고, 뒤에 가서 다룰 예정이다. 실제로 OSI 7 계층이라는 건 ‘개념’에 속한다.
이론을 먼저 다루는 것보다는, 이 ‘개념’을 구체화한 HTTP와 TCP/IP 등을 우선 공부하고 정리한다.
TCP/IP 4 계층이라고 부르는 그 모델이다.
클라이언트에서 서버로 메시지를 전송할 때 보통 소켓 라이브러리를 사용한다.
IP 패킷은 다음과 같이 구성되어 있다.
출처: 인프런 강의 - 모든 개발자를 위한 HTTP 웹 기본 지식
전송 제어 프로토콜(Transmission Control Protocol)의 약어로, 현재 대부분의 애플리케이션에서는 TCP를 사용한다.
TCP는 전송 제어, 순서, 검증 정보 등을 추가함으로써 신뢰할 수 있는 프로토콜이라고 이야기 한다.
다음 3가지 특징이 있다.
클라이언트와 서버가 연결이 된 것인지 확인 후 메시지를 보낸다. 이렇게 확인하는 과정을 TCP 3 way handshake (가상 연결)이라고 한다.
SYN
ACK
SYN
이라는 메시지를 보낸다.SYN + ACK
라는 메시지를 보낸다.ACK
를 보낸다.이렇게 총 3번을 주고 받은 후에 연결이 된 것이고, 이 다음 데이터를 전송한다. 요즘에는 최적화가 되어서 마지막(3번) 단계에서 ACK
와 함께 데이터를 전송한다.
💡 여기서 말하는 연결은 ‘개념적 연결’이다. 클라이언트와 서버 사이에는 수많은 서버(노드)가 있어서 해당 노드들을 거치게 된다.
이 중간에 있는 노드들을 생각하지 않고, 단순히 응답을 주고 받을 수 있으니 논리적으로 연결이 되었구나 하고 생각하는 것이다.
데이터를 전달한 것을 보증해준다. 만약 중간에 패킷이 누락되었다면, 클라이언트가 그 사실을 알 수 있다.
대용량 패킷을 3개로 나누어서 전달한다고 하자.
따라서, 순서를 보장할 수 있다.
사용자 데이터그램 프로토콜(User Datagram Protocol)의 약어로, IP와 거의 같으며 PORT와 전송된 데이터의 오류 체크를 하기 위한 Checksum정도만 추가되었다.
즉, 연결을 확인하지도 않고 데이터의 전달을 보증하지도 않고 순서를 보장하지도 않는다.
하지만 서로 연결을 요청하고 확인하는 단계를 거치는 TCP보다 단순하고 빠르다.
인터넷은 이미 TCP 기반으로 쓰고 있기 때문에, TCP에는 손을 댈 수가 없다. 그런데 UDP는 아무것도 안되어 있기 때문에 애플리케이션 레벨에서 추가 작업을 할 수 있다.
옛날에는 신뢰할 수 있는 정보들을 TCP로 보내고, 영상같은 깨져도 되는 것들은 UDP로 보내라고 배웠다.
그리고 시간이 흐르면서 영상같은 것에도 TCP 프로토콜을 사용하는 등, 90% 이상을 TCP가 점유했다.
그런데 최근에는 HTTP 3에서 3 way handshake 하는 시간을 줄여보고자 최적화를 하면서 UDP 프로토콜을 사용했다.
따라서 지금은 UDP 프로토콜이 뜨고 있다고 한다.
한 컴퓨터에 IP 주소가 하나 할당되어 있다.
이때, 컴퓨터에 SNS 사이트와 웹 브라우저, 음악 프로그램 등을 실행시킨 상태이다.
이 컴퓨터(클라이언트)가 웹에서 키워드를 입력한 후 엔터를 눌러 서버에게 검색을 요청했다.
이때, 서버에게서 받은 결과가 웹 브라우저의 응답 결과로 오는 것인지, 음악 프로그램에게 오는 것인지 알아야 한다.
이렇듯 웹 브라우저와 SNS 사이트를 구분하여 응답 결과를 웹 브라우저에게로 전달해주기 위해 쓰이는 것이 바로 포트이다.
즉, 같은 IP 내에 있는 프로세스의 식별자라고 생각하면 된다.
컴퓨터 간에 통신할 때 IP 주소를 이용하는데, 이렇게 숫자로 구성된 IP 주소는 기억하기가 어렵다. 만약 IP 주소가 변경되면 다시 외워야 한다.
그래서 나온 것이 Domain Name System, 줄여서 DNS이다.
DNS는 인간이 기억하기 쉬운 도메인 명을 등록하면 IP 주소를 매핑하여, 도메인 명으로 IP 주소를 찾을 수 있게 해준다.
DNS에서 도메인 명에 매핑된 IP 주소를 바꾸면 되므로, 변경하여도 사용자는 도메인 명만 알고 있으면 된다.
모든 개발자를 위한 HTTP 웹 기본 지식 강의 - 인프런