앞 챕터에서 인터넷 프로토콜(IP)만으로 통신하는 것은 여러가지 문제점이 있다고 살펴보았다.
간단히 리뷰해보면,
- 패킷을 받을 대상이 없거나 서비스 불능 상태일지라도 패킷을 전송한다.
- 패킷이 중간에 소실되어도 어쩔 수 없다는 한계가 있다.
- 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상이면 구분할 수 없다.
이러한 문제점을 해결해주는 것이 TCP이다.
인터넷 프로토콜 스택은 인터넷 프로토콜 스위트(영어: Internet Protocol Suite)라고도 불리며 인터넷에서 컴퓨터들이 서로 정보를 주고받는 데 쓰이는 통신규약(프로토콜)의 모음이다.
인터넷 프로토콜 슈트 중 TCP와 IP가 가장 많이 쓰이기 때문에 TCP/IP 프로토콜 슈트라고도 불린다.
실제 전송과정을 살펴보자.
먼저 애플리케이션 계층에 있는 프로그램들이 Hello World!
라는 메세지를 생성한다.
SOCKET
라이브러리를 통해 앞에서 받은 Hello 메세지를 OS에 전달한다.
그러면 전달 받은 OS에서 TCP는 TCP 정보를 씌우는 캡슐화를 진행한다. 그리고 IP로 전달해서 IP는 IP와 관련된 정보를 또 한번 씌우게 된다. 그렇게 해서 이 패킷은 현재 메세지, TCP 정보, IP 정보들을 가지고 있게 된다.
마지막으로 LAN카드를 통해서 밖으로 나가게 될 때 Ethernet Frame
이라는 정보를 추가해준다. 이더넷 프레임에는 MAC 주소와 같은 물리적인 정보들이 포함되어 있다.
TCP를 거치게 되면 다음의 정보가 추가된다.
TCP는 Transmission Control Protocol
의 약자로 말 그대로 전송을 제어하는 프로토콜이다.
크게 다음과 같은 특징들을 가진다.
따라서 신뢰할 수 있는 프로토콜이고 대부분의 애플리케이션에서 TCP를 사용하고 있다.
TCP는 장치들 사이에 논리적인 접속을 성립(establish)시키기 위하여 Three-way handshake
라는 방식을 사용한다.
이러한 절차는 TCP 접속을 성공적으로 성립하기 위하여 반드시 필요하다.
🚨 이 방식은 물리적 완전한 연결은 아니고 클라이언트와 서버의 개념적, 논리적 연결을 의미한다.
SYN : 접속 요청
ACK : 요청 수락
최근에는 최적화가 잘 이루어져서 마지막 3번 과정에서 ACK
를 보내면서 데이터도 같이 전송한다.
TCP에서는 클라이언트에서 데이터를 전송하면 데이터를 잘 받았는지 서버에서 응답을 보내주게 되어있기 때문에 데이터 전달을 보증해준다.
최적화 방법에 따라 다를 수는 있지만 기본적으로 잘못된 순서로 서버에 패킷이 전달되면 서버는 패킷을 어디서 부터 다시 보내야되는지를 명시해준다.
그렇기 때문에 순서가 보장될 수 있는 것!
UDP는 TCP와는 다르게 데이터를 패킷으로 나누고 반대편에서 재조립하는 과정을 거치지 않는다.
수신측에서 제대로 받던 받지 않든 상관 없이 데이터를 보내기만 한다. 그렇기 때문에 데이터 전달 보증도 없고, 순서를 보장해주지도 않는다.
TCP에 비해 가지는 가장 큰 장점은 단순하고 빠르다는 점이다.
정리하자면 인터넷 프로토콜과 거의 같지만 PORT와 체크섬 정보가 추가되어 있다.
체크섬은 이 데이터가 제대로된 데이터인지 추가하는 정보이다
최근에는 HTTP3 스펙의 등장과 함께 UDP가 각광을 받고 있다.
[참고]
이 포스트는 김영한님 HTTP강의 를 토대로 작성되었습니다.