TCP

최근 편집: 2022년 12월 27일 (화) 14:50

전송 제어 프로토콜(Transmission Control Protocol)은 인터넷 프로토콜과 함께 인터넷의 근간을 이루는 양대축이다. 둘을 묶어서 TCP/IP로 자주 부르는 데, 원래 둘이 한 몸이었기 때문이다.

개요

OSI 참조 모델 4계층(전송 계층)에 속하는 TCP는 가상 회선 방식으로 연결 지향형이며, 에러 검출이나 흐름 제어가 가능한 신뢰적 프로토콜이다. 원래 한 몸이었던 인터넷 프로토콜이 어떤 꼬라지인지 생각해보면 격세지감이다.

TCP/IP로 묶어서 불리게 된 가장 큰 원인은 둘의 다른 특성에 기인한다. IP는 best-effort, 즉 원본(Source; SRC)에서 목적지(Destination; DST)까지 연결되었는지 안 되었는지는 상관하지 않고, 그저 "목적지까지 도달해라 얍!"하고 보내면 끝이라는 뜻이다. 때문에 IP 만으로는 연결이란 개념을 만들어 낼 수가 없었고, 그래서 connection-oriented, 연결 지향적인 TCP 프로토콜이 제안되었으며, TCP는 동기화 등을 통해 의사적으로 원본과 목적지와의 연결을 구현한다.

여기에 TCP는 추가적으로 들어온 내용을 분류하기 위한 역할(포트 번호)도 담고 있으며, 연결 개념이 필요하지 않은 경우에도 포트 번호를 통해 들어온 내용을 분류하기 위해 UDP라는 프로토콜이 같이 굴러간다. 사실 TCP와 UDP만 알면 OSI 4계층은 거진 다 배운거다.

세그먼트

세그먼트(Segment)는 TCP가 보내는 덩어리(PDU)의 이름으로, 이걸 IP 패킷에 담아서 인터넷에 쏜다. UDP는 데이터그램이라는 이름 그대로 부른다.

세그먼트의 첫 머리인 헤더는 20바이트가 기본이고, 옵션에 따라 60바이트까지 늘어날 수 있다. 대체로 아래의 내용이 담겨있다.

  • 출도착 포트
    TCP는 응용 계층에서 데이터를 받아오는 데, 응용 계층은 어플리케이션이 전적으로 담당하는 구간으로 TCP 입장에서는 호스트 구분 대신 어플리케이션 구분이 필요하다. 이것을 포트 번호로 구분하며, 16비트로 1번부터 65536번까지 존재한다. 이것과 호스트 주소를 합쳐서 부르는 주소 형식이 "소켓"이다. 출도착 호스트 구분은 3계층 이하에서 하는 일이다.
  • 시퀀스 번호(SEQ)/응답 번호(ACK)
    TCP는 신뢰성 프로토콜로, 오가는 모든 내용에 번호를 붙여서 올바르게 통신하고 있는지 확인한다. 시퀀스 번호는 발송자가 보낼 때 기재하는 번호고, 응답 번호는 상대방의 세그먼트를 수신했다는 의미로 받았던 상대방 시퀀스 번호에 +1을 하여 보내는 번호다. 그러면 상대방은 +1된 번호 그대로 시퀀스 번호에 기재하여 보낸다.
  • 플래그
    이 세그먼트가 무슨 목적으로 보내지는 건지 표시하는 부분이다. 일반적인 통신에는 응답 번호가 같이 실려가므로 ACK 플래그가 항상 서 있고, 최초 통신 개시때는 서로의 시퀀스 번호를 맞춰야 한다는 표식인 SYN 플래그를 세워 보내고, 데이터 송수신이 종료된 시점에는 연결을 종료하자는 FIN 플래그를 세워 보낸다. 총 6개의 플래그가 규정되어 있다.

각주