전송 제어 프로토콜의 약자(Transmission Control Protocol)로 애플리케이션 사이에서 안전하게 데이터를 통신하는 규약입니다.
두 기기간 데이터를 전송할 때 데이터를 분할한 뒤 다양한 경로로 전송합니다.
이 방법은 속도를 높여주지만, 안정성이 떨어집니다.
특정 데이터 조각이 유실되거나, 데이터 조각간의 순서가 엉킬 수 있기 때문입니다.
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을 뜻합니다.
TCP 통신을 위해서는 Network의 연결이 필수적입니다.
이를 위해서는 송신, 수신 애플리케이션이 준비가 되었는지 확인을 하고
데이터의 정확한 전달을 위한 세션을 만들어야합니다.
이 과정에서 TCP는 3-way handshake를 사용합니다.

1, 2번을 통해서 서버가 클라이언트의 요청에 대해 정확한 응답을 할 수 있는지 확인하고,
2,3번을 통해 클라이언트가 서버의 요청에 대해 정확한 응답을 할 수 있는지 확인합니다.
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가 보낸 ACK가 유실될 경우 Server는 다시 FIN 플래그를 세운 TCP 패킷을 전송하게됩니다.
Client가 Time-Wait 상태를 건너뛰고 종료할 경우 Server의 FIN 요청에 대한 ACK를 전송할 수 없게 되어 다른 Client가 FIN을 받아 바로 종료하거나 Server 에서 통신을 계속 열어놓게 될 수 있습니다.
MSL은 TCP 세그먼트가 네트워크에서 존재할 수 있는 최대 시간을 의미합니다.
RFC 793에서 2분으로 지정하였지만, 실제로는 30초 ~ 2분의 값을 사용하는 경우가 많습니다.