SYN :: synchronize sequence number
ACK :: acknowledgement
TCP 헤더에는 Code Bit(Flag bit)라는 부분이 존재한다. 이 부분은 총 6Bit로 이루어져 있으며, 각각의 한 비트들이 의미를 가지고 있다.
URG - ACK - PSH - RST - SYN - FIN
순서로 되어 있으며, 해당 위치의 비트가 1이면 해당 패킷이 어떠한 내용을 담고 있는 패킷인지를 나타낸다. 예를 들어, SYN 패킷일 경우에는 000010이 되고, ACK 패킷일 경우에는 010000이 되는 것이다.
🤔 왜 SYN과 ACK라는 두 종류의 패킷인가?
연결을 성립하려면 서로 통신이 가능한지를 파악하기 위해 먼저 패킷을 주고 받아야 한다. 각각 요청과 응답에 대한 패킷이기 때문에, 두 종류인 것이다.
3-way handshake는 TCP 연결을 수립하는 과정으로, 클라이언트와 서버 간에 신뢰성 있는 연결을 보장하기 위해 존재한다.
SYN(a)
패킷을 보낸다. 이 패킷에는 클라이언트의 초기 시퀀스 번호(Initial Sequence Number)가 포함된다. SYN(a)
을 받고, 클라이언트에게 요청을 수락한다는 ACK(a+1)
와 SYN(b)
이 설정된 패킷을 발송한다.ACK(a+1)
와 SYN(b)
패킷을 받고, ACK(b+1)
를 서버로 보내면 연결이 성립된다.TCP 연결은 양방향성 연결이기 때문에, 2-way handshake로는 부족하다.
클라이언트에서 서버에게 존재를 알리고 패킷을 보낼 수 있다는 것을 알리듯, 서버에서도 클라이언트에게 존재를 알리고 패킷을 보낼 수 있다는 신호를 보내야 한다.
만약 이 과정이 없다면, 네트워크 지연이나 패킷 손실로 인해 잘못된 연결이 설정될 가능성이 있다.
처음 클라이언트에서 SYN
패킷을 보낼 때 sequence number에는 랜덤한 숫자가 담겨진다. ISN은 Initial Sequence Number의 약자로, 초기 sequence number를 의미한다. ISN이 0부터 시작하지 않고 난수를 생성해서 number를 설정하는 이유는 무엇인가?
연결을 맺을 때 사용하는 포트는 유한 범위 내에서 사용하고, 시간이 지남에 따라 재사용된다. 따라서 두 통신 호스트가 과거에 사용된 포트 번호 쌍을 또 사용할 가능성이 존재한다.
서버 측에서는 패킷의 SYN
을 보고 패킷을 구분하게 되는데, 난수가 아닌 순차적인 숫자가 전송된다면 이전의 연결로부터 오는 패킷으로 인식할 수 있다. 이러한 문제가 발생할 가능성을 줄이기 위해 난수로 ISN을 설정하는 것이다.
대표적으로 UDP가 있다. UDP는 TCP와 달리 연결을 설정하는 과정 없이 데이터를 바로 전송한다. 따라서 속도는 빠르지만 신뢰성이 보장되지 않는다. 영상 스트리밍이나 온라인 게임처럼 실시간성이 필요한 경우에는 UDP를 사용한다.
FIN
플래그를 전송한다.FIN
플래그를 받고, 알겠다는 확인 메세지로 ACK
를 보낸다.FIN
플래그를 전송한다.FIN
메시지를 확인했다는 ACK
메시지를 보낸다. ACK
메시지를 받은 서버는 소켓 연결을 close한다.📄 매일메일 - TCP 3-way handshake 과정에 대해 설명해주세요
🎥 [10분 테코톡] 🔮 수리의 TCP/IP