TCP/IP 프로토콜을 이용해서 통신을 하는 응용프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정이다.
Client -> SYN -> Server
Client 가 Server 로 접속을 요청하는 SYN 플래그를 전달한다.
Server -> SYN + ACK -> Client
Server 는 Listen 상태에서 SYN 플래그를 확인하고 SYN_RECV 상태로 바뀌어 SYN+ACK 플래그를 Client 로 전달한다. 그 후 ACK 플래그를 받기 위한 대기상태로 변경된다.
Client -> ACK -> Server
SYN + ACK 상태를 확인한 Client는 서버에게 ACK를 보내고 연결 성립(Established)이 된다.
3way handshake가 연결확립을 위해 진행했다면 4way handshake는 세션을 종료하기 위해 수행되는 절차이다.
Client -> FIN -> Server
Client가 연결을 종료하겠다는 FIN플래그를 전송한다. 보낸 후에 FIN-WAIT-1 상태로 변한다.
Server -> ACK -> Client
FIN 플래그를 받은 Server는 확인메세지인 ACK를 Client에게 전달한다. 그 후 CLOSE-WAIT상태로 변한다. Client도 마찬가지로 Server에서 종료될 준비가 됐다는 FIN을 받기위해 FIN-WAIT-2 상태가 된다.
Server -> FIN -> Client
Server는 Client에게 FIN 플래그를 전달한다.
Client -> ACK -> Server
Client는 FIN 플래그를 받고, 확인했다는 ACK 를 Server에 전달한다. (아직 서버로부터 받지 못한 데이터가 있을 수 있으므로 TIME_WAIT을 통해 기다린다.)
Client가 데이터 전송을 마쳤다고 하더라도 Server는 아직 보낼 데이터가 남아 있을 수 있기 때문에 일단 FIN에 대한 ACK만 보내고, 데이터를 모두 전송한 후에 자신도 FIN 메세지를 보내기 때문이라고 볼 수 있다.
TCP는 이러한 현상에 대비하여 Client는 Server로부터 FIN 플래그를 수신하더라도 일정시간동안 세션을 남겨놓고 기다리는 과정을 거친다.
Connection을 맺을 때 사용하는 포트(Port)는 유효한 범위 내에서 사용하고 시간이 지남에 따라 재사용된다. 따라서 두 통신 호스트가 과거에 사용된 포트 번호 쌍을 사용하는 가능성이 존재한다. 서버 측에서는 패킷의 SYN을 보고 패킷을 구분하게 되는데 난수가 아닌 순처적인 Number가 전송된다면 이전의 Connection으로부터 오는 패킷으로 인식할 수 있다. 이런 문제가 발생할 가능성을 줄이기 위해서 난수로 ISN을 설정한다.