연결지향 프로토콜으로 웹에서 많이 쓰는 방식인 TCP의 연결과정 예시이다. 클라이언트와 서버 간 신뢰할 수 있는 통신을 보장하기 위해 수행됩니다.
먼저 클라이언트에서 서버에 Flag가 SYN인 요청을 보낸다. SYN은 Syncronize Sequence Number 의 약자이다. 요청을 보낼때 클라이언트에서 생성한 임의의 Sequence Number와 ACK번호를 서버로 보낸다
서버에서 해당 요청을 받으면 서버는 Flag가 SYN이라는 것을 확인한다. 서버는 이 Flag값으로 연결요청을 하고 있다는 것을 알 수 있다. SYN는 동기화를 하기 위한 상태 요청이다. 그리고 컴퓨터는 Sequence Number 와 ACK번호를 사용하여 동기화를 한다. 요청을 수락하면 서버는 Flag에 SYN와 ACK를 같이 보내준다. 여기서 ACK는 응답에 대한 값이라고 생각하면 된다. 서버도 마찬가지로 자신의 임의의 Sequence Number를 설정하고 ACK에는 클라이언트에서 준 Sequence Number에 1을 더한 값을 담아 클라이언트에 보낸다.
ACK는 클라이언가 요청한것에 대한 응답이다. ACK를 보고 서버도 자신에게 연결요청을 한다는것을 클라이언트 역시 알 수 있다. 이전에 했던것과 똑같이 ACK에 응답으로 온 Sequence Number +1을 한다. 하지만 Sequence Number는 최초로 보내는 것이 아니기 때문에 서버 응답시에 온 ACK 번호를 Sequence Number 에 담는다. 여기까지 거치면 3 way handShake가 완료가 된다. 이제 클라이언트는 서버에게 필요 요청을 하면 된다.
즉, 연결이 수립된 이후에 클라이언트는 요청을 또 보내는것이다. 이때는 SEQ 번호와 ACK번호가 그대로다. 이후에는 서버는 SEQ 번호에 ACK 번호를 넣게 된다. ACK에는 SEQ번호 +1 이 아닌 SEQ번호+ 데이터 크기가 된다. 연결 수립과 다르게 데이터(페이로드)가 있기 때문이다.
여담으로 SYN 와 ACK 번호를 계산해서 세션 하이재킹혹은 dos공격을 할 수 있다고 한다. 때문에 정보보안쪽에서는 중요한 부분이라고 한다. 만약에 다른 클라이언트가 3way handshake로 연결된 Sequence Number 와 ACK 번호 계산하여 가통신을 하게 된다면 기존 클라이언트 대신에 다른 클라이언트가 세션을 가로채서 통신을 시작하게 된다.