Shine's dev log
TCP 연결 (3 way-handshake) 본문
1. establish a connection
TCP는 reliable한 연결을 지향한다. 따라서 연결을 수립할때도 꽤나 복잡한 과정을 거친다.
기본적으로 생각해볼 수 있는 것이 클라이언트 측에서 연결을 하자고 제안하면, 서버 측에서 이를 승낙하는 2 way-handshake이다.
하지만 이 방식은 특정 메시지가 지연되는 경우 완벽하게 동작하지 않으므로, 완벽을 추구하는 TCP에는 어울리지 않는다.
따라서 TCP에서는 연결을 시작/종료할 때, 이보다 더 확실하고 완벽한 3/4 way-handshake를 사용한다.
2. 연결 시작 (3 way-handshake)
3 way-handshake로 연결을 시작하는 과정은 다음과 같다.
1단계)
- 클라이언트가 서버에게 연결을 요청한다.
- TCP header의 SYN bit를 1로 설정하여 보낸다.
2단계)
- 서버가 연결이 가능할 경우, 클라이언트에게 연결요청에 대한 응답을 한다.
- TCP header의 ACK, SYN bit를 1로 설정하여 보낸다.
3단계)
- 클라이언트가 서버에게 연결을 확인한다.
- 이 과정 이후에 실제 데이터가 송수신된다.
- TCP header의 ACK bit를 1로 설정하여 보낸다.
3. 연결 종료 (4 way-handshake)
4 way-handshake로 연결을 종료하는 과정은 다음과 같다.
1단계)
- 클라이언트가 서버에게 연결 종료를 요청한다.
- 소켓을 FIN_WAIT_1 상태로 바꾼다.
- TCP header의 FIN bit를 1로 설정하여 보낸다.
2단계)
- 연결 종료 요청을 받은 서버는 요청에 응답한다.
- 서버는 연결 종료를 대기하는 CLOSE_WAIT 상태로 바꾼다.
- TCP header의 ACK bit를 1로 설정하여 보낸다.
3단계)
- 서버는 연결 종료를 위해 클라이언트에게 종료를 요청한다.
- 서버의 소켓을 LAST_ACK 상태로 바꾼다.
- TCP header의 FIN bit를 1로 설정하여 보낸다.
4단계)
- 연결 종료 요청을 받은 클라이언트는 요청에 응답한다.
- TCP header의 ACK bit를 1로 설정하여 보낸다.
마무리)
- 4단계의 ACK을 받은 서버는 소켓을 CLOSED 상태로 바꾼다.
- 클라이언트도 maximum segment lifetime * 2 의 시간 후에 CLOSED 상태로 바뀐다. 이렇게 여유 시간을 두는 이유는 4단계의 ACK이 제대로 가지 않았을 경우를 대비해서 여유를 두는 것이다.
소켓 프로그래밍을 하다보면, 분명 연결을 끊었는데도 다시 해당 포트에 연결하려하면 이미 사용중이라는 에러가 뜰때가 있다. 이는 클라이언트가 연결 종료를 확정하고 일정 여유 시간을 두기 때문이다.
위 내용을 정리해보면,
1. TCP는 더 신뢰성있는 통신을 지향한다.
2. 그래서 연결을 시작할 때 3 way-handshake를 사용하고, 연결을 끝낼 때 4 way-handshake를 사용한다.
위 내용은 공부하며 정리한 것으로, 오류가 있을 수 있습니다.
'컴퓨터 네트워크' 카테고리의 다른 글
Network layer 개요 (0) | 2021.02.28 |
---|---|
TCP congestion control (0) | 2021.02.26 |
TCP Flow Control (2) | 2021.02.24 |
TCP의 개념 (Transmission Control Protocol) (0) | 2021.02.24 |
UDP의 개념 (User Datagram protocol) (0) | 2021.02.18 |