app.listen

김동현·2023년 11월 20일

Question

목록 보기
5/15
post-thumbnail

널널한 개발자 선생님

널널한 개발자 선생님의 네트워크 강의를 듣는데 다음과 같은 그림을 많이 그리셨다
화살표로 가리키고 있는 소켓 부분이 커널 모드에서 추상화된 TCP/IP 인터페이스를 구현한 후 TCP(PORT)/IP(ip address)에 바인딩 된 부분이다.
저 부분을 통해 외부 네트워크와 I/O 작업을 수행하게 된다!

Nodejs

Nodejs로 웹 개발을 하는데 TCP/IP 통신을 어떻게 하는 지 궁금했다.
그럼 내가 만드는 Nodejs Express 프레임워크도 유저 모드에서 커널 모드에 추상화된 TCP/IP 인터페이스를 가져와 구체화 시킨 후 실행하게 될 것인데 어떻게 구현이되고 기다리고 있는 지 궁금했다.
또한 서버를 끄기 전까지 특정 포트(Ex 3000)에 매핑되어 기다리고 있는 것도 궁금했다.

// index.js
const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
    res.send('Hello World!')
})

app.listen(port, () => { // 여기가 의심스럽다
    console.log(`Example app listening on port ${port}`)
})
  • node index.js

소켓연결

  1. 서버는 서버가 새로운 연결을 수락하는 데 사용되는 소켓을 생성한다.
  2. 해당 소켓을 특정 IP 주소와 포트에 바인딩한 후 IP 주소와 포트를 대상으로 하는 수신 연결에 대해서 알림을 받게 된다.
  3. 해당 포트에서 수신 대기하여 들어 오는 연락을 수락할 준비가 되었음을 TCP 스택에 알린다.
  4. 연결에 대한 알림을 받으면 연결을 수락한다.
  5. 새로운 소켓을 통해 연결을 읽고 쓸 수 있게 된다.
  6. 소켓이 닫혀 트랜잭션이 완료된다.

Express의 app.listen() 메서드는 몇 가지 단계를 캡슐화한다.

Express.app.listen()

app.listen 메서드는 http 객체를 생성한 다음 특정 포트와 IP 주소에서 TCP 연결을 수신하도록 구성한다.
즉, 클라이언트가 해당 포트에 연결을 요청하고 HTTP 요청을 보낼 때 서버가 해당 HTTP 요청을 수신하고 처리하여 응답을 보내는 것이다.

  • server.listen은 1~3단계를 캡슐화 한다.
  • 4단계 (알림을 통한 연결 수락)는 http 서버 객체 구현 내부에서 발생하며, 새 연결이 설정되고 HTTP를 전달받을 수 있을 때 앱 객체가 호출된다..
  • http서버는 초기 요청을 읽고 http 프로토콜을 분석하여 적절한 핸들러로 라우팅하게 된다.
  • 이 후 res.send(), res.json() 과 같은 응답을 통해 소켓을 닫거나 res.send로 소켓을 직접 닫는다.
  • listen의 기본 코드는 운영 체제의 TCP 스택 내부에 있다.
    • NodeJs나 Express의 일부가 아니다!

  • Express는 이에 대한 인터페이스Nodejs http 서버 객체를 사용하는 것이다.
  • nodejs http 서버 객체는 네이티브 코드(nodejs에 내장되어 있음)를 사용하여 libuv(네트워크 및 기타 용도로 사용되는 크로스 플랫폼 C 라이브러리)를 호출한다.
  • 그런 다음 libuv는 기본 운영 체제 API와 통신하여 해당 대상 호스트의 실제 TCP 스택에 도달하게 되고,
  • → 이 모든 과정은 서버 소켓을 수신 모드로 전환하여 해당 대상 IP 주소와 포트에 새로 들어오는 클라이언트 연결에 대한 알림을 받을 수 있도록 하기 위한 것이다!

결국 socket.io를 사용하지 않더라도 이미 소켓 통신을 하고 있는 것이다!

⚠️ 주의사항

구현되어 있는 예시 코드를 찾아보고 이해해 보고 싶은데 아직 부족한 부분이 많아 V8 엔진 코드에 Socket Binding 하는 GDB-Debug 부분만 링크해 놓았습니다!
V8 엔진 코드.cc V8 엔진 코드.h

아직 많이 부족하기에 어디서 관련 로직이 수행되고 있는지 코드를 보고 찾아가는 데는 어려움을 겪고 있습니다 :(
관련 레퍼런스 부분이 있다면 알려주시면 감사하겠습니다!
잘 못된 부분도 집어주세요 :)

📌 참고자료

libuv, event loop (in Node js)
What does the .listen() method in express look like?
[Express] app.listen 과 http.createServer(app) 의 차이

profile
달려보자

0개의 댓글