NODEJS의 http 구현에 대한 자세한 소개
이 글은 주로 NODEJS의 http 구현에 대한 기술적인 과정과 상세한 분석을 소개합니다. 필요한 친구들은 참고할 수 있습니다.
1. 소개
현재 HTTP 프로토콜은 인터넷에서 가장 널리 사용되는 네트워크 프로토콜이자 프런트엔드 ER이 가장 많이 접촉하는 프로토콜이기도 합니다. nodejs에서 http 모듈의 구현을 읽으면 HTTP 프로토콜에 대해 더 깊이 이해할 수 있습니다. HTTP 프로토콜은 TCP 프로토콜을 기반으로 하는 애플리케이션 계층 프로토콜이며, 그 구현은 TCP/IP 프로토콜 계열과 분리될 수 없습니다. 코드 구현의 경우 http 모듈은 net 모듈에 따라 다릅니다.
아래 그림과 같이 nodejs에서 http는 net 모듈을 통해 데이터를 전송하고, 데이터를 얻은 후 HTTP_PARSER를 사용하여 데이터를 구문 분석합니다.
2. 소스 코드
HTTP 서비스 시작
nodejs에서 HTTP 서비스를 시작하는 것은 매우 간단합니다. 서버 객체를 인스턴스화하고 특정 포트를 수신하기만 하면 됩니다:
const Server = require('./libs/http').Server const server = new Server( function(req, res) { res.writeHead(200) res.end('hello world') }) server.listen(9999)
SERVER 클래스
서버 클래스 net.Server를 상속하고 'connection' 이벤트를 수신합니다.
Server 클래스에서는 두 가지 주요 작업이 수행됩니다. 1. NET 모듈 초기화 및 TCP 네트워크 모니터링 설정 2. 자체 요청 이벤트 모니터링
클라이언트 요청이 오면 Server 인스턴스는 먼저 '연결'을 수신합니다. 이벤트를 통해 TCP 연결을 설정하고 ConnectionListener에 소켓 개체를 노출합니다. 다음으로, HTTP 모듈은 소켓 개체를 통해 클라이언트와 상호 작용합니다.
요청이 도착하면 서버는 자체 요청 이벤트를 트리거하고 서버 인스턴스를 생성할 때 전달된 콜백 함수인 requestListener 메서드를 호출합니다.
new Server( function(req, res) { res.writeHead(200) res.end('hello world') })
참고: 소켓 개체는 클라이언트와 데이터를 교환할 수 있는 TCP 프로토콜의 구현과 유사합니다. 참고: ConnectionListener 함수에서 구문 분석기 인스턴스도 초기화되고 onIncoming 함수 HTTP 구문 분석기가 바인딩됩니다.
전체 구문 분석 프로세스는 ConnectionListener에서 수행됩니다. 소켓은 'data' 이벤트를 통해 TCP가 푸시한 데이터를 얻습니다. 즉, parser.excute()라는 데이터를 먼저 구문 분석합니다. 파싱 도구는 파서(parser)입니다. 파서의 재사용을 달성하기 위해 저자는 'FreeList 풀'에서 파서를 얻었음을 언급할 가치가 있습니다.
... const parser = parsers.alloc() ... connectionListener(socket) { socket.on('data', socketOnData) // TCP推入数据,parser进行解析 function socketOnData(d) { ... const ret = parser.execute(d) ... } }
1. TCP 데이터가 도착하면 먼저 Execute()
2. 단서를 따라가서 우리는 parser.excute가 Excute(node_http_parser.cc)라는 것을 알았습니다. Excute는 아웃소싱일 뿐이며 구체적인 작업은 http_parser_excute(http_parser.c)에서 수행됩니다.
node_http_parser.cc는 http_parser.c의 래퍼일 뿐입니다. http_parser.c는 데이터를 위해 node_http_parser.cc와 상호 작용하기 위해 외부에 노출된 7개의 콜백 주기 함수를 사용합니다.
3. http_parser.c에는 HTTP_CB와 HTTP_DATA_CB의 두 가지 유형의 콜백만 있습니다. 오버로딩을 통해 아래와 같이 두 가지 유형의 함수에 8개의 주기 함수가 등록됩니다.
4. http_parser에는 8개의 등록된 콜백 함수가 있지만 node_http_parser.cc는 4개의 주기 함수만 외부에 노출합니다.
parserOnHeaders
parserOnHeadersComplete
parserOnBody
parserOnMessageComplete
5. http_parser.c가 on_headers_complete로 구문 분석되면 그림과 같이 HTTP_CB(on_headers_complete) 콜백 함수를 실행합니다.
kOnHeadersComplete 콜백 함수가 실행됩니다. js)
6. 이제 요청 헤더 구문 분석이 기본적으로 완료됩니다. 다음으로 IncomingMessage의 인스턴스를 생성한 후 요청 헤더 데이터를 인스턴스에 패키징합니다.
onIncoming 콜백 함수를 실행하고 획득한 IncomingMessage 인스턴스를 매개변수로 전달합니다.function parserOnHeadersComplete (versionMajor, versionMinor, headers, method, url, statusCode, statusMessage, upgrade, shouldKeepAlive) { ... parser.incoming = new IncomingMessage(parser.socket) parser.incoming.httpVersionMajor = versionMajor parser.incoming.httpVersionMinor = versionMinor parser.incoming.httpVersion = versionMajor + '.' + versionMinor parser.incoming.url = url ... skipBody = parser.onIncoming(parser.incoming, shouldKeepAlive) }
7.parserOnIncoming에서 ServerResponse 인스턴스를 만듭니다.
req와 res의 두 인스턴스를 사용하면 서버에서 모니터링하는 요청 이벤트가 트리거됩니다.
서버가 인스턴스화되면 requestListener가 요청 이벤트를 모니터링하는 함수 매개변수로 사용됩니다.
8. 서버가 생성되었을 때로 돌아갑니다.
const server = new Server( function(req, res) { var data = '' req.on('data', function(chunk){ console.log('chunk: ' + chunk) data += chunk; }) res.writeHead(200) res.end('hello world') })
요약하면 http_parser가 헤더를 구문 분석한 후 요청 이벤트가 트리거됩니다.
본문 데이터를 어디에 넣을 것인가? 실제로 본체 데이터는 사용자가 데이터 이벤트를 사용하여 데이터를 수신할 때까지 스트림에 배치됩니다. 즉, 요청이 트리거되면 본문이 구문 분석되지 않습니다.
3. 프로세스 개요 전체 http 요청은 다음과 같습니다. - 클라이언트는 HTTP 요청을 시작하고 먼저 서버 측에서 연결 이벤트를 트리거한 후 TCP 링크를 설정합니다.
연결 이벤트를 수신한 후 서버는 TCP 연결을 설정하고 소켓을 노출하며 소켓을 통해 '데이터' 이벤트를 수신합니다. http-parser를 초기화하여 후속 데이터 구문 분석을 준비합니다.
HTTP 요청 데이터가 서버에 도달하고, 파서는 실행 메소드를 실행하여 파싱합니다. 요청 헤더가 성공적으로 파싱되면 콜백을 통해 요청 이벤트가 트리거됩니다.
이 시점에서 서버 콜백 함수에서 이 http 요청에 대한 요청을 받았습니다
4. 결론 nodejs의 기본 라이브러리 중 다수가 C++/C로 작성되었기 때문에 읽기 및 디버깅 과정에서 매우 불편합니다. 제가 직접 소스코드를 읽을 때는 소스코드 중 JS 부분에만 집중했습니다. 예를 들어 TCP의 3방향 핸드셰이크와 4방향 웨이브는 구현 세부 사항을 자세히 다루지 않습니다. 위 분석에는 http-body 분석이 포함되지 않습니다. 본문이 있는 네트워크 요청의 경우 실제 상황은 더 복잡하며 일부 세부 사항은 완전히 이해되지 않습니다. 다음에 요약해서 공유할 때 부족한 부분은 모두 채워나갈 수 있도록 최선을 다하겠습니다. 위 내용은 모두를 위해 제가 정리한 내용입니다. 앞으로 모든 사람에게 도움이 되기를 바랍니다. 관련 기사:
위 내용은 NODEJS의 http 구현에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Node.js는 고성능, 확장성, 크로스 플랫폼 지원, 풍부한 생태계, 개발 용이성 등의 기능을 제공하므로 백엔드 프레임워크로 사용할 수 있습니다.

