Search

TCP

TCP란?

TCP는 OSI 4계층 전송 계층에 속하는 네트워크 프로토콜이다.
인터넷에서 데이터를 신뢰성 있게 전달하기 위한 연결 지향형 프로토콜이다.

특징

연결 지향적 : 데이터 전송을 시작하기 전에 송신자와 수신자간의 연결을 설정한다. 이 때 3-way handshaking을 사용한다.
신뢰성 : 데이터가 유실되거나 손상되었을 때 이를 감지하고 재전송한다. 또한 데이터를 수신 했는지 확인한다.
순서보장 : 패킷의 전송 순서가 보장된다.
흐름 제어 : 송신자가 수신자의 처리 속도에 맞춰 데이터를 전송한다.

TCP 핸드셰이킹

TCP는 연결형 서비스를 지원하기 위해 송신부와 수신부를 연결하는 과정을 거친다.
연결을 시작할 때는 3-way handshaking, 연결을 종료할 때는 4-way handshaking을 한다.

3-way handshaking

3-way handshaking은 TCP 연결을 설정하는 과정으로 클라이언트와 서버가 데이터를 주고 받기 전에 서로를 인식하고 연결을 준비하는 과정이다.
1.
송신자 Client는 SYN을 수신부에 보낸다. SYN는 Synchronization(동기화)를 의미하고 연결을 생성할 때 사용한다. 이 때 송신자는 자신의 Sequence Number를 포함하여 SYN 패킷을 보낸다. (SYN, seq : 100)
2.
수신자 Server는 클라이언트의 요청을 받고 이를 승인(ACK)하며 송신자의 seq에 +1을 하여 보내고, 동시의 자신의 Sequence Number를 SYN 패킷에 포함하여 보낸다. (SYN-ACK, seq: 200, ack: 101)
3.
송신자 Client가 서버의 SYN을 확인(ACK)하면 연결이 성립되었다는 의미인 ESTABLLISHED 상태가 되며 TCP 연결이 완전히 성립된다. 송신자는 마찬가지로 ACK에는 상대의 seq에 +1을 해서 보내고 자신의 seq인 101을 보낸다. (ACK, seq:101, ack: 201) 수신자 Server는 마찬가지로 ESTABLLISHED 상태가 된다.

4-way handshaking

4-way handshaking은 TCP가 연결을 안전하게 종료하기 위한 과정이다. 4번의 패킷이 오가기 때문에 이름이 붙었고 데이터 전송의 마무리와 리소스 해제를 위한 단계이다.
1.
송신자 Client가 수신자 Server와의 연결을 종료하려고 FIN 메세지를 보낸다.
2.
Server가 Clinet로부터 FIN 메세지를 받으면 이에 대한 응답으로 ACK를 보낸다. 이 때 Server는 CLOSE_WAIT 상태가 된다. Server는 ACK를 보낸 후 앱을 종료하는 등 연결을 종료하기 위한 작업을 한다. Client는 Server에서 보낸 ACK를 받고 난 후 FIN_WAIT2 상태가 된다.
3.
Server는 연결을 종료할 준비가 끝나면 Client에 FIN 메세지를 보내고 LAST_WAIT 상태가 된다.
4.
Client는 Server로 부터 받은 FIN 메세지에 응답하기 위해 ACK 메세지를 보내고 TIME_WAIT 상태가 된다. 그 후 일정 시간이 지나면 CLOSED 상태가 된다. 일정시간 동안 TIME_WAIT 상태를 유지하는 이유는 FIN 메세지 전에 보낸 패킷이 FIN 메시지 수신보다 지연되어 유실되는 경우를 방지하기 위해서다. Server는 Client로부터 ACK를 받으면 CLOSED 상태가 된다.