네트워크

TCP 3way handshake

M9M9 2020. 10. 22. 02:50

연결 지향적 프로토콜 TCP

TCP는 송신 프로세스와 수신 프로세스(서버와 클라이언트) 간에 데이터 전송을 위해 연결을 맺는 연결 지향적 프로토콜이다. 

 

 

데이터 전송을 위해 연결을 맺은 후, 데이터 전송에 필요한 작업이 모두 완료되었으면 연결을 끊는다.

 

이때 송수신 프로세스(서버와 클라이언트) 간에 연결을 맺는 작업을 3way handshake라고 하며,

연결을 끊는 작업을 4way handshake라고 한다. 

 

 

이번 글에서는 3way handshake에 대해 정리해보겠다.

 

3way handshake

3wayhandshake는 두 프로세스가 데이터를 전송할 준비를 맞췄다는 것을 보장하는 역할을 한다.

 

 

과정을 살펴보면,

 

 

그림 참고: hack-cracker.tistory.com/120

 

1. 맨 처음 Client는 close 상태이고, Server는 listen 상태이다

( Listen상태란 임의의 포트 번호로 들어오는 요청을 수신하기 위해 서버를 열고 대기 중인 상태를 말한다.)

 

 

2. client에서 서버로 연결을 요청하는 SYN 데이터를 전송한다.(SYN을 전송 후, 클라이언트는 SYN Sent 상태가 된다.)

(이때 SYN에 클라이언트의 번호를 나타내는 seq(sequen number)를 함께 포함하여 보낸다.)

ex) seq=1000(참고로 seq는 난수이다.)

 

3. server는 client로부터 SYN을 받은 후, 요청을 정상적으로 받았다는 응답으로 SYN+ACK를 client에게 전송한다.(이 과정에서 server의 상태는 SYN Received다.)

(이때, 서버의 번호를 나타내는 seq 값과 클라이언트에게 받은(클라이언트 번호) seq값에 1을 더한 값을 ACK Number로 할당하여 클라이언트에게 전송한다)

ex) seq=2000 , ack=1001

 

 

4. 서버로부터 SYN+ACK을 수신한 클라이언트는 요청을 받았다는 응답으로 ACK를 서버로 전송하며, 데이터 전송을 위한 연결 및 준비가 확립되는 Establish 상태가 된다.

(이때, 클라이언트는 서버에게 받은 ackNumber값을 seq로 서버로 전송한다.(즉 자신의 초기 번호에 1을 더한 값)

또한, 서버의 번호로 받았던 seq에 1을 더한 값을 ACK Number에 할당하여 서버에 전송한다.)

ex) seq=1001 ACK=2001

 

5. 마지막으로, 클라이언트로부터 ACK를 받은 서버도 데이터 전송을 위한 연결 및 준비를 맞췄으므로 Establish 상태로 변한다. 

 

 

 

즉 seq를 보내면 그에 대한 응답으로 1을 더해 붙여 보내준다.

(※SYN : Synchronization)

(※ACK : Acknowledgment)