MySQL 데이터베이스에 연결하려면 다음 단계를 따라야 합니다. mysql2 드라이버를 설치합니다. mysql2.createConnection()을 사용하여 호스트 주소, 포트, 사용자 이름, 비밀번호 및 데이터베이스 이름이 포함된 연결 개체를 만듭니다. 쿼리를 수행하려면 Connection.query()를 사용하세요. 마지막으로 Connection.end()를 사용하여 연결을 종료합니다.

Node.js 설치 디렉터리에는 npm과 npm.cmd라는 두 가지 npm 관련 파일이 있습니다. 차이점은 다음과 같습니다. 확장자가 다릅니다. npm은 실행 파일이고 npm.cmd는 명령 창 바로 가기입니다. Windows 사용자: npm.cmd는 명령 프롬프트에서 사용할 수 있으며, npm은 명령줄에서만 실행할 수 있습니다. 호환성: npm.cmd는 Windows 시스템에만 해당되며 npm은 크로스 플랫폼에서 사용할 수 있습니다. 사용 권장사항: Windows 사용자는 npm.cmd를 사용하고, 기타 운영 체제는 npm을 사용합니다.

Node.js에는 다음과 같은 전역 변수가 존재합니다. 전역 개체: 전역 핵심 모듈: 프로세스, 콘솔, 필수 런타임 환경 변수: __dirname, __filename, __line, __column 상수: undefine, null, NaN, Infinity, -Infinity

