TCP/IP: 개념, 프로토콜 스택 및 데이터 전송

저자: IT Sectr 게시일: 2026-03-06 읽는 시간: 8 분

TCP/IP는 인터넷과 대부분의 컴퓨터 네트워크의 기초를 형성하는 프로토콜 스택입니다. 안정적인 데이터 전송을 담당하는 TCP 프로토콜과 노드 간 패킷 라우팅을 보장하는 IP를 결합합니다. IETF RFC 1180(2024)에 따르면, TCP/IP 스택은 모바일 및 웹 애플리케이션을 포함한 전 세계 네트워크 트래픽의 80% 이상을 처리합니다. 프로토콜 스택은 데이터가 네트워크의 장치 간에 어떻게 패키징, 주소 지정 및 전송되는지를 정의합니다.

핵심 사항

  • TCP/IP — 네트워크에서 데이터 전송을 위해 TCP(전송)와 IP(라우팅)를 결합하는 프로토콜 스택
  • 4계층 모델: 애플리케이션, 전송, 네트워크, 링크 — 각 계층이 고유한 작업을 수행
  • TCP는 확인 응답 및 재전송을 통해 전달, 패킷 순서 및 오류 제어를 보장
  • IP는 라우팅 제공 — 중간 노드를 통해 송신자에서 수신자로의 패킷 경로 선택
  • 이해 TCP/IP는 네트워크 애플리케이션 개발, 연결 디버깅 및 성능 최적화에 필수

TCP/IP란?

TCP/IP(Transmission Control Protocol / Internet Protocol)는 1970년대 ARPANET을 위해 개발되어 글로벌 인터넷의 사실상 표준이 된 프로토콜 스택입니다. 데이터가 패킷으로 분할, 주소 지정, 전송 및 수신자 측에서 재조립되는 방식을 정의합니다.

TCP/IP 아키텍처는 각 계층이 특정 기능을 추상화하는 다계층 원칙에 따라 구축됩니다. 애플리케이션 계층은 애플리케이션 데이터를 처리하고, 전송 계층은 안정성을 보장하며, 네트워크 계층은 라우팅을 처리하고, 링크 계층은 물리적 전송을 관리합니다. 모듈성을 통해 인접 계층에 영향을 주지 않고 계층 내에서 프로토콜을 교체할 수 있습니다.

모바일 개발에서 TCP/IP는 네트워크 요청을 하는 모든 애플리케이션에서 사용됩니다. URLSession, OkHttp, AFNetworking 및 Alamofire와 같은 라이브러리는 이 스택 위에서 작동하며 패킷 패키징 및 라우팅의 세부 사항을 개발자로부터 숨깁니다. 그러나 성능 최적화를 위해서는 TCP/IP에 대한 이해가 필요합니다. URLSessionConfiguration을 통한 TCP 매개변수 구성으로 타임아웃 관리, HTTP 영구 연결 유지 및 엔터프라이즈 환경용 프록시 설정이 가능합니다.

네트워크 문제 진단을 위해서는 TCP/IP 이해가 필수적입니다. 애플리케이션이 서버에 연결할 수 없는 경우 문제는 물리적 채널부터 애플리케이션 프로토콜까지 스택의 모든 계층에 있을 수 있습니다. tcpdump, Wireshark 및 Charles Proxy와 같은 도구를 사용하면 각 계층의 트래픽을 분석하고 병목 현상을 찾을 수 있습니다. 모바일 개발자를 위해 Xcode는 Network Debug Dashboard를 제공하고 Android Studio는 실시간으로 TCP 연결을 분석하는 Network Inspector를 제공합니다.

TCP/IP 모델의 계층

TCP/IP 모델은 4개의 계층으로 구성되며, 각 계층은 데이터 전송 중에 엄격하게 정의된 기능을 수행합니다. 이 계층 구조를 이해하는 것은 네트워크 문제 진단 및 애플리케이션 최적화에 필요합니다.

애플리케이션 계층

애플리케이션 계층에서는 애플리케이션이 직접 상호 작용하는 프로토콜이 작동합니다: HTTP, HTTPS, FTP, SMTP, DNS, WebSocket. 이 계층은 애플리케이션이 이해할 수 있는 형식으로 데이터를 포맷하고 전송 계층으로 전달합니다. 모바일 애플리케이션 개발자는 네트워킹 라이브러리를 통해 이 계층에서 작업합니다.

전송 계층

전송 계층은 다른 장치의 애플리케이션 간 데이터 전송을 보장합니다. 주요 프로토콜은 TCP(확인 응답이 있는 안정적인 전송)와 UDP(보장 없는 빠른 전송)입니다. TCP는 데이터에 송신자 및 수신자 포트를 추가하고 패킷 순서를 관리하며 네트워크 혼잡을 제어합니다.

