junha-ahn / dev-blog

devkly.com
https://devkly.com
MIT License
0 stars 0 forks source link

network/nodejs-server-socket-close/ #2

Open utterances-bot opened 2 years ago

utterances-bot commented 2 years ago

웹서버가 먼저 Socket Close 해보기 | Devkly

도전 목표는 간단하다 환경 서버가 먼저 소켓 연결을 끊어보는 것이다. 그리고 실제 을 확인해보겠다. 4 Way Handshake 먼저 가장 기본이 되는 지식인 TCP 연결종료에 대해 간단히 설명하겠다. 가 측에게 ‘연결 종료’를 의미하는 패킷 전송 는 ‘연

https://devkly.com/network/nodejs-server-socket-close/

qkrgksqkr commented 2 years ago

안녕하세요, 관련해서 저도 관심이 있어서 검색중에 질문드립니다. NodeJS로 express 웹서버를 구성해놓고 단순히 다음과 같이 router를 구성 하였습니다.

router.get("/abc" (req, res) =>{ setTimeout((() => { res.send("hello");
}),3000); }

이때 위 서버로 localhost:포트번호/abc 형태로 curl로 Get 요청을 진행하고 tcpdump 명령어를 통해 실제 'active close"를 client가 하는지 server가 하는지 확인을 해보았습니다.

결과를 다음과 같았습니다. curl 요청시 req 헤더에 Connection : "keep-alive" - client가 active close Connection : "close" - service가 active close (server입니다 오타 이네요.)
Connection 생략 - client가 active close

로 확인되었습니다. 설명해주신 내용과 다르게 동작하는듯하여 궁금하여 질문드립니다.

저는 참고로, active_close가 서버측에서 일어나기때문에, 어떻게하면 client에서 active_close가 발생하게 해야하는지 고민하는 중입니다.

junha-ahn commented 2 years ago

안녕하세요 @qkrgksqkr 님

먼저, 긴 글 읽고 댓글 남겨주셔서 감사합니다.

제가 말씀해주신 내용을 가지고 테스트 해봤습니다.

먼저 말씀드리지만, 질문에 명확한 답 못드렸습니다. (이 글을 express, axios, curl에 대해 완전히 이해하고 작성한게 아니라 직접 손으로 테스트해가면서 작성했기 때문입니다)

1. Requset 헤더에 Connection : "keep-alive"

"client가 active close"

정상입니다.

재연 1

curl을 사용하지 않고 setTimeout 후 response 보냈습니다

image

해당 테스트 환경은 글에도 나오지만, Repository를 통해 재현 가능합니다.

172.25.0.3 이 클라이언트입니다. (먼저 연결을 시작하는 쪽)

보면 Keep-alive 패킷을 주고 받다가, 서버측에서 먼저 연결을 끊는 것을 확인할 수 있습니다.

재연 2

image

curl server -H "Connection: keep-alive" -H "Keep-Alive: timeout=10000, max=100000" 명령어를 통해 요청보냈습니다.

이번엔 Client측에서 먼저 연결을 끊네요

정리하자면

일단 제가 생각했을때 Client Active Close가 정상입니다. (재연1번은 왜 다른지 모르겠네요)

2. Requset 헤더에 Connection : "close"

"service가 active close"

아마 server 말씀하시는거겠죠?

클라이언트에서 Connection 값으로 close를 넣었으니 정상 동작한것으로 생각됩니다.

이때 본문에서는 아래와 같이 적었습니다. 하지만 해당 케이스때는 정상동작한것 같습니다.

Q. 혹시 서버가 Response 헤더에 Connection: close를 넣는다면?

아니다. 서버가 먼저 연결을 끊지 않는다.
서버가 클라이언트에게 “연결을 끊어주세요”라고 요청한것. 서버가 연결을 먼저 끊는 행위가 아니다

그런데

"저는 참고로, active_close가 서버측에서 일어나기때문에, 어떻게하면 client에서 active_close가 발생하게 해야하는지 고민하는 중입니다."

라고 해주셨는데 제 글과 동일하게 client측이 먼저 Active Close하고싶으신건가요?

3. Requset 헤더에 Connection 생략

client가 active close

위 1번과 마찬가지로 연결을 종료하지 않고, 필요없어진 client측이 socket close() 한것으로 보입니다.


일단 제가 본문에 작성한 내용과 다른 부분은 2번 정도라고 생각합니다. (하지만 제가보기엔, 오히려 @qkrgksqkr 님이 보신 결과가 더 정상적이네요)