"TCP/IP 어디서 듣긴했는데, 뭐였더라?"
이번글은 지난 OSI 7계층에 이어, TCP/IP에 대해서 알아보도록 하겠습니다.
먼저, TCP/IP는 무엇일까요?
TCP/IP란
TCP/IP는 인터넷에서 데이터를 주고받기 위한 네트워크 프로토콜을 의미합니다.
TCP는 Transmission Control Protocol로 해석하면 전송 제어 프로토콜이 됩니다.
"전송을 제어하는 규칙이 뭔가요?"
데이터를 안전하고 순서대로 전달해주는 약속(규칙)을 의미합니다.
"그럼, TCP가 하는 역할이 뭔가요?"
인터넷에서 데이터를 주고 받을 때, 중간에 손실이 되지 않도록 보장을 하고 순서가 뒤바뀌지 않도록 정리해서 보내주는 역할을 합니다.
"데이터가 중간에 손실이 된다는게 잘 와닿지 않는데 어떤 사례가 존재하나요?"
예시로, 지하철 wi-fi를 사용해서 인터넷 검색을 할때, 검색이 안되는 경우가 있습니다.
이런 경우는 Wi-Fi 신호가 약해지거나 네트워크가 불안정할 때, 데이터가 중간에 일부 손실되기 때문에 발생하는 일입니다.
"데이터 패킷은 뭔가요?"
인터넷에서 데이터를 전송할 때, 작은 조각(패킷)으로 나누어 보내는 단위를 말합니다.
"데이터 패킷을 큰 조각으로 한번에 보내면 되지, 왜 굳이 조각을 나눠서 작은 조각으로 보내나요?"
인터넷에서 한 번에 큰 데이터를 전송하면 네트워크가 과부하될 수 있기 때문에, 작은 단위로 쪼개서 전송하고, 도착한 후 다시 조립하는 방식을 사용합니다.
"TCP는 어떻게 데이터 손실되지 않도록 보장하나요?"
패킷 손실이 발생하면 재전송하고, 순서가 뒤바뀌지 않도록 정리하는 기능을 제공합니다.
이제 IP에 대해서 알아보도록 하겠습니다.
IP는 인터넷에서 데이터를 목적지까지 전달하기 위한 주소 지정 및 경로 설정(라우팅)을 담당하는 프로토콜입니다.
쉽게 말해, 택배를 받는 상황에 비유하면 다음과 같습니다.
IP 주소 = 집 주소 🏠 (데이터가 어디로 가야 하는지 결정)
데이터 패킷 = 택배 상자 📦 (전송되는 데이터)
라우터(Router) = 택배 회사 🚛 (데이터를 최적의 경로로 전달)
"그래서, IP의 역할이 뭔가요?"
데이터가 정확한 목적지까지 도착하도록 주소를 지정하고 경로를 설정하는 역할을 합니다.
쉽게 말해, 데이터를 목적지까지 안내하는 네트워크 내비게이션 역할을 합니다.
OSI는 7계층으로 되어 있는데, TCP/IP는 몇 계층으로 되어있을까요?
TCP/IP 4계층
TCP/IP는 아래 그림과 같이 4개의 계층으로 되어있습니다. 기존 OSI 7계층을 단순화한 것이라고 생각하면 됩니다.
TCP/IP의 각 계층은 어떤 역할을 할까요?
TCP/IP 4계층을 이용한 인터넷 통신의 전체적인 흐름은 다음과 같습니다.
각 계층별로 어떤 역할을 하는지 알아보도록 하겠습니다.
송신부를 기준으로 응용 계층, 전송 계층, 인터넷 계층, 네트워크 인터페이스 계층 순서로 설명하도록 하겠습니다.
응용 계층(4계층)
응용 계층은 사용자와 소프트웨어를 연결해주는 계층입니다. HTTP, HTTPS, DNS등의 프로토콜이 작동하게 됩니다.
쉽게 말해, 사용자가 직접 접하는 인터넷 서비스를 담당하는 계층을 의미합니다.
우리가 자주 접하는 대표적인 예시로는 아래와 같습니다.
사용자가 웹 브라우저(Chrome, Edge, Safari) 에서 https://www.naver.com 입력한 순간, 응용 계층에서 HTTP / HTTPS 프로토콜이 동작하여 웹 서버에 요청을 보내게 됩니다.
전송 계층(3계층)
전송 계층은 데이터의 신뢰성을 보장하고, 적절한 응용 프로그램(프로세스)로 데이터를 전달하는 역할을 합니다.
쉽게 말해, 데이터가 빠짐없이 제대로 도착했는지 확인하고, 해당 데이터를 어떤 프로그램이 받아야 할지 결정하는 계층을 의미합니다.
TCP와 UDP가 이 계층에 해당됩니다. 전송 계층의 데이터 단위는 세그먼트를 사용합니다.
"다른 컴퓨터에 데이터를 보낼땐, IP를 사용한다는 것은 알겠는데, 그 컴퓨터의 어떤 프로그램이 받아야 할지는 어떻게 아나요?"
전송 계층은 포트 번호를 사용해서 어떤 프로그램이 데이터를 받게될지 결정합니다.
"포트 번호가 뭔가요?"
포트 번호(Port Number)는 같은 컴퓨터 내에서 여러 개의 프로그램(응용 서비스)이 실행될 때, 어떤 프로그램이 데이터를 받을지 구분하는 역할을 합니다.
"좀 더 실생활에 와닿을만한 예시가 없을까요?"
유튜브를 보면서 친구와 카카오톡을 하는 상황에서, 유튜브 스트리밍 데이터와 카카오톡 메시지 데이터가 서로 섞이지 않는 이유가 바로 포트 번호를 사용했기 때문입니다. 포트 번호가 각 데이터가 가야할 목적지를 나타내는 것입니다.
"UDP는 뭔가요?"
UDP(User Datagram Protocol) 는 빠른 데이터 전송을 우선시하는 프로토콜로, TCP와 달리 데이터가 손실될 수도 있지만, 빠르게 전송하는 것이 목적인 프로토콜입니다.
"세그먼트는 뭔가요?"
세그먼트(Segment) 는 전송 계층(Transport Layer)에서 데이터를 나누어 처리하는 단위입니다.
즉, 애플리케이션에서 보낸 데이터를 적절한 크기로 나눠서 전송하는 데이터 조각을 의미합니다.
"세그먼트는 그럼 패킷이랑 다를게 없지 않나요? 세그먼트와 패킷의 차이점이 뭔가요?"
세그먼트"는 데이터가 네트워크를 타고 가기 전에 적절한 크기로 나눈 조각이고, 패킷은 IP 주소가 포함되어 최종 목적지까지 가는 데이터입니다. 사용되는 계층은 다르지만, 작은 조각으로 나누어 전송한다는 점은 동일합니다.
세그먼트와 패킷을 택배의 상황으로 비유하면 다음과 같습니다.
세그먼트는 택배 상자에 담을 물건을 적절한 크기로 포장하는 과정이며, TCP/UDP가 데이터를 나누고 포트 번호(어떤 프로그램이 받을지)를 추가합니다.
패킷은 택배 상자에 주소 라벨을 붙여서 어디로 보낼지 지정하는 과정이며, 네트워크 계층에서 IP 주소를 추가하여 최적의 경로를 통해 목적지로 전달합니다.
인터넷 계층(2계층)
인터넷 계층은 데이터를 목적지까지 전달하기 위해 IP 주소를 이용한 경로 설정(라우팅)을 담당하는 계층입니다.
쉽게 말해, 어디로 보낼지(IP 주소 지정)와 어떻게 보낼지(경로 설정)"를 결정하는 계층입니다.
이전에 나온 설명과 같이 인터넷 계층에서 처리하는 데이터이 단위는 패킷입니다.
네트워크 인터페이스 계층(1계층)
네트워크 인터페이스 계층은 데이터를 물리적으로 전송하는 계층입니다.
데이터를 전기 신호로 변환하고 MAC 주소를 사용해 기기에 데이터를 전달합니다.
쉽게 말해, 데이터를 네트워크 케이블, 와이파이, 광섬유 등을 통해 물리적으로 전송하는 계층입니다.
"MAC 주소는 뭐죠? 이전에 인터넷 계층에서 IP주소를 사용해서 데이터 보낼곳을 지정해준 것 아닌가요? 왜 또 주소가 필요하죠?"
MAC 주소(Media Access Control Address) 는 네트워크에 연결된 각 기기에 할당된 고유한 식별자입니다.
즉, 네트워크 카드(인터페이스)에 부여된 고유한 주소로, 로컬 네트워크에서 데이터가 정확한 기기에 도달할 수 있도록 하는 역할을 합니다.
쉽게 말해, 하드웨어를 식별하는 고유한 주소라고 생각하면 됩니다.
인터넷 계층에서는 IP 주소를 사용해서 데이터가 어디로 가야 할지(목적지)를 지정해줬습니다. 하지만 데이터가 네트워크에 들어온 후, 최종적으로 어떤 기기(컴퓨터, 스마트폰 등)에 도착할지를 지정하기 위해 MAC 주소가 필요합니다.
즉, IP 주소는 데이터가 어떤 네트워크(네트워크 간 이동)로 가야 할지를 지정하고, MAC 주소는 데이터가 같은 네트워크 안에서 어떤 기기로 가야 할지를 지정하게 됩니다.
이제, TCP에 대해서 조금 더 깊게 알아보도록 하겠습니다.
TCP
먼저, TCP의 정의는 생략하고 가지고 있는 특성에 대해서 알아보도록 하겠습니다. 특성은 다음과 같습니다.
- 송신부와 수신부의 연결을 확인하는 연결형 서비스입니다.
- 패킷 교환 방식은 패킷이 전달되는 회선이 정해져 있는 가상 회선 방식입니다.
- 패킷의 전송 순서가 보장됩니다.
- 패킷의 수신 여부를 확인합니다.
- 송신부와 수신부는 1:1 통신을 합니다.
- 데이터 손실이 없음을 보장하기 때문에 신뢰성이 높습니다.
- 데이터의 송수신 속도가 느립니다.
두번째 특성을 보면, TCP의 패킷 교환 방식은 가상 회선 방식을 사용한다고 합니다.
가상 회선 방식이 무엇일까요?
가상 회선 방식은 데이터를 주고 받기 전에 패킷을 전송할 경로로 가상 회선을 설정해서 모든 패킷을 같은 경로로 전송하는 방식입니다.
쉽게말해, 데이터를 보내기 전에 길을 미리 정해놓고, 모든 데이터가 같은 길로 이동하는 방식입니다.
미리 정해 놓은 길에 데이터를 보내므로 자연스럽게 순서가 보장되게 됩니다.
그림과 같이 정해놓은 경로에 순서대로 패킷을 보내게 됩니다. 하나의 경로에 데이터를 보내니 자연스럽게 순서가 보장됩니다.
개인적으로 저는 자료구조의 Queue가 떠올랐습니다.
이제 첫번째 특성을 한번 보도록 하겠습니다.
첫번째 특성에서 TCP는 송신부와 수신부의 연결을 확인하는 연결형 서비스라고 합니다. 말 그대로 연결을 하는 서비스를 의미합니다.
그렇다면, TCP는 어떻게 송신부와 수신부를 연결하게 될까요?
결론부터 말하자면, TCP는 핸드셰이킹을 통해 송신부와 수신부를 연결하게 됩니다.
핸드 셰이킹이 무엇일까요?
핸드 셰이킹
핸드셰이킹(Handshake) 은 TCP에서 송신부와 수신부가 데이터를 주고받기 전에 연결을 설정하는 과정을 의미합니다.
쉽게 말해서, 서로 통신이 가능한 상태인지 확인하고, 데이터 전송을 준비하는 과정입니다. 3-way 핸드 셰이킹과 4-way 핸드 셰이킹 2가지 종류가 있습니다.
"굳이 핸드셰이킹을 왜 해주나요? 핸드셰이킹 없이 강제로 보내면 안 되나요?"
결론부터 말하면, 핸드셰이킹을 하지 않으면 데이터가 손실될 가능성이 크고, 신뢰성 있는 통신이 불가능하기 때문입니다.
상대방(수신부)이 데이터를 받을 준비가 되어 있지 않은데 데이터를 보내면, 패킷이 손실되거나, 순서가 뒤바뀌는 문제가 발생할 수 있습니다.
"그럼, 핸드셰이킹을 하면 뭐가 좋은가요?"
핸드셰이킹을 하면 "서로 통신 가능"한 상태에서만 데이터를 주고받기 때문에, 손실 없이 안정적인 연결을 유지할 수 있습니다.
이제 핸드 셰이킹의 각 종류에 대해서 알아보도록 하겠습니다.
먼저, 3-way 핸드 셰이킹에 대해서 알아보겠습니다.
3-way 핸드 셰이킹
TCP에서 송신부(클라이언트)와 수신부(서버)가 데이터를 주고받기 전에 안정적인 연결을 설정하는 과정입니다.
쉽게 말해, 서로 통신할 준비가 되었는지 확인하는 3단계 과정입니다.
3-way 핸드 셰이킹의 과정은 다음 그림과 같습니다.
각 순서는 다음과 같습니다.
1. 송신부가 수신부와 연결하기 위해서 SYN(N)이라는 메시지를 보내게 됩니다. 이때 임의의 숫자인 N과 함께 보내게 됩니다. 송신부는 수신부로 응답이 오기 전에는 SYN_SENT(연결 요청을 보냈지만, 아직 서버의 응답을 기다리고 있는 상태) 상태가 됩니다.
2. 수신부가 송신부로부터 SYN 메시지를 받으면, 연결 요청을 허락한다는 의미인 ACK 메시지를 전송합니다. 이때, 수신부는 전 단계에서 송신부로부터 받은 임의의 숫자 N에 1을 더한 N+1의 값을 함께 보내게 됩니다. 추가로, SYN 메시지에 임의의 숫자 M을 함께 보내고 송신부의 응답을 기다리게 됩니다. 이때 수신부는 SYN_RECEIVED(연결 요청을 승인했지만, 아직 송신부의 최종 확인[ACK]을 기다리는 상태) 상태가 됩니다.
3. 송신부가 수신부로부터 ACK + SYN 메시지를 받는 경우, 연결이 성립된다는 의미인 established 상태가 됩니다. ACK + SYN 메시지에 대한 응답으로 ACK 메시지와 이전 단계에서 받은 임의의 숫자 M에 1을 더한 M+1 값을 함께 보냅니다. 이때, ACK 메시지에는 송신부에서 전송하려는 데이터가 포함될 수 있습니다. 최종적으로 송신부로부터 ACK 메시지를 받은 수신부도 established 상태가 됩니다.
쉽게 말해, 연결이 완료된 상태를 의미합니다.
"귀찮게 한번에 연결하면 되지, 굳이 3번으로 나눠서 하나요?"
결론부터 말하면, 한 번에 연결하면 데이터 손실, 순서 오류, 보안 문제 등이 발생할 수 있기 때문에, 3-Way Handshake가 필요합니다.
3번의 과정을 거치면, 상대방이 정상적인 상태인지 확인하고, 신뢰성 있는 연결을 유지할 수 있습니다.
만약 한 번의 연결 요청만으로 연결이 완료된다면 어떻게 될까요? 해커가 서버를 공격하는 것이 너무 쉬워지지 않을까요?
사실, 우리가 전화를 걸 때도 자연스럽게 핸드셰이킹을 합니다. 전화를 걸면, 다짜고짜 본인이 할 말을 먼저 하지 않고,"여보세요?"라고 상대방이 응답할 준비가 되었는지 확인하는 과정이 필요하죠.
TCP의 3-Way Handshake도 같은 원리입니다. 송신부(클라이언트)와 수신부(서버)가 제대로 연결된 상태인지 확인한 후에야,
데이터를 안정적으로 주고받을 수 있습니다.
"ACK, SYN은 뭐고 왜 굳이 N과 M이라는 임의의 수를 함께 보내게 되는건가요?"
SYN (Synchronize)는 연결 요청을 의미하고, ACK (Acknowledge)는 요청 승인을 의미합니다.
SYN(Synchronize)과 ACK(Acknowledge)는 TCP 핸드셰이킹에서 연결을 설정하고 응답을 확인하는 데 사용됩니다.
N과 M이라는 임의의 숫자(시퀀스 번호, Sequence Number)는 데이터의 순서를 유지하고, 중복이나 보안 문제를 방지하기 위해 필요합니다.
"N과 M이 어떻게 데이터 순서 유지, 중복, 보안 문제를 방지할 수 있죠?"
순서
인터넷 환경에서는 패킷이 여러 경로로 이동하며 순서가 바뀔 가능성이 있습니다. TCP는 이를 방지하기 위해 각 패킷에 고유한 번호(시퀀스 번호)를 부여하여 순서를 유지합니다.
중복
인터넷은 네트워크가 불안정할 경우, 같은 패킷이 여러 번 전송될 수 있습니다. 서버가 N 값을 보고, 같은 패킷인지 아닌지를 구분할 수 있습니다.
보안
N과 M이 없으면, 공격자가 서버와 클라이언트의 통신을 쉽게 가로챌 수 있습니다. 매번 랜덤한 시퀀스 번호를 사용하면, 공격자가 중간에 끼어들어도 패킷을 변조하기 어려워집니다.
"패킷이 여러 경로로 이동한다? 분명 TCP는 가상회선 방식을 사용하기에 순서가 보장된다고 하지 않았나요?"
사실, 가상회선 방식은 인터넷에서 주로 사용하는 방식은 아닙니다. 인터넷에서는 대부분 데이터그램 방식(IP 기반)이 주로 사용됩니다.
(단, 전용 인터넷망이나 특정 상황에서만 사용이 됩니다.)
"헷갈립니다. TCP/IP 방식에서 패킷은 어떻게 전송되는 건가요?"
TCP/IP 방식의 패킷 전달 순서는 다음과 같습니다.
(1) TCP 연결 설정 (3-way Handshake)하빈다.
(2) TCP가 데이터를 작은 패킷으로 쪼개고 IP를 통해 전송 합니다.
(3) IP는 데이터그램 방식으로 패킷을 여러 경로로 보냅니다. (순서가 바뀌거나 일부 손실될 수 있음)
(4) 수신 측에서 TCP가 시퀀스 번호를 보고 패킷을 올바른 순서로 정렬합니다.
(5) 손실된 패킷이 있으면 TCP가 재전송 요청 & 복구합니다.
"데이터그램 방식은 뭐고, 사용하는 이유는 무엇인가요?"
데이터그램 방식은 패킷을 보낼 때 미리 정해진 경로 없이, 각각의 패킷이 독립적으로 최적의 경로를 찾아 이동하는 방식입니다.
또한, 네트워크 부하를 줄이고 유연한 데이터 전송을 위해 사용됩니다.
"데이터그램 방식이 어떻게 네트워크 부하를 줄이고, 유연한 데이터 전송을 위해 사용되나요?"
가상 회선 방식과 비교해서 설명하도록 하겠습니다.
네트워크 부하
가상 회선 방식은 미리 정해진 경로를 유지해야 하므로, 특정 경로가 과부하가 걸릴 수 있지만, 데이터그램 방식은 네트워크 상황에 따라 최적의 경로를 선택하여 더 효율적으로 트래픽을 분산할 수 있습니다.
유연한 데이터 전송
가상 회선 방식은 경로가 고정되어 있어 장애 발생 시 전체 통신이 끊어질 수 있습니다. 반면, 데이터 그램 방식은 각 패킷이 독립적으로 이동하며, 상황에 따라 경로가 바뀔 수 있도록 설계되어 있습니다. 예를 들어, 어떤 라우터가 과부하 상태이거나 장애가 발생하면, 다른 경로를 선택하여 전송이 가능하게 됩니다.
데이터 그램 방식을 그림으로 표현하면 다음과 같습니다.
이제 4-way 핸드 셰이킹에 대해서 알아보도록 하겠습니다.
3-way 핸드 셰이킹은 연결할때 사용하는 방식입니다. 그렇다면, 4-way 핸드 셰이킹은 언제 사용할까요?
4-way 핸드 셰이킹
4-Way 핸드 셰이킹은 TCP 연결을 종료할 때 사용하는 방식입니다.
4단계 과정을 통해 연결을 해제하게 됩니다.
4-way 핸드 셰이킹의 과정은 다음 그림과 같습니다.
1. 송신부가 수신부와 연결을 종료하기 위해, FIN 메시지를 보내게 됩니다. 이때 송신부는 FIN_WAIT1 상태가 됩니다.
2. 수신부가 송신부로부터 FIN 메시지를 받으면 응답값으로 ACK를 보냅니다. 이때 수신부는 CLOSE_WAIT 상태가 됩니다. 수신부는 메시지를 보낸 후, 어플리케이션을 종료하는 등 연결을 종료하기 위한 작업을 합니다. 송신부는 수신부에서 보낸 ACK 메시지를 받고, FIN_WAIT2 상태가 됩니다.
3. 수신부에서 연결을 종료할 준비가 되면, 송신부에 FIN메시지를 보내고, LAST_WAIT 상태가 됩니다.
4. 송신부는 서버로부터 받은 FIN 메시지에 응답하기 위해서 ACK 메시지를 보내고 TIME_WAIT 상태가 됩니다. 이 상태에서 일정 시간이 지나게 되면 CLOSED 상태가 됩니다. 수신부는 송신부로부터 ACK 메시지를 받고 CLOSED 상태가 됩니다.
"FIN이 의미하는게 무엇인가요?"
FIN(Finish) 메시지는 "더 이상 보낼 데이터가 없으므로 연결을 종료하겠다"는 의미입니다.
즉, 송신부(클라이언트 또는 서버)에서 더 이상 데이터를 전송할 필요가 없을 때, FIN을 보내 연결을 끊겠다는 신호를 전달하는 것입니다.
"4번째 과정에서 왜 송신부는 바로 CLOSED 상태가 되지 않고, TIME_WAIT 상태가 되나요?"
결론부터 말하면, FIN 메시지 이전에 보낸 패킷이 FIN 메시지 수신보다 지연되어 발생하는 패킷 유실에 대비하고, 수신부에 ACK 메시지가 제대로 전달되지 않아 연결 해제가 이뤄지지 않는 경우도 대비하기 위해서입니다.
정리
TCP/IP는 인터넷에서 데이터를 주고받기 위한 네트워크 프로토콜입니다.
TCP/IP는 응용 계층, 전송 계층, 인터넷 계층, 네트워크 인터페이스 계층으로 구성됩니다. 전송 계층에서는 데이터 단위를 세그먼트(Segment)로 나누고, 인터넷 계층에서는 이를 패킷(Packet) 단위로 전송합니다.
TCP는 연결을 설정할 때 3-Way Handshake, 연결을 종료할 때 4-Way Handshake를 사용하여 신뢰성을 보장합니다.
즉, TCP/IP는 데이터를 안전하고 효율적으로 주고받기 위해 계층 구조와 핸드셰이킹 과정을 활용하는 핵심 네트워크 프로토콜입니다.
'CS' 카테고리의 다른 글
[네트워크] OSI 7계층 (2) | 2025.01.27 |
---|---|
[운영체제] 스케줄링 (0) | 2024.11.26 |
데이터베이스 이상 현상의 원인, 속성 간 종속 (0) | 2024.09.25 |
CPU를 극단적으로 사용하기 (1) | 2024.08.28 |