TCP
는 Transmission Control Protocol의 약자로, 인터넷에서 데이터를 주고받을 때 사용하는 통신 규약입니다.
TCP
는 데이터를 작은 단위인 패킷으로 나누어 보내고, 수신 측에서는 패킷을 다시 원래의 데이터로 조립합니다.
이 과정에서 TCP
는 신뢰적 데이터 전송
이라는 특징을 가지고 있습니다.
패킷에 순서 번호를 부여하여 수신 측에서 올바른 순서로 조립할 수 있도록 합니다.
패킷에 체크섬을 부여하여 오류가 발생한 패킷을 감지하고 재전송 요청할 수 있도록 합니다.
수신 측에서 패킷을 받으면 잘 받았다는 응답 메시지인 ACK를 보내어 송신 측에 알려줍니다.
송신 측에서 ACK를 받지 못하면 일정 시간 후에 패킷을 다시 보내어 손실된 패킷을 보충합니다.
송신 측과 수신 측은 각각 자신이 처리할 수 있는 패킷의 양인 윈도우 크기를 조정하여 네트워크의 혼잡 상황을 피하고 전송 속도를 최적화합니다.
TCP에서 두 장치가 통신을 시작하기 전에 3-way handshake
를 사용해 연결을 수립
합니다.
3-way handshake
는 TCP가 두 장치 간의 안전하고 신뢰할 수 있는 연결을 설정하는데 사용됩니다.
3-way handshake
는 다음과 같은 순서로 이루어집니다.
클라이언트가 서버에게 SYN
패킷을 보내고, SYN_SENT
상태가 됩니다. SYN
패킷에는 클라이언트의 초기 시퀀스 번호가 포함됩니다.
서버가 SYN 패킷을 받으면, 클라이언트의 요청을 수락한다는 의미로 SYN/ACK
패킷을 보내고, SYN_RECEIVED
상태가 됩니다. SYN/ACK
패킷에는 서버의 초기 시퀀스 번호와 클라이언트의 시퀀스 번호에 1을 더한 값이 포함됩니다.
클라이언트가 SYN/ACK 패킷을 받으면, 서버와의 연결이 성립되었다는 의미로 ACK
패킷을 보내고, ESTABLISHED
상태가 됩니다. ACK 패킷에는 서버의 시퀀스 번호에 1을 더한 값이 포함됩니다.
3-way handshake
를 통해 두 장치는 각자의 시퀀스 번호를 동기화하고, 데이터 전송을 위한 준비를 마칩니다.
3-way handshake
는 TCP의 연결 지향적이고 신뢰성 있는 특성을 보장하는데 중요한 역할을 합니다.
4-way handshake
는 TCP 세션을 종료하기 위해 성행되는 절차입니다.
이 과정은 클라이언트와 서버 간의 연결을 안전하고 깔끔하게 종료하기 위해 사용됩니다. 이를 통해 클라이언트와 서버는 더 이상 데이터를 전송하지 않고 연결을 종료
할 수 있습니다.
클라이언트가 연결을 종료하겠다는 FIN
플래그를 전송합니다. 이때 클라이언트는 FIN-WAIT
상태가 됩니다.
서버는 FIN 플래그를 받고, 일단 확인 메시지 ACK
를 보내고 자신의 통신이 끝날 때까지 기다리는데 이 상태가 서버의 CLOSE_WAIT
상태입니다.
연결을 종료할 준비가 되면, 연결 해지를 위한 준비가 되었음을 알리기 위해 클라이언트에게 FIN
플래그를 전송합니다. 이 때 서버의 상태는 LAST-ACK
입니다.
클라이언트는 해지 준비가 되었다는 ACK를 확인했다는 메시지
를 보냅니다.