네트워크 및 링크 계층

네트워크 계층은 IP 프로토콜에 의해 구현되며 주소 지정(IPv4, IPv6) 및 패킷 라우팅을 정의합니다. 각 패킷에는 송신자 및 수신자 IP 주소가 포함되며, 경로를 따라 있는 라우터는 라우팅 테이블을 기반으로 다음 노드를 결정합니다. IPv4는 32비트 주소(약 43억)를 사용하고 IPv6는 128비트 주소를 사용하여 주소 고갈 문제를 해결합니다.

링크 계층은 물리적 전송 매체(Ethernet, Wi-Fi, Bluetooth)와 함께 작동합니다. 이 계층은 패킷을 신호로 변환하고 MAC 주소를 통해 전송 매체에 대한 액세스를 관리하며 프레임 검사 시퀀스(FCS)를 사용하여 물리 계층 오류를 감지합니다.

링크 계층에서는 로컬 네트워크의 장치 IP 주소를 MAC 주소로 변환하는 ARP(Address Resolution Protocol)와 VPN 연결 및 모바일 데이터 네트워크에서 사용되는 PPP(Point-to-Point Protocol)와 같은 프로토콜이 작동합니다.

계층프로토콜기능
애플리케이션HTTP, HTTPS, DNS, FTP, WebSocket애플리케이션 데이터 포맷팅
전송TCP, UDP애플리케이션 간 전송, 오류 제어
네트워크IP, ICMP, ARP패킷 라우팅 및 주소 지정
링크Ethernet, Wi-Fi, PPP물리적 매체 전송

TCP 프로토콜의 작동 방식

TCP(Transmission Control Protocol)는 전송 계층의 주요 프로토콜 중 하나입니다. 애플리케이션 간 바이트 스트림의 안정적이고 순서화된 오류 검증 전달을 보장합니다. 데이터를 전송하기 전에 TCP는 3방향 핸드셰이크를 통해 연결을 설정합니다.

3방향 핸드셰이크(three-way handshake)는 클라이언트가 SYN 패킷을 보내면서 시작됩니다. 서버는 SYN-ACK 패킷으로 응답하여 수신을 확인합니다. 클라이언트는 ACK 패킷으로 핸드셰이크를 완료하고 데이터 전송이 시작됩니다. 이 프로세스는 양측이 교환 준비가 되었고 시퀀스 번호에 대해 동기화되었음을 보장합니다.

python
import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('example.com', 80))
sock.send(b'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n')
response = sock.recv(4096)
print(response.decode())
sock.close()

예제에서는 SOCK_STREAM 유형의 TCP 소켓이 생성되며 connect 호출 시 자동으로 3방향 핸드셰이크를 수행합니다. send 메서드는 HTTP 요청을 전송하고 recv는 응답을 수신합니다. 완료 후 close는 FIN 패킷을 보내 연결을 정상적으로 종료합니다.

클라이언트 처리가 있는 TCP 서버

스레드를 통해 여러 클라이언트를 수락하는 Python의 TCP 서버 예제를 살펴보겠습니다. 각 연결은 별도의 스레드에서 처리되어 기본 루프를 차단하지 않고 여러 클라이언트를 동시에 처리할 수 있습니다.

python
import socket
import threading

def handle_client(conn, addr):
    print(f'클라이언트 연결됨: {addr}')
    with conn:
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data.upper())
    print(f'클라이언트 {addr} 연결 해제됨')

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('0.0.0.0', 9090))
server.listen(5)
print('TCP 서버가 포트 9090에서 시작됨')

while True:
    conn, addr = server.accept()
    thread = threading.Thread(target=handle_client, args=(conn, addr))
    thread.start()

TCP 서버는 각 연결을 별도의 스레드에서 처리하며 무한 루프에서 accept를 호출합니다. handle_client 함수는 데이터를 수신하고 대문자로 변환한 후 sendall을 통해 다시 보냅니다. recv 루프가 종료되면(클라이언트가 연결을 닫을 때) 스레드가 종료되고 소켓이 자동으로 닫힙니다. 모바일 애플리케이션에서는 이러한 저수준 소켓 작업이 직접 사용되지 않습니다. 모바일 HTTP 라이브러리는 스레드 풀을 통해 연결을 관리하고 TCP 연결을 자동으로 재사용합니다.

TCP와 UDP의 차이점

TCP와 UDP 중 선택은 네트워크 통신 설계 시 핵심 결정 사항 중 하나입니다. TCP는 추가 지연 시간을 희생하여 전달, 순서 및 데이터 무결성을 보장합니다. UDP는 최소 지연 시간과 낮은 채널 부하를 위해 안정성을 희생합니다.