Node.js와 Java의 주요 차이점은 디자인과 기능입니다. 이벤트 중심 대 스레드 중심: Node.js는 이벤트 중심이고 Java는 스레드 중심입니다. 단일 스레드 대 다중 스레드: Node.js는 단일 스레드 이벤트 루프를 사용하고 Java는 다중 스레드 아키텍처를 사용합니다. 런타임 환경: Node.js는 V8 JavaScript 엔진에서 실행되는 반면 Java는 JVM에서 실행됩니다. 구문: Node.js는 JavaScript 구문을 사용하고 Java는 Java 구문을 사용합니다. 목적: Node.js는 I/O 집약적인 작업에 적합한 반면, Java는 대규모 엔터프라이즈 애플리케이션에 적합합니다.

예, Node.js는 백엔드 개발 언어입니다. 서버 측 비즈니스 로직 처리, 데이터베이스 연결 관리, API 제공 등 백엔드 개발에 사용됩니다.

Node.js 프로젝트의 서버 배포 단계: 배포 환경 준비: 서버 액세스 권한 획득, Node.js 설치, Git 저장소 설정. 애플리케이션 빌드: npm run build를 사용하여 배포 가능한 코드와 종속성을 생성합니다. Git 또는 파일 전송 프로토콜을 통해 서버에 코드를 업로드합니다. 종속성 설치: SSH를 서버에 연결하고 npm install을 사용하여 애플리케이션 종속성을 설치합니다. 애플리케이션 시작: node index.js와 같은 명령을 사용하여 애플리케이션을 시작하거나 pm2와 같은 프로세스 관리자를 사용합니다. 역방향 프록시 구성(선택 사항): Nginx 또는 Apache와 같은 역방향 프록시를 사용하여 트래픽을 애플리케이션으로 라우팅합니다.

Node.js와 Java는 각각 웹 개발에 장단점이 있으며 선택은 프로젝트 요구 사항에 따라 다릅니다. Node.js는 실시간 애플리케이션, 신속한 개발 및 마이크로서비스 아키텍처에 탁월한 반면, Java는 엔터프라이즈급 지원, 성능 및 보안에 탁월합니다.
