TCP 통신을 이용하여 데이터를 전송하기 전에 정확한 전송을 보장하기 위해 논리적인 연결을 맺는 과정이다.
[step1]
클라이언트 A는 서버 B에게 접속을 요청하는 SYN 패킷을 보낸다.
이때 Initial Sequence Number(ISN)를 랜덤한 숫자로 지정하여 전달한다.
[step2]
서버 B는 SYN요청을 받고 요청을 수락한다는 패킷을 보낸다.
클라이언트와 마찬가지로 Initial Sequence Number(ISN)를 랜덤하게 지정하여 전달한다.
[step3]
클라이언트 A는 서버 B에게 ACK 패킷을 보내고 연결이 이루어진다.
이후에는 서로 데이터를 전송할 수 있다.
Sequence Number는 왜 필요할까?
TCP는 신뢰성을 보장하는 프로토콜이다.
따라서 누락되거나 순서가 잘못된 패킷을 탐지하고 수정할 수 있도록 하려면 시퀀스 번호 필드가 필요하다.
데이터가 손실되거나 순서가 잘못되어 대상에 도착하면 TCP 모듈은 데이터를 재전송하거나 시퀀스 번호를 기반으로 원래 순서를 복원할 수 있다.
Initial Sequence Number(ISN)는 왜 랜덤한 값인가?
ISN을 0부터 순서대로 지정하면 예측하기 쉬워지므로 IP address spoofing이나 session hijacking과 같은 보안공격에 취약해진다.
따라서 초기 시퀀스 번호는 무작위여야 한다.
TCP의 연결을 해제할때 이루어지는 과정이다.
[step1]
클라이언트 A가 연결을 종료하겠다는 FIN 플래그를 전송한다.
[step2]
서버 B는 확인 메세지를 보내고 자신의 통신이 끝날때 까지 기다린다.
이때 전송할 데이터가 남았다면 계속 전송한다.
[step3]
서버 B의 통신이 끝났다면 연결이 종료되었다고 FIN 플래그를 전송한다.
[step4]
클라이언트 A는 확인 메세지를 전송한다.
이때 바로 연결을 종료시키지 않고 일정 시간 대기한다. 이를 TIME_WAIT이라고 한다.
왜 TIME_WAIT이 있을까?
클라이언트가 마지막으로 ACK를 보낼때 네트워크 상황에 따라 ACK가 서버에 도착하지 않을수 있다. 서버는 ACK가 도착하지 않았으므로 FIN 플래그를 재전송하는데 이때 클라이언트에서 이미 연결을 종료해버렸으면 상황이 난감해진다. 따라서 클라이언트는 일정시간동안 데이터가 오지 않는지 대기하다가 연결을 종료한다.