TCP(Transmission Control Protocol)

TCP는 애플리케이션으로 데이터가 올바르게 전달할 수 있도록 한다. 프로토콜 스택의 Application Layer 아래에 TCP Layer가 있다.

https://www.figma.com/embed?embed_host=share&url=https%3A%2F%2Fwww.figma.com%2Ffile%2F75ZcqxHDKMmGuR5s0m2A7C%2FUntitled

이를 위해 포트(Port) 번호를 사용하는데, 포트는 컴퓨터에 별도의 채널로 생각할 수 있다. 이를 통해 이메일을 사용하면서 웹 서핑을 할 수 있다.(웹 포트와 이메일 포트가 다르기 때문)

프로토콜 스택에서 패킷이 TCP 계층에 도달했을 때 TCP는 포트 번호를 기반으로 패킷을 수신할 애플리케이션을 결정한다.

TCP 작동원리

TCP는 프로토콜 스택을 통해 다음과 같이 작동한다.

전송하기

Application Layer에서 데이터를 수신하면 TCP는 관리 가능한 “Chunk”로 분할한다. 각 청크는 정보를 담고있는 TCP 헤더를 가지고 있는데, 데이터를 보내는 애플리케이션의 포트 번호가 포함된다.

https://www.figma.com/embed?embed_host=share&url=https%3A%2F%2Fwww.figma.com%2Ffile%2F7IH2JFAE7N9QwprseWgzYy%2FUntitled%3Fnode-id%3D0%253A1

수신하기

프로토콜 계층 아래 IP 계층에서 패킷을 수신 받는다. TCP는 패킷에 TCP 헤더를 제거하고(필요에 따라 재구성) TCP 헤더에서 가져온 포트 번호를 사용하여 데이터를 올바른 애플리케이션에 보낸다.

https://www.figma.com/embed?embed_host=share&url=https%3A%2F%2Fwww.figma.com%2Ffile%2FVbiWRoWjagQnw9MF6UqXyB%2FTCP-Receive-packet%3Fnode-id%3D0%253A1

TCP 특징

TCP는 연결 지향적이고 안정적 바이트 스트림 서비스이다. TCP를 사용하는 애플리케이션이 데이터를 교환하기 전 연결을 설정해야 함을 의미한다. TCP는 수신된 패킷에 대해 발신자에게 승인을 보내므로 신뢰할 수 있다. 또한 수신된 데이터의 오류를 검사하기 위해 헤더에 체크섬을 포함하고 검증한다.

TCP가 개발된 이유

1970년 냉전 당시 미 국방성이 개발하던 알파넷 프로젝트의 핵심 주제는 핵전쟁이 나도 살아남는 네트워크였다. 당시 네트워크는 회선 교환 방식으로 중계국이나 연결된 선이 하나라도 문제가 생기면 통신이 안되는 구조였다.(중계국은 요청에 따라 서로 다른 네트워크를 사람이 수동으로 연결해주는 역할을 수행했다.)

때문에 패킷 교환 방식이 개발되었는데, 하나의 데이터를 여러 개로 나누어(패킷) 여러 개의 회선을 통해 보내는 것이다.

패킷 교환 방식은 각각의 패킷들이 여러개의 노드(통신장치)를 경유하여 목적지에 도달한다. 때문에 노드 하나가 죽어도 약간의 데이터가 유실될 수 있지만, 전체 네트워크를 한 번에 타격하지 않는 이상 모든 데이터가 유실될 가능성은 낮다.

TCP 문제점

  • 패킷 유실 → ARQ
  • 패킷 재조립 순서의 부재 → Sequence number
  • 수신 또는 송신측 병목현상 → Sliding window

TCP Header

https://www.figma.com/embed?embed_host=share&url=https%3A%2F%2Fwww.figma.com%2Ffile%2FvUrrbI18IX3bILl6zt3oJR%2FTCP-Header%3Fnode-id%3D0%253A1

Source & Destination port number

출발지(Source)와 목적지(Destination)의 포트 번호를 나타내며, 각각 16bits를 할당 받는다.

Sequence number

시퀸스 번호는 전송하는 패킷의 순서를 의미하며, 32bits를 할당 받는다. 수신자는 시퀸스 번호를 통해 올바른 순서로 패킷을 재조립할 수 있게 된다.

최초 송신 시 랜덤한 번호로 초기화된다. 이후 보낼 데이터의 1bytes 당 시퀸스 번호 1씩 증가시키며 데이터의 순서를 표현한다.

Acknowledgement number

승인 번호는 수신자가 예상하는 다음 시퀸스 번호를 의미하며, 32bits를 할당 받는다.

시퀸스 번호 + 데이터 bytes 크기로 승인번호를 만든다. 즉, 다음에 보내주어야할 데이터의 시작점이다.

Window size

한 번에 전송할 수 있는 데이터의 양을 담는다.

Checksum

데이터 송신 중 발생할 수 있는 오류를 검출하기 위한 값이 담긴다.

Ugent pointer

URG 플래그가 1이라면 이 포인터가 가르키고 있는 데이터를 우선 처리한다.

Options

TCP 기능 확장에 사용되는 필드이다. 이 필드는 크기가 고정된 것이 아닌 가변적이다. 수신 측은 헤더와 데이터의 영역을 알기 위해 Data offset 필드를 사용한다.(misc.)