본문 바로가기
Computer Science/네트워크

[Network] TCP 3-way Handshake

by JYHAN 2020. 4. 6.

연결 성립(Connection Establishment)

 

링크. https://asfirstalways.tistory.com/356

1) 클라이언트는 서버에 접속을 요청하는 SYN(a) 패킷을 보낸다.

2) 서버는 클라이언트의 요청인 SYN(a)을 받고 클라이언트에게 요청을 수락한다는 ACK(a+1)SYN(b)이 설정된

패킷을 발송한다.

3) 클라이언트는 서버의 수락 응답인 ACK(a+1)와 SYN(b) 패킷을 받고 ACK(b+1)를 서버로 보내면 연결이 성립(establish) 된다.

 

연결 해제(Connection Termination)

 

1) 연결이 성립된 상태이다.

2) 클라이언트가 연결을 종료하겠다는 FIN플래그를 전송한다.

2-1) 서버는 클라이언트의 요청(FIN)을 받고 확인의 의미로 ACK 메세지를 보낸다.

3) 데이터를 모두 보낼 때까지 잠깐 TIME_OUT이 된다.

4) 서버는 데이터를 모두 보내고 통신이 끝났으면 연결이 종료되었다고 클라이언트에게 FIN 플래그를 전송한다.

5) 클라이언트는 FIN 메세지를 확인했다는 의미로 ACK 메세지를 보낸다.

6) 클라이언트의 ACK 메세지를 받은 서버는 소켓 연결을 close한다.

7) 클라이언트는 아직 서버로부터 받지 못한 데이터가 있을 것을 대비해 일정 시간 동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정을 거친다(TIME_WAIT)

 

용어 설명

SYN: SYnchronize sequence Number

ACK: ACKnowledgement

 

TCP Header에는 Code Bit(Flag Bit)이라는 부분이 존재한다. 이 부분은 총 6Bit로 이루어져 있으며, 각각 한 Bit들이 의미를 갖고 있다. Urg-Ack-Psh-Rst-Syn-Fin 순서로 되어 있으며 해당 위치의 비트가 1이면 해당 패킷이 어떠한 내용을 담고 있는 패킷인지를 나타낸다. SYN 패킷일 경우엔 00010이 되고 ACK 패킷일 경우에는 010000이 되는 것이다.

 

왜 두 종류의 패킷인가?

연결이 성립하려면 서로 통신이 가능한지를 먼저 파악하기 위해 패킷을 주고받아야 한다는 것까지는 이해가 쉽다.

그래서 요청응답에 대한 패킷을 주고 받아야 하기 때문에 두 종류인 것이다.

 

왜 3-way인가? 2-way로 충분하지 않은가?

예를들어, 클라이언트가 자신의 목소리가 들리는지 물어본다.(SYN) 서버는 클라이언트의 목소리가 들린다고 말한다.(SYN+1) 그리고 자신의 목소리가 들리는지 물어본다.(ACK) 클라이언트는 서버의 목소리가 들린다고 말한다.(ACK+1)

이런 과정인 셈이다. TCP connection은 양방향성(bidirectional) connection이다. 클라이언트에서 서버에게 존재를 알리고 패킷을 보낼 수 있다는 것을 알리듯, 서버에서도 클라이언트에게 존재를 알리고 패킷을 보낼 수 있다는 신호를 보내야 한다. 그렇기 때문에 2-way-handshake로는 부족한다.

 

왜 랜덤화된 sequence number인가?

처음 클라이언트에서 SYN 패킷을 보낼 때 sequence number에는 랜덤한 숫자가 담겨진다.

초기 sequence number를 ISN이라고 한다. 0부터 시작하지 않고 난수로 number를 설정하는 이유는 다음과 같다.

Connection을 맺을 때 사용하는 포트(post)는 유한 범위 내에서 사용하고 시간이 지남에 따라 재사용된다.

따라서 두 통신 호스트가 과거에 사용된 포트 번호 쌍을 사용할 가능성이 존재한다.  서버 측에서는 패킷의 SYN을 보고 패킷을 구분하게 되는데 난수가 아닌 순차적인 number가 전송된다면 이전의 connection으로부터 오느 패킷으로 착각할 수 있다. 따라서 이러한 문제가 발생할 가능성을 줄이기 위해 ISN을 난수로 설정하는 것이다.

 

 


reference)

https://4network.tistory.com/entry/TCPIP20100414 
https://networkengineering.stackexchange.com/questions/24068/why-do-we-need-a-3-way-handshake-why-not-just-2-way/24069 
https://www.quora.com/Why-in-a-TCP-sequence-is-a-number-taken-as-a-random-number-and-what-is-the-actual-number-at-the-start

 

https://asfirstalways.tistory.com/356

위 링크에서 공부한 내용을 복습하기 위해 옮겨적은 것입니다.

'Computer Science > 네트워크' 카테고리의 다른 글

[Network] OSI 7계층  (0) 2020.10.28
[Network] HTTP & HTTPS  (0) 2020.09.24
[Network] TCP와 UDP 비교  (0) 2020.04.15
[Network] HTTP의 GET과 POST비교  (0) 2020.04.05

댓글