네트워크

TCP 연결 과정(3-way handshaking)

뭉크테크 2025. 1. 10. 00:11

TCP 연결과정 (3-way-handshaking)

TCP 연결 절차에 대해 이야기할 때 3-way-handshaking이 늘 등장한다. 연결이라는 것이 결론이라면 그 연결의 과정으로 등장하는 것이 3-way-handshaking이다.

 

위 그림처럼 어떤 client가 있다면 접속 대기중인 서버에 접속을 할 것이다. 위 그림의 세로 선을 timeline이라고 하고 어느 시점에 클라이언트가 192.168.0.20:80번의 서버와 연결을 하고자 한다. 여기서 클라이언트가 서버에 갔다가 돌아오는 시간을 RTT라고 하는데 50ms정도 걸린다고 하면 서버까지 가는 시간을 25ms, 돌아오는 시간을 25ms이다.

이때 통신되는 단위가 Segment인데 일반적으로 Segment는 payload와 TCP-header로 구성되어 있지만 3-way-handshaking은 header만 존재한다.

즉, 위 그림처럼 payload가 없는, 관리목적의 Segment가 왔다갔다 한다.

연결을 하려는 클라이언트 측에서 서버와 연결을 하고자 먼저 Sequence Number를 생성한다. 이 번호는 랜덤으로 생성이 되는데 예를들어 1000번이 생성이 되었다면 연결하는 서버한데 SYN(Seq = 1000)을 보낸다. 즉, 클라이언트는 SYN_SENT 상태가 된다. 그러면 서버는 연결가능 상태이면 Sequence Number를 랜덤생성하고 그게 4000이라고 하면 SYN(Seq = 4000)이다. 이때, 클라이언트의 SYN 세그먼트에 알겠다는 의미로 ACK(Seq = 1001=클라이언트 SYN 세그먼트의 Seq 값 + 1)도 같이 클라이언트에 보낸다. 그러면 서버의 소켓 상태는 listening에서 SYN_RCVD 변해야 한다.

 

그러면 클라이언트 또한 잘 서버한테 서버의 Seq값이 4000번이라는 걸 알겠다는 의미로 ACK(4001)을 보낸다. 중요한것은 여기서 시간차가 존재하는데 이 시간차가 무엇이냐면 클라이언트가 연결을 시도해서 ACK를 받는 순간 클라이언트는 서버와 연결되었다고 판단하고 Established 상태가 된다. 하지만 그 시점에 서버는 클라이언트와 연결이 아직 안되었다고 생각한다. 클라이언트에서 서버로 가는 단방향 RTT인 25ms가 지나고 해당 세그먼트를 받은 시점에 연결되었다고 판단한 의미로 서버 또한 Established가 된다. 이 ACK를 서버가 받은 시점에 서버는 드디어 클라이언트와 연결되었다고 생각한다.

 

여기서 연결과정에 중요한것은 정책을 교환한다는것인데 정책중에 가장 중요한 것은 MSS가 어느정도인지를 알려준다. 여기서 클라이언트와 서버의 MSS가 같으면 문제 없지만 클라이언트 MSS보다 서버 MSS가 작을때는 클라이언트의 MSS를 서버의 MSS에 맞춘다.

실제로 wireshark를 따본 결과, 중간에 서버에서 클라이언트로 ACK 패킷이 하나가 껴있긴하지만, 위 설명과 비슷한 과정을 거치고 있고, 심지어, payload 값 없이 Header로만 이루어져있다. 실제로는 Ethernet 헤더와 IP 헤더 그리고 TCP Header로 이루어져있다. 

 

출처

https://www.inflearn.com/course/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%95%B5%EC%8B%AC%EC%9D%B4%EB%A1%A0-%EA%B8%B0%EC%B4%88/dashboard

 

외워서 끝내는 네트워크 핵심이론 - 기초 강의 | 널널한 개발자 - 인프런

널널한 개발자 | TCP/IP에서 HTTP까지! 네트워크에 대한 기본 이론이 부족한 분들이 '외워서'라도 전공 이론을 이해하고자 희망하는 분들을 위해 준비한 강의입니다. 할 수 있습니다!, 네트워크, 외

www.inflearn.com

 

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

TCP, UDP 헤더 형식과 게임 서버 특징  (0) 2025.01.10
TCP 연결 종료와 상태 변화  (0) 2025.01.10
TCP와 UDP 개요  (0) 2025.01.09
Host란 무엇인가  (0) 2025.01.09
OSI 7 Layer와 식별자  (0) 2025.01.09