TCP 3-way handshaking(연결 설정)
TCP는 신뢰성을 확보할 때 3-way handshaking이라는 작업을 진행한다.
클라이언트와 서버 사이의 연결을 설정하기 위해서 두 호스트 사이에 3개의 패킷이 송신되는데, 이러한 이유로 TCP의 연결 설정 절차를 3-way handshake
라고 부른다.
1. 클라이언트 측 TCP가 서버 TCP에게 SYN
세그먼트를 전송한다.
SYN은 SYNchronize의 줄임말로, "나랑 동기화하자~" 이런 의미이다.
2. 서버가 클라이언트의 요청을 받으면 클라이언트 TCP로 SYNACK
(SYNchronize & ACKnowledgment) 세그먼트를 전송한다.
"네가 보낸 SYN 패킷 잘 받았고, 연결 설정에 동의할게~" 이런 의미이다.
3. 클라이언트가 서버의 SYNACK 세그먼트를 수신하면 클라이언트는 다시 서버로 ACK
세그먼트를 전송한다.
이 세 단계가 완료되면 클라이언트와 서버 호스트들은 각각 서로에게 데이터를 포함하는 세그먼트를 보낼 수 있게 된다.
이렇게 데이터를 보내기 전에 연결을 미리 확인하고 설정하는 과정을 거치기 때문에 TCP는 신뢰성 있는 계층이라고 불린다.
TCP 4-way handshaking(연결 해제)
제대로 된 모든 것은 끝이 있어야 하고, TCP 연결 또한 그렇다.
TCP의 연결은 클라이언트가 종료할 수도 있고, 서버가 종료할 수도 있지만 어느 경우에서든 연결이 끝날 때 호스트의 자원(버퍼, 변수들)은 전부 회수된다.
클라이언트가 연결을 종료하는 과정을 보자.
1. 클라이언트 애플리케이션 프로세스가 종료 명령을 내리면 클라이언트 TCP가 서버 프로세스에게 특별한 세그먼트를 보낸다.
이 세그먼트에는 1로 설정된 FIN
비트라 불리는 플래그 비트가 포함되어있는데, "우리 이제 연결 끊자~" 이런 의미이다.
2. 서버가 이 세그먼트를 수신하면 서버가 알겠다는 뜻으로 클라이언트에게 ACK
세그먼트를 전송한다.
3. 서버가 다시 FIN
비트가 1로 설정된 세그먼트를 클라이언트에게 전송한다. "이제 진짜 연결 끊자~" 이런 의미이다.
4. 마지막으로 클라이언트가 서버의 종료 세그먼트에 알겠다는 뜻으로 ACK
세그먼트를 전송하고 대기 모드로 들어간다.
서버가 이 메시지를 받으면 서버는 연결이 닫히고, 클라이언트도 어느 정도의 시간을 대기한 후 연결이 닫히게 된다. 여기까지 하면 두 호스트의 모든 자원들의 할당은 해제되고 연결도 해제된다.
그런데 4번에서 클라이언트가 ACK 세그먼트를 전송하는 동시에 연결을 닫으면 되는데 왜 굳이 일정 시간을 기다린 후에 닿는 걸까?
두 가지 이유가 있는데, 첫 번째는 지연 패킷이 발생할 경우를 대비하기 위해서이다.
만약 패킷이 지연으로 인해 뒤늦게 도달하고 이를 처리하지 못하면 데이터 무결성 문제가 발생하기 때문에 혹시 모를 상황을 위해 클라이언트가 조금 기다리고 있어 주는 것이다.
두 번째는 두 장치가 연결이 닫혔는지 확인하기 위해서이다.
만약 클라이언트가 서버가 연결을 닫기 전에 먼저 연결을 닫았다가 다시 이 서버에게 연결을 시도하는 경우, 서버는 아직 이전 연결이 종료되지 않은 상태이기 때문에 접속에 오류가 발생한다.
References
📖 컴퓨터 네트워킹 하향식 접근
'CS > 네트워크' 카테고리의 다른 글
DNS Round Robin (0) | 2022.10.24 |
---|---|
DNS (0) | 2022.10.24 |
HTTP vs HTTPS (1) | 2022.10.08 |
TCP vs UDP (0) | 2022.10.08 |
HTTP GET vs POST (0) | 2022.10.08 |