하나의 컴퓨터는 요청을 보내고, 하나의 컴퓨터는 응답을 해줄 것이다. 요청과 응답 사이에 수많은 노드로 이루어진 인터넷 망이라는 것이 존재하는데, 이 망을 통해 서로 송수신하는 것이다.
전제 조건이 있다! 바로 IP(Internet Protocol, 인터넷 프로토콜) 주소를 부여하는 것이다. 막말로 아무것도 없이 다른 컴퓨터에 요청을 보낼 수는 없는 거니까. 주소 같은 게 필요할 것임!!!
IP는 지정한 IP 주소에 데이터를 전달해준다. 이는 패킷(Packet) 이라는 통신 단위로 데이터를 전달한다.
IP 패킷의 정보는 요청 보내는 컴퓨터의 IP, 요청을 받는 컴퓨터의 IP, ... 등 전송 데이터를 가지고 있다. 이 IP패킷을 가지고 인터넷 망안에서 존재하는 노드끼리 IP를 받을 수 있는 녀석을 찾아다니면서 계속 서로 넘겨주다가 도착하는 것이다.
이러한 단점을 보완하기 위해 TCP(Transmission Control Protocol)가 등장한다.
인터넷 프로토콜은 아래와 같이 4계층으로 이루어져 있다.

이 중 전송 계층에 존재하는 것이 TCP 다. 애플리케이션 계층으로부터 요청을 받아 TCP에서 감싸지고 IP에서 감싸지고 네트워크 인터페이스를 통해 서버에 도착한다.
그럼, TCP 에 대해 자세히 알아보자.
연결 지향
TCP 3 way handshake 를 통해 클라이언트와 서버를 가상 연결을 통해 연결 성공 여부를 알 수 있다. (물리적 연결이 아닌, 논리적 연결)
TCP 3 way handshake 란, 클라이언트가 SYN 이라는 요청을 보내면, 서버는 SYN + ACK 로 응답해준다. 이후 클라이언트는 또 ACK 를 보낸다. 그럼 상호 송수신이 완료된 것이니, 연결이 됐다는 걸로 인식해서 데이터를 전송하게 되는 방식이다. (SYN: 접속 요청, ACK 요청 수락)
(클라이언트 쪽에서 ACK와 함께 데이터를 함께 전송할 수도 있다.)
데이터 전달 보증
중간에 패킷이 유실되면, 클라이언트가 인지할 수 있다. 서버가 데이터를 잘 받았다고 응답해주기 때문이다. 왜냐고? TCP 세그먼트로 인해서.
순서 보장
요청 순서에 따라 다르게 도착한다면, 디폴트로 잘못된 순서부터 다시 보내는 것이다.
...
즉, 초반에 설명한 IP 프로토콜의 한계점을 보완해주는 녀석이다.
TCP 패킷은 PORT, 전송 제어, 순서, 검증 정보, ... 등 다양한 전송 데이터를 가지고 있다. 이를 TCP 세그먼트라고 한다. 그리고 위에서 감싸진다는 표현을 사용했는데, IP가 TCP 를 감싸준다고 했다. IP 패킷은 초반에 IP 주소값을 가지고 있다고 언급했었다.
즉, TCP/IP 패킷은 IP, PORT, 전송 제어, 순서, 검증 정보 등을 가지고 있는 패킷이 되는 것이다.
하지만, 이녀석도 단점이라는 것이 있다. 뭐냐고?
그래서 요즘 각광 받는 것이 UDP 다.
UDP(User Datagram Protocol, 사용자 데이터그램 프로토콜) 는 TCP 와 같은 계층이지만, 기능이 거의 없다. 즉, IP와 똑같다고 볼 수 있다. (PORT, 체크섬 존재)
체크섬: 메시지가 있는 지 간단하게 검증
아무런 기능이 존재하지 않기 때문에 속도는 TCP 보다 상대적으로 빠르다.
TCP 는 속도가 상대적으로 느리고, 최적화를 할 수 없어 UDP 를 통해 최적화를 진행하기 때문이다. 대신, 애플리케이션 단에서 추가 작업을 진행해야 한다.
하나의 컴퓨터에서 여러 개의 어플리케이션을 실행하는 과정 속에서 어떻게 구분할 것인가에 대해 궁금증을 가질 수 있다.
예를 들어, IP 200.200.200.1 에서 게임(80)과 영상 통화(200) 두 가지를 진행한다고 하면 어떻게 구분하냐는 것이다. 이 구분을 바로 PORT 로 구분한다. (80, 200 이 포트번호라고 예를 든 것.)
클라이언트 쪽에서 각각 애플리케이션에 PORT를 매기고 서버에 요청을 보내면, 서버도 본인이 매기고 있는 PORT를 연결시켜준다. 그래서 애플리케이션을 서로 구분할 수가 있는 것이다.
잘 알려진 포트로 사용하지 않는 것이 좋다.IP는 변경될 수 있고 웹에 접속하기 위해 해당 IP를 매번 입력하는 것은 매~~~우 번거로운 일이다. 그래서 존재하는 것이 DNS(Domain Name System) 이다.
이녀석은 도메인명을 IP 주소로 변환해준다.
도메인명은 우리가 흔히 알고 있는
과 같은 것들이다.
클라이언트가 도메인 명으로 요청을 보내면 DNS는 해당 도메인을 IP 주소로 변환해 응답을 주고 클라이언트는 서버에 해당 IP를 가지고 접속하게 된다.
이 글은 인프런 - 모든 개발자를 위한 HTTP 웹 기본 지식 (김영한) 강의 내용을 바탕으로 정리한 글 입니다.