TCP란?

zito·2024년 9월 2일
post-thumbnail

TCP란?

전송 제어 프로토콜의 약자(Transmission Control Protocol)로 애플리케이션 사이에서 안전하게 데이터를 통신하는 규약입니다.

배경

두 기기간 데이터를 전송할 때 데이터를 분할한 뒤 다양한 경로로 전송합니다.

이 방법은 속도를 높여주지만, 안정성이 떨어집니다.

특정 데이터 조각이 유실되거나, 데이터 조각간의 순서가 엉킬 수 있기 때문입니다.

TCP는 데이터의 안정성을 높이고 신뢰성을 보장해주며 이런 문제를 해결합니다.

TCP는 크게 흐름제어와 혼합제어라는 방법을 사용해 이러한 문제를 해결합니다.

각 방법에 대한 설명은 다른 글에서 정리하겠습니다.

TCP 헤더

TCP 통신과정에서 데이터를 분할합니다.

분할한 데이터에 TCP 헤더를 붙이는데, 이를 TCP 세그먼트라고 합니다.

TCP 헤더를 통해 수신 애플케이션에서 데이터를 안전하고 정확하게 복구할 수 있습니다.


[이미지 출처: https://www.pynetlabs.com/transmission-control-protocol-tcp-header/]

Source port number: 전송 애플리케이션의 포트 번호입니다.

Destination port number: 수신 애플리케이션의 포트 번호입니다.

Sequence Number(SYN): TCP 과정에서 데이터를 분할합니다. SYN은 분할된 데이터의 순서를 뜻합니다.

Acknowledgement Number(ACK): 수신 애플리케이션의 입장에서, 다음으로 받고싶은 SYN을 뜻합니다.

3-Way Handshake

TCP 통신을 위해서는 Network의 연결이 필수적입니다.

이를 위해서는 송신, 수신 애플리케이션이 준비가 되었는지 확인을 하고

데이터의 정확한 전달을 위한 세션을 만들어야합니다.

이 과정에서 TCP는 3-way handshake를 사용합니다.

  1. SYN: Client가 Server에게 SYN(SYN 플래그를 세운 TCP 패킷)를 전송합니다. SYN는 임의의 숫자 A입니다.(예시)
  2. SYN-ACK: Server는 SYN-ACK로 답장합니다.
    SYN는 임의의 숫자 B(예시), ACK는 A에 1을 더한 A + 1을 답장합니다
  3. ACK: Client가 Server에 ACK로 B에 1을 더한 B + 1을 전송합니다.

1, 2번을 통해서 서버가 클라이언트의 요청에 대해 정확한 응답을 할 수 있는지 확인하고,

2,3번을 통해 클라이언트가 서버의 요청에 대해 정확한 응답을 할 수 있는지 확인합니다.

4-Way Handshake

TCP는 양방향 통신의 안전한 종료를 위해 4-Way Handshake를 사용합니다.
그렇다면 왜 그냥 종료하지 않고 번거롭게 이러한 프로세스를 거쳐 종료할까요?

왜냐하면 TCP는 신뢰성을 보장하는 Protocol이기 때문입니다. TCP는 수신측이 데이터를 잘 받았는지, 잘 받았다는 응답은 잘 받았는지 확인하며 신뢰성을 보장합니다.
이때, 예기치않게 연결이 종료된다면 신뢰성에 문제가 생길 수 있습니다.

TCP는 4-Way Handshake를 사용하여 양측이 종료할 의사가 있는지. 종료할 준비가 되었는지 확인하고 통신을 종료하여 TCP의 신뢰성에 문제가 생기지 않게합니다.

Client의 FIN과 그에 대한 Server의 ACK.
Server의 FIN과 그에 대한 Client ACK.
해당 과정을 통해, 4-Way Handshake는 이루어집니다.

각 단계에서의 상태를 Client와 Server의 입장에서 다루겠습니다.

Client의 입장에서

  • ESTABLISH : 서버측과 연결이 되어있는 상태입니다.
  • Fin-Wait-1 : 서버에 FIN 플래그를 세운 TCP 패킷을 전송 후 서버의 응답을 대기하는 상태입니다. 이 때, 통신에 필요한 자료구조를 폐기하기 때문에 더이상 데이터를 전송할 수 없습니다.
  • Fin-Wait-2 : 서버에 보낸 FIN에 대한 ACK를 받은 상태입니다. 서버의 FIN을 대기하는 상태입니다.
  • Time-Wait : 서버로 부터 FIN을 수신, ACK를 전송 후의 상태입니다. 해당 상태에서 MSL 시간만큼 기다립니다.

Time-Wait이 필요한 이유

만약, Client가 보낸 ACK가 유실될 경우 Server는 다시 FIN 플래그를 세운 TCP 패킷을 전송하게됩니다.

Client가 Time-Wait 상태를 건너뛰고 종료할 경우 Server의 FIN 요청에 대한 ACK를 전송할 수 없게 되어 다른 Client가 FIN을 받아 바로 종료하거나 Server 에서 통신을 계속 열어놓게 될 수 있습니다.

MSL(Maximum Segment Lifetime)

MSL은 TCP 세그먼트가 네트워크에서 존재할 수 있는 최대 시간을 의미합니다.
RFC 793에서 2분으로 지정하였지만, 실제로는 30초 ~ 2분의 값을 사용하는 경우가 많습니다.

Server의 입장에서

  • ESTABLISH: Client측과 연결되어 있는 상태
  • Close-Wait: Client측의 FIN을 받고 ACK를 전송한 상태. 이때, 서버 애플리케이션에 클라이언트측 애플리케이션이 종료된다고 알립니다.
  • Last-Ack: Server측 애플리케이션이 종료된다면, Client 측에 FIN을 전송합니다.
  • Close: Client측에 전송한 FIN에 대한 ACK를 받는다면 연결을 종료합니다.
profile
DevOps Engineer를 희망하는 Network Engineer입니다.

0개의 댓글