본문 바로가기
츄Log/네트워크 프로그래밍 끄적

EchoServer/Client TCP 패킷 분석 - 1. 연결/연결 종료 (Wireshark)

by 츄츄🦭 2023. 12. 12.
728x90

 
안녕하세요!
오늘은 echo server를 만들고 wireshark로 이것저것 해본 경험을 기록하려고 합니다.
 
netty를 공부하고 있어서 netty로 echo server/client 만들었습니다.
java socket으로 만드는 것과 차이는 없을 것이라 생각됩니다.
 
오늘은 일반적인 서버와 클라이언트의 흐름인 연결/송수신/종료 3가지 경우를 살펴보려고 합니다.
 
server port : 8888
client port : 51214
 

1. 연결

모두가 다 아는 그 과정, 3-way handshake 입니다.

 
클라이언트가 서버로 [SYN] 패킷을 보내면서 연결이 시작되고 서버는 [SYN,ACK] 를 보내고 클라이언트도 [ACK]를 보내 연결을 수립합니다.
이 시점에 netstat을 통해 네트워크 상태도 한 번 보겠습니다.

클라이언트와 서버 모두 ESTABLISHED로 연결이 잘 수립된 것을 볼 수 있습니다. 
 
연결 과정에서 포인트 중 하나는 연결에 참여한 호스트들은 TCP 통신을 위한 여러 전략들을 교환합니다.
이런 협상 과정 중 하나는 각자의 Window Size 교환(Window Advertisement) 입니다. (ex. 프레임에 Win=65535),
맨 아래 패킷인 [TCP Window Update]는 window size 협상하는 과정에서 업데이트가 이루어진 것입니다. 
 
 

2. 데이터 송/수신 

 
클라이언트를 통해 "chupin tech" 라는 문자열을 전송하였습니다.
chupin tech 앞에는 각종 TCP 헤더들이 붙어있습니다. 
(chupin tech보다 각종 헤더의 사이즈가 훨씬 큽니다. 이럴 때 네이글 알고리즘의 필요성까지 생각을 확장해볼 수 있습니다.)
 
오른쪽 영역에서 전송한 문자열만 집중해서 보겠습니다.
바이트로 전송된 데이터를 16진수로 바이트로 전송된 데이터를 16진수로 변경한 것과, 이를 ASCII로 변경한 것까지 보여주고 있습니다.  (ASCII 로 변경했을 때 표현이 되지 않는 것은 ... 로 보여집니다.)
 
PSH 플래그는 바로 데이터 버퍼에 쌓지 말고 바로 전송하라는 의미인데, 이는 다른 포스팅에서 자세하게 설명해보겠습니다.
 
echo 서버이므로, 41번 프레임을 보면 서버 또한 chupin tech를 클라이언트로 보낸 것을 확인할 수 있습니다.
 

3. 연결 종료

4-way handshake로 종료가 이루어집니다.

 
클라이언트가 서버에게 FIN,ACK를 보내고 
서버는 ACK를 받고 다시 클라이언트에게 FIN,ACK를 보냅니다. 
이 때 매우 빠르게 netstat으로 상태를 확인해보겠습니다.

 
지난 포스팅 : TIME_WAIT이란?
이 포스팅에서 말씀드린 것처럼 연결을 먼저 종료한 클라이언트 소켓은 TIME_WAIT 상태에 들어갑니다. 
프로그램 자체가 꺼졌기 때문에 TIME_WAIT 상태가 약 1초도 안되는 시간동안 지속되고 바로 소켓이 정리된 것 같습니다. (프로그램 종료를 빼고 shutdown()만 가지고 테스트를 해봐야겠습니다.)
 

4. 기타

서버가 떠있지 않은 상태에서 클라이언트를 통해 서버와 연결 요청을 하면, 바로 RST 패킷을 확인할 수 있습니다.

 
다음에 RST 패킷에 대해서도 한 번 이야기 해보겠습니다. 
 


궁금한 점은 댓글 남겨주세요 :) 

728x90