TCP란 무엇인가?
TCP란 Transmission Control Protocol의 줄임말이다.
다음과 같은 특징을 가진다.
- 서버와 클라이언트 간 데이터를 신뢰성 있게 전달하기 위해 만들어진 프로토콜이다.
- 데이터를 전송하기 전에 데이터 전성을 위한 연결을 만드는 연결지향 프로토콜이다.
- 데이터가 전달되는 과정에서 손실되거나 순서가 뒤바뀔 수 있으나, TCP는 손실을 검색하여 이를 교정할 수 있다.
연결 지향성
- TCP는 통신 시작 전에 수립 단계(Three-way Handshake)를 통해 연결을 설정하고, 통신이 완료되면 연결을 해제하는 단계(Four-way Handshake)를 거쳐 연결을 종료합니다.
- 이러한 연결 지향성은 데이터를 안정적이고 순서대로 전송할 수 있도록 보장합니다.
신뢰성 있는 통신
- TCP는 신뢰성 있는 통신을 제공합니다. 이를 위해 패킷 손실, 중복, 순서 오류 등에 대한 처리를 수행합니다.
- 수신자는 패킷의 정상적인 수신 여부를 확인하고, 문제가 발생하면 송신자에게 해당 정보를 통지하여 복구합니다.
흐름 제어
- TCP는 수신자의 처리 속도에 맞춰 데이터를 송신합니다. 수신자가 처리할 수 있는 양을 초과하여 데이터를 송신하지 않도록 흐름 제어를 수행합니다.
- 수신자는 윈도우 크기(Window Size)를 통해 자신이 수용할 수 있는 데이터 양을 송신자에게 알려줍니다.
TCP 3 way handshake
TCP는 장치들 사이에 논리적인 접속을 성립하기 위해 three-way handshake를 사용합니다.
TCP 3 Way Handshake는 TCP/IP 프로토콜을 이용해서 통신을 하는 응용프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위하여 상대방 컴퓨터와 사전에 세션을 수립하는 과정입니다.
Client > Sever : TCP SYN
Cient가 Server에게 접속을 요청하는 SYN 플래그를 보낸다.
Server > Client : TCP SYN ACK
Server는 Listen 상태에서 SYN이 들어온 것을 확인하고 SYN_RECV상태로 바뀌어 SYN + ACK 플래그를 Client에게 전송한다. 그 후 Server는 다시 ACK 플래글르 받기 위해 대기상태로 변경된다.
Client > Server : TCP ACK
SYN + ACK 상태를 확인한 Client는 서버에게 ACK를 보내고 연결성립이 된다.
SYN은 'synchronize sequence numbers', 그리고 ACK는 'acknoweldgment' 입니다.
이러한 절차는 TCP 접속을 성공적으로 성립하기 위해 반드시 필요하다.
3-way Handshaking 역할

화살표 방향을 보게 되면 3-way handshake는 양쪽 모두 데이터를 전송할 준비가 되었다는 걸 보장하고, 실제로 데이터 전달이 시작하기 전에 다른 한쪽이 준비되었다는 걸 알 수 있도록 해준다.
State 정보
- CLOSED : 포트가 닫힌 상태
- LISTEN : 포트가 열린 상태로 연결 요청 대기 중
- SYN_RECV : SYNC 요청을 받고 상대방 응답을 대기
- ESTABLISHED: 포트 연결 상태
- TIME-WAIT : Server로 부터 FIN을 수신하더라도 일정시간(default: 240초)동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정
4- Way Handshake

3way handshake가 연결 확립을 목적으로 진행했다면 4way handshake는 세션을 종료하기 위해 수행되는 절차이다.
Step 1 [Client -> FIN -> Server]
Client가 연결을 종료하겠다는 Fin플래그를 전송한다. 보낸 후에 FIN-WAIT-1 상태로 변한다.
Step 2 [Server --> ACK --> Client ]
FIN 플래그를 받은 Server는 확인메세지인 ACK를 Client에게 보내준다. 그 후 CLOSE-WAIT상태로 변한다. Client도 마찬가지로 Server에서 종료될 준비가 됐다는 FIN을 받기위해 FIN-WAIT-2 상태가 된다.
Step3 [Server --> Fin --> Client]
Close준비가 다 된 후 Server는 Client에게 FIN 플래그를 전송한다.
Step4 [Client -> ACK -> Server ]
Client는 해지 준비가 되었다는 정상응답인 ACK를 Server에게 보내준다. 이 때, Client는 TIME-WAIT 상태로 변경된다.
여기서 TIME-WAIT 상태는 의도치 않은 에러로 인해 연결이 데드락으로 빠지는 것을 방지하기 위해 변경 되는 것이다. 만약 에러로 인해 종료가 지연되다가 타임이 초과되면 CLOSED 상태로 변경됩니다.
요약
TCP(Transmission Control Protocol)은 신뢰성 있는 연결 지향적인 통신을 제공하는 프로토콜로, 데이터를 안정적으로 전송하기 위해 개발되었습니다. 여러 특징을 가지며, 연결 설정, 데이터 전송, 해제 등의 과정에서 신뢰성과 안정성을 제공합니다.
TCP의 특징:
- 연결 지향성 (Connection-Oriented): 세션을 수립하고 종료하기 위한 연결 과정을 거침.
- 신뢰성 있는 통신: 패킷 손실, 중복, 순서 오류 등을 검출하고 복구하여 신뢰성 있는 통신을 보장.
- 흐름 제어 (Flow Control): 수신자의 처리 속도에 맞춰 데이터를 송신하여 효율적인 통신을 제공.
- 혼잡 제어 (Congestion Control): 혼잡이 발생할 경우 송신 속도를 조절하여 네트워크 혼잡을 방지.
3-way Handshake:
- Client > Server (SYN): 클라이언트가 서버에게 연결을 요청하는 SYN 패킷을 전송.
- Server > Client (SYN-ACK): 서버는 클라이언트의 요청을 받아들이고 SYN + ACK 패킷을 전송.
- Client > Server (ACK): 클라이언트는 서버에게 ACK 패킷을 전송하여 연결을 수립.
4-way Handshake:
- Client > Server (FIN): 클라이언트가 연결 종료를 요청하는 FIN 패킷을 전송.
- Server > Client (ACK): 서버는 확인 응답으로 ACK 패킷을 전송.
- Server > Client (FIN): 서버가 연결 종료를 요청하는 FIN 패킷을 전송.
- Client > Server (ACK): 클라이언트는 확인 응답으로 ACK 패킷을 전송하여 연결 종료.
TIME_WAIT:
- TIME_WAIT 상태: 클라이언트가 연결 종료 후 일정 시간 동안 세션을 유지하고 잉여 패킷을 기다리는 상태. 데드락을 방지하기 위해 사용.
이렇게 TCP는 안정적이고 신뢰성 있는 통신을 제공하며, 3-way handshake와 4-way handshake를 통해 연결 설정 및 해제를 수행합니다. TIME_WAIT 상태는 에러로 인한 데드락을 방지하기 위한 것입니다.