특성TCPUDP
연결설정함(핸드셰이크)설정하지 않음
신뢰성전달 보장보장하지 않음
패킷 순서순서화함순서화하지 않음
속도낮음높음
용도웹, 이메일, 파일스트리밍, 게임, DNS

모바일 애플리케이션의 경우 프로토콜 선택은 시나리오에 따라 다릅니다. REST API 및 데이터 로드는 TCP가 필요하고, 화상 통화 및 온라인 게임은 UDP의 속도 이점을 누립니다. 일부 애플리케이션은 두 프로토콜을 모두 결합합니다. 제어용 TCP와 미디어 스트리밍용 UDP입니다. UDP 위에서 실행되며 HTTP/3에서 사용되는 최신 QUIC 프로토콜은 두 접근 방식의 장점을 결합하며 iOS 및 Android에서 URLSession을 통해 자동으로 지원됩니다.

TCP/IP 코드 예제

오류 처리 및 타임아웃이 포함된 Python의 TCP 클라이언트 예제를 살펴보겠습니다. 이 접근 방식은 모바일 애플리케이션에서 안정적인 서버 연결에 사용됩니다.

python
import socket
import sys

def tcp_client(host, port):
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(10)
        sock.connect((host, port))
        print(f'{host}:{port}에 연결됨')
        return sock
    except socket.error as err:
        print(f'연결 오류: {err}')
        sys.exit(1)

sock = tcp_client('api.example.com', 443)
sock.close()

tcp_client 함수는 호스트와 포트를 받아 10초 타임아웃으로 소켓을 생성하고 연결을 시도합니다. 연결 오류(예: 서버를 사용할 수 없거나 방화벽 차단) 발생 시 문제 설명과 함께 예외가 발생합니다. 모바일 애플리케이션에서 연결 타임아웃은 중요합니다. 너무 짧으면 느린 네트워크에서 잘못된 오류가 발생하고, 너무 길면 인터페이스가 정지됩니다. 모바일 네트워크의 권장 값은 URLSession 구성에서 timeoutIntervalForRequest의 경우 10~15초, timeoutIntervalForResource의 경우 30~60초입니다.

자주 묻는 질문

TCP와 IP의 차이점은 무엇인가요?

IP는 라우팅을 담당하며 중간 노드를 통해 송신자에서 수신자로 패킷을 전달합니다. TCP는 안정적인 데이터 조립을 보장하며 순서를 제어하고 무결성을 확인하며 손실된 패킷의 재전송을 요청합니다. 함께 TCP/IP 스택을 형성합니다.

TCP/IP는 기본적으로 어떤 포트를 사용하나요?

TCP/IP는 고정 포트를 사용하지 않습니다. 포트는 애플리케이션에 의해 할당됩니다. 표준 포트: 80(HTTP), 443(HTTPS), 22(SSH), 25(SMTP). 포트 443은 모바일 애플리케이션에서 보안 웹 트래픽의 주요 포트입니다.

TCP 연결이란 무엇인가요?

TCP 연결은 3방향 핸드셰이크(SYN, SYN-ACK, ACK)를 통해 설정된 두 애플리케이션 간의 논리적 채널입니다. 연결은 송신자와 수신자의 쌍(IP 주소, 포트)으로 식별됩니다. 핸드셰이크는 양측이 데이터 교환 준비가 되었음을 보장합니다.

TCP/IP를 인터넷 없이 모바일 애플리케이션에서 사용할 수 있나요?

네, TCP/IP는 인터넷 접속 없이 로컬 네트워크(LAN)에서 작동합니다. 장치는 Wi-Fi Direct, Bluetooth PAN 또는 Ethernet을 통해 연결되고 로컬 IP 주소를 사용하여 데이터를 교환합니다. 로컬 TCP/IP는 IoT 장치 및 P2P 애플리케이션에서 사용됩니다.

TCP가 UDP보다 느린 이유는 무엇인가요?

TCP는 추가 메커니즘(전송 전 3방향 핸드셰이크, 각 패킷 확인, 손실된 세그먼트 재전송, 혼잡 제어)으로 인해 더 느립니다. UDP는 이러한 검사 없이 데이터그램을 전송하여 손실 가능성을 대가로 지연 시간을 줄입니다.

요약

  • TCP/IP — 인터넷 및 로컬 네트워크에서 데이터 전송을 보장하는 기본 프로토콜 스택
  • 4계층(애플리케이션, 전송, 네트워크, 링크)이 전송의 다양한 측면을 추상화
  • TCP는 오류 제어 및 확인 응답을 통해 안정적인 전달 보장
  • IP는 네트워크에서 패킷 라우팅 및 노드 주소 지정을 담당
  • TCP 또는 UDP 선택은 요구 사항에 따라 다름: 신뢰성 대 속도
  • 네트워크 요청을 하는 모든 모바일 애플리케이션은 TCP/IP 스택을 사용

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기