TCP(Transmission Control Protocol)는 애플리케이션 사이에서 안전하게 데이터를 통신하는 규약이에요.
데이터를 다양한 경로로 주고받으면 더 빠르게 통신할 수 있는데요. 고속도로가 막힐 때 일반 도로로 돌아가는 것과 비슷하죠. 하지만 데이터 통신 경로가 다양해지면 속도가 향상되는 대신 안정성이 떨어져요. 경로가 다양해지면 데이터 일부가 유실되거나 늦게 전달될 수 있기 때문이에요.
그래서 통신 속도를 높이면서도 안정성, 신뢰성을 보장할 수 있는 TCP가 탄생했어요. TCP는 처음 군사 통신 목적이 있었지만 이제는 보통 IP(Internet Protocol)와 엮어서 TCP/IP로 표현하기도 해요. TCP의 역사와 자세한 스펙이 궁금하다면 RFC 9293를 살펴보세요.
네트워크에서 데이터를 통째로 통신하는 경우는 거의 없어요. 예를 들어 이미지를 전송할 때 여러 조각으로 나누어 각 조각을 따로 전달한 뒤 합칠 수 있죠. TCP 통신도 마찬가지인데요. TCP 통신 과정은 다음과 같이 요약할 수 있어요.
- 데이터 스트림에서 받은 데이터를 일정 단위로 분할해요.
- 분할된 데이터 단위에 TCP 헤더를 붙여서 TCP 세그먼트를 생성해요.
- TCP 세그먼트를 IP 데이터그램으로 변환해요. IP 데이터그램은 인터넷 통신에 사용되는 데이터 패킷입니다.
- IP 데이터그램을 수신 애플리케이션에 보내요.
TCP 세그먼트는 헤더와 데이터 필드가 나뉘어 있어요. 주요 헤더를 자세히 살펴볼게요.
- Source Port: 데이터를 발송하는 애플리케이션의 포트 번호입니다.
- Destination Port: 데이터를 수신하는 애플리케이션의 포트 번호입니다.
- Sequence Number(SYN): TCP 통신 과정에서 데이터를 일정 단위로 분할하는데요. 분할된 데이터의 순서입니다.
- Acknowledgment Number(ACK): 데이터를 수신하는 애플리케이션 입장에서, 다음으로 받고 싶은 TCP 세그먼트의 Sequence Number입니다.
통신 과정에서 분할된 데이터가 순서대로 전달되지 않거나 각자 다른 경로로 통신될 수 있는데요. 위와 같은 TCP 헤더가 있어서 수신 애플리케이션에서 데이터를 안전하고 정확하게 원상복구할 수 있어요.
TCP 통신을 하려면 네트워크 연결 설정이 먼저 필요해요. 데이터를 발송하는 애플리케이션, 수신하는 애플리케이션 모두 준비가 됐다는 것을 보장하기 위해서 필요해요. 데이터를 정확하게 전달하기 위해 세션을 만드는 과정이기도 하고요. TCP 연결을 생성할 때는 3-Way Handshake를 이용해요.
- SYN: 클라이언트가 서버에게 SYN을 전송해요. SYN은 임의 숫자 A입니다.
- SYN-ACK: 서버가 SYN-ACK로 답장해요. SYN은 새로운 임의 숫자 B이고, ACK는 클라이언트로부터 전달받은 SYN의 1을 덧셈한 것입니다(A+1).
- ACK: 클라이언트가 서버에게 ACK(B+1)를 전송해요.
1-2번 과정은 클라이너트-서버 연결을 확인하고, 2-3번 과정은 반대로 서버-클라이언트 연결을 확인해요. Handshake로 안정적인 연결을 확인하면 데이터 통신을 시작할 수 있어요.