전송 계층은 호스트 안에서 어떤 프로그램끼리 데이터를 주고받을지 정리해주는 계층이다.
이전 글에서 포트는 “이 컴퓨터 안의 어떤 프로세스로 보낼 것인가”를 구분하기 위한 번호라고 정리했다.
그런데 포트만 안다고 통신이 끝나는 것은 아니다.
데이터를 보낼 때 이런 문제들이 남는다.
“상대방이 받을 준비가 되었는가?”
“보낸 데이터가 중간에 사라지지는 않았는가?”
“데이터가 순서대로 도착했는가?”
“굳이 이런 것까지 확인하지 않고 빠르게 보내도 되는가?”
이 질문에 대해 서로 다른 방식으로 대답하는 대표적인 프로토콜이 TCP와 UDP다.
TCP는 데이터를 보낼 때 정확하게 도착하는 것을 중요하게 생각하는 전송 방식이다.
비유하면 택배를 보낼 때 등기 배송을 사용하는 느낌에 가깝다.
보내기 전에 상대가 받을 수 있는지 확인하고, 보낸 뒤에도 잘 도착했는지 확인한다. 중간에 문제가 생기면 다시 보내는 방식도 사용한다.
TCP는 데이터를 그냥 던지지 않는다.
먼저 통신할 상대와 연결을 만들고, 데이터를 나누어 보내고, 상대가 잘 받았는지 확인한다.
그리고 필요하다면 다시 보낸다.
그래서 TCP는 다음과 같은 특징을 가진다.
여기서 중요한 건 TCP가 “빠르게 보내는 것”보다 믿고 받을 수 있게 보내는 것에 더 집중한다는 점이다.
웹 페이지를 요청하거나, 파일을 다운로드하거나, 로그인 요청을 보내는 상황을 생각해보면 데이터가 조금 빠지는 것은 꽤 큰 문제다.
HTML 일부가 빠지거나, 결제 요청 데이터가 중간에 사라지거나, 파일 내용이 틀어지면 안 된다.
이런 상황에서는 속도보다 정확성이 중요하기 때문에 TCP가 잘 어울린다.
UDP는 TCP보다 훨씬 단순하다.
UDP는 연결을 먼저 만들지 않고, 데이터를 바로 보낸다.
비유하면 편지를 우편함에 넣고 끝내는 느낌이다.
상대가 지금 받을 준비가 되었는지, 중간에 사라지지는 않았는지, 순서대로 도착했는지까지 직접 챙기지 않는다.
그래서 UDP는 다음과 같은 특징을 가진다.
처음에는 “그럼 UDP는 불안정한 거 아닌가?”라는 생각이 들 수 있다.
맞다. TCP에 비해 신뢰성은 낮다.
하지만 모든 통신에서 완벽한 신뢰성이 필요한 것은 아니다.
예를 들어 실시간 음성 통화나 영상 스트리밍을 생각해보면, 중간에 아주 짧은 데이터가 하나 빠졌다고 해서 그 데이터를 다시 받아오는 것이 항상 좋은 선택은 아니다.
이미 지나간 음성 조각을 뒤늦게 다시 받는 것보다, 조금 끊기더라도 현재 데이터를 계속 받는 편이 더 자연스럽다.
온라인 게임도 비슷하다.
캐릭터의 위치 정보가 아주 빠르게 계속 바뀌는 상황에서, 오래된 위치 정보를 뒤늦게 정확히 받는 것이 오히려 의미가 없을 수 있다.
여기서 중요한 건 UDP가 “대충 보내는 프로토콜”이라기보다, 연결과 확인 과정을 최소화해서 빠르게 보내는 방식이라는 점이다.
TCP를 설명할 때 자주 나오는 말이 연결형 통신이다.
연결형이라는 말은 데이터를 보내기 전에 먼저 통신할 준비 과정을 거친다는 뜻이다.
반대로 UDP는 비연결형 통신이다.
상대와 미리 연결을 맺는 과정 없이 데이터를 보낸다.
이 차이는 실제 통신 방식에서 꽤 크게 느껴진다.
TCP는 이렇게 생각할 수 있다.
“너 받을 준비 됐어?”
“응, 받을 수 있어.”
“그럼 이제 보낼게.”
“받았어.”
“혹시 못 받은 부분 있으면 다시 보낼게.”
UDP는 훨씬 짧다.
“보낸다.”
이 차이 때문에 TCP는 더 꼼꼼하지만 상대적으로 무겁고, UDP는 덜 꼼꼼하지만 가볍다.
전송 계층에서도 데이터를 부르는 이름이 있다.
TCP에서 사용하는 데이터 단위를 TCP 세그먼트라고 한다.
UDP에서 사용하는 데이터 단위를 UDP 데이터그램이라고 한다.
이 이름 자체를 외우는 것보다 중요한 건, 각각의 데이터 안에 어떤 성격의 정보가 담기느냐다.
TCP 세그먼트에는 신뢰성 있는 통신을 위한 정보들이 들어간다.
예를 들어 데이터 순서를 맞추기 위한 번호, 확인 응답과 관련된 정보, 제어 정보 등이 포함될 수 있다.
UDP 데이터그램은 상대적으로 단순하다.
출발지 포트, 목적지 포트, 길이, 오류 확인을 위한 정보 정도를 담고 데이터를 보낸다.
즉 TCP 세그먼트는 “이 데이터를 안정적으로 주고받기 위한 관리 정보”가 더 많이 붙는 느낌이고, UDP 데이터그램은 “최소한의 정보만 붙여서 빠르게 보내는” 느낌에 가깝다.
전송 계층 관점에서 데이터를 받는 쪽을 시뮬레이션해보면 이런 흐름이다.
먼저 IP 계층을 통해 패킷이 내 컴퓨터까지 도착한다.
그러면 이제 컴퓨터는 생각한다.
“이 데이터는 내 컴퓨터로 온 건 맞다. 그런데 내 안의 어떤 프로그램에게 넘겨야 하지?”
이때 확인하는 것이 목적지 포트 번호다.
목적지 포트가 80이면 웹 서버 프로세스일 수 있고, 443이면 HTTPS 요청을 처리하는 프로세스일 수 있다.
포트 번호를 보고 적절한 애플리케이션으로 데이터를 넘긴다.
그런데 여기서 TCP냐 UDP냐에 따라 처리 방식이 달라진다.
TCP라면 연결 상태를 확인하고, 순서가 맞는지 보고, 필요한 경우 응답을 보낸다.
UDP라면 연결 상태를 따로 관리하지 않고, 도착한 데이터그램을 해당 포트를 사용하는 애플리케이션에 넘긴다.
즉 IP가 “어느 컴퓨터로 갈 것인가”를 판단한다면,
포트는 “그 컴퓨터 안의 어느 프로그램으로 갈 것인가”를 판단한다.
그리고 TCP와 UDP는 “그 데이터를 어떤 방식으로 주고받을 것인가”를 결정한다.
TCP와 UDP를 보면 TCP가 더 좋아 보일 수 있다.
연결도 하고, 확인도 하고, 재전송도 해주기 때문이다.
하지만 네트워크에서는 항상 “더 많은 기능”이 정답은 아니다.
기능이 많다는 것은 그만큼 처리할 것도 많고, 시간이 더 걸릴 수 있다는 뜻이다.
정확성이 중요한 통신에서는 TCP가 적합하다.
빠른 전달과 실시간성이 중요한 통신에서는 UDP가 더 적합할 수 있다.
웹 요청, 파일 전송, 이메일처럼 데이터가 정확히 도착해야 하는 경우에는 TCP가 잘 어울린다.
음성 통화, 영상 스트리밍, 온라인 게임처럼 실시간성이 중요한 경우에는 UDP가 사용될 수 있다.
여기서 중요한 건 TCP와 UDP를 “좋고 나쁨”으로 나누는 것이 아니라, 어떤 통신에 어떤 성격이 더 필요한가로 바라보는 것이다.
TCP는 꼼꼼한 전달 방식이다.
UDP는 가볍고 빠른 전달 방식이다.
전송 계층은 결국 이 선택지를 제공한다.
데이터를 안정적으로 주고받을 것인지, 아니면 조금 단순하더라도 빠르게 주고받을 것인지.
이 차이를 이해하면 네트워크 통신을 볼 때 단순히 “데이터가 간다”가 아니라,
그 데이터가 어떤 방식으로, 어떤 책임 범위 안에서 이동하는지 조금 더 선명하게 보인다.