저번 글에서는 간단하게 TCP의 flow control에 대해서 정리해 보았다. 이번글에서는 congestion control을 정리하기 전, TCP의 기본 연결 설정인 handshake에 대해서 정리해보려 한다.
1. TCP connection
TCP는 sender와 receiver 사이의 1:1 연결을 통해 신뢰성있는 데이터 전송을 보장한다. 이런 연결과정은 Handshaking 방법을 통해 이뤄지는데, Handshaking에 대해서 자세히 알아보자.
먼저 Handshaking이 뭔지 한 번 알아보자.
- data를 주고 받기 전에, sender와 receiver가 "handshake"를 한다.
- handshake를 한다는 의미는 connection을 설정하고(서로가 누군지 식별하고 연결을 설정하는 것),
- connection parameter(시 seq #)에 대해서 서로 정보를 주고 받는 것.
이전 글에서 TCP는 3-way handshaking 방식으로 연결 설정이 이뤄진다고 정리했었다. 3-way는 간단하게 설명하면, 3번의 정보를 주고 받은 뒤에 실제 data를 이용한 통신이 이뤄진다는 것이다.
-2-way Handshaking
여기서 드는 의문은 2-way handshaking이면 되지 않을까라는 것이다. 다음 그림을 살펴보자.

위 그림을 보면, 2-way handshaking 방식을 사람의 의사소통 방식, server-client 방식으로 나타낸 것이다. 즉, 위에서 부터 차례대로 설명하면,
- 왼쪽이 영희 오른쪽이 철수라고 가정하면
- 영희가 Let's talk라는 메세지를 철수에게 전달해 철수가 ESTAB(승인)했다.
- 철수도 OK라는 메세지를 영희에게 전달해 영희 측에서도 ESTAB(승인)했다.
- 그 뒤, 실제 메세지를 주고 받을 것이다.
그 밑의 client-server 방식에서도 설명하면,
- client가 서버에 x번째 데이터 대한 connection 요청 메세지를 보내고,
- server가 메세지를 받아 ESTAB한 뒤
- 승인 메세지를 client 측에 전달한다.
- client도 ESTAB(승인)한 뒤 실제 데이터를 주고 받기 시작할 것이다.
겉으로 보기에는 2-way handshaking 방식으로도 문제가 전혀 없어 보일 것이다. 그렇지만 다음과 같은 문제가 존재한다. 그림으로 한 번 살펴보자.

위 그림에 대해서 설명해보면, 2-way handshaking 방식으로 이루어지는데,
- client가 서버에 x번째 데이터 대한 연결 요청을 보냈다.
- 서버는 요청 메세지를 받고 ESTAB(승인)했다.
- 요청 승인 메세지에 대한 timeout이 일어나 client는 서버 측에 연결 요청 메세지를 retransmit한다.
- 요청 승인 메세지를 client에게 전달했다.
- client는 요청 승인 메세지를 받고 ESTAB(승인)했다.
- 그 후로 데이터를 주고 받은 뒤 특정 시점에 연결을 종료했다.
- 모종의 이유로 전에 retransmit한 연결 요청 메세지가 연결 종료 후에 도착했다.
- server는 또 다른 연결 요청으로 판단하고 요청 승인 메세지를 client측에 보낸다.
이렇게 되면, 서버는 불필요한 연결을 설정하게 되고, 반쪽짜리 연결이 발생하게 된다. 서버에는 요청 없는 연결을 설정해 이런 설정이 많이지면 서버에 부담이 될 수 밖에 없다.
또 다른 예시를 살펴보자.

위 그림에 대해 설명하면, 직전 그림과 비슷한 상황이지만 다음 상황이 다르다.
- 클라이언트가 x+1번째 ACK을 받지 못해 데이터를 재전송했다고 가정하자.
- 근데 이 재전송한 x+1번째 데이터가 연결이 종료된 후에
- x번째 데이터에 대한 요청 재전송 이 도착하고 server측에 도착했다고 가정해보자.
- server는 다시 연결을 ESTAB(승인)할 것이다
이렇게 되면 duplicated data인 x+1 데이터가 다시 들어오게 된 것이고, 서버에 당연히 부담이 될 것이다.
-3-way Handshaking
위와 같은 2-way handshaking 문제를 해결하기 위해 TCP는 3-way handshaking 방식을 선택한다.

위 그림을 차례대로 설명해 보면,
- client와 server는 소켓을 만들어놓고 연결을 LISTEN 상태에서 기다린다.
- client는 seq #와 SYNbit를 정해서 server에게 연결 요청 메세지를 보낸다. (client 상태는 SYNSENT로 바뀐다.)
- server는 메세지를 받으면, seq #를 설정하고 SYNbit에 대한 ACK와, client가 설정한 seq #에 대한 ACK을 보낸다. 이때, TCP segment의 S field(flag)와 A field(flag)가 활성화되고, server의 상태는 SYN RCVD로 바뀐다.
- SYN와 seq #에 대한 ACK를 받은 client는 ESTAB(연결 승인)상태로 바뀌고, server의 SYNbit에 대한 ACK와 seq #에 대한 ACK를 보낸다.
- SYN과 seq #에 대한 ACK를 받은 server는 client가 활성화(ESTAB)상태인 것으로 판단하고 ESTAB(연결 승인)상태로 바뀐다.
- 그 뒤, client와 server는 실제 데이터를 주고 받는다.
이렇게 3-way handshaking 방식으로 TCP 연결설정을 하게 되면, 앞서 정리했던 2-way handshaking 방식의 문제를 해결할 수 있게 된다.
앞서, 2-way handshaking에서는 연결 요청 메세지가 연결이 종료된 후에 도착한다면, 2-way handshaking 방식에서는 server에서 반쪽짜리 연결을 하는 문제가 발생한다.
3-way handshaking에서는 server가 연결 요청을 받았다하더라도, server 측에서는 SYNbit와 seq #를 ACK와 함께 보낼 것이다. 이때, client는 연결이 종료된 후, 연결 요청을 보낸 적이 없기 때문에, 해당 메세지를 무시하고, 연결을 하지 않게 된다.
2. Closing TCP connection
3-way handshaking을 통해 연결 설정을 한 후, 데이터를 다 주고 받았으면, 이제 연결 설정을 닫아줘야 된다. 연결 설정을 닫는 과정은 4-way handshaking으로 진행된다.. 다음과 같은 순서로 진행된다.
- client가 더 이상 보낼 데이터가 없으면 서버에 F(finish, FIN) = 1로 설정해 segment를 보낸다.
- 서버는 해당 F에 대한 ACK를 보낸다.
- server측도 더 이상 보낼 데이터가 없으면 F(finish, FIN) = 1로 설정해 segment를 보낸다.
- 클라이언트는 해당 segment에 대한 ACK를 보내고 연결을 종료한다.
'학교공부 > [컴퓨터 네트워크]' 카테고리의 다른 글
| [컴퓨터 네트워크] -Transport layer _ Transport layer의 진화 (0) | 2025.06.02 |
|---|---|
| [컴퓨터 네트워크] - Transport layer_TCP Congestion control (0) | 2025.05.31 |
| [컴퓨터 네트워크] - Transport layer_TCP Flow Control (0) | 2025.05.26 |
| [컴퓨터 네트워크] - Transport layer_TCP (0) | 2025.05.26 |
| [컴퓨터 네트워크]-Transport layer_Principles of reliable data transfer(2): Go-Back-N, Selective repeat (0) | 2025.04.24 |