2011-09-07 3 views
11

node.js/socket.io를 사용하여 채팅 서버를 고려하고있었습니다. 나는 그것을 tcp 서버 또는 http 서버로 만들어야합니까? 나는 TCP 서버가 더 효율적 일 것이라고 상상하지만, 파일 첨부 파일 등 다른 것들을 보낼 수 있습니까? tcp가 더 효율적이라면 얼마나 더? 또한 하나의 node.js 서버가 얼마나 많은 동시 연결을 처리 할 수 ​​있는지 궁금합니다. TCP 또는 HTTP를 수행하는 것이 더 많은 작업입니까?토론 : node.js를 통한 채팅 서버 : HTTP 또는 TCP?

답변

25

여기서 두 가지 완전히 다른 접근 방식에 대해 이야기하고 있습니다. TCP는 전송 계층 프로토콜이고 HTTP는 응용 프로그램 계층 프로토콜입니다. HTTP (일반적으로)는 TCP를 통해 작동하므로 선택하는 옵션에 따라 TCP를 통해 계속 작동합니다.

다른 질문이 있기 때문에 효율적인 질문은 논점의 일종입니다. OSI layers. 원시 TCP 소켓을 사용했다면 HTTP가 채팅의 규모에 따라 목적에 부합하지 않는 추가 데이터 (머리글)를 포함하기 때문에 최소한 솔루션의 대역폭은 더 효율적일 것입니다. 프로그램). 거기서 개발하는 것에 대해 이야기하는 것은 당신 자신의 응용 프로그램 계층 프로토콜입니다.

모든 HTTP가 첨부 파일을 보낼 수 있고 TCP를 통해 작동하면 원하는 것을 TCP를 통해 보낼 수 있습니다. FTP는 또한 TCP를 통해 작동하며 "첨부 파일"을 전송하기위한 용도로만 설계되었습니다. 이를 위해서는 다음과 같은 데이터가 파일이라는 것을 상대방에게 알리고 파일 데이터를 보낸 다음 전송이 완료되었음을 원격 파티에 알릴 수 있도록 프로토콜을 작성해야합니다. 이것의 구현은 다양하며 (HTTP 접근 방식은 FTP 접근 방식과 완전히 다르다) 옵션은 거의 무한하다.

node.js 연결 제한에 대해서는 확실하지 않지만 운영 체제에 의해 제한된다는 상당한 확신을 가지고 말할 수 있습니다. This을 사용하면 해당 질문에 대한 답을 얻을 수 있습니다.

TCP 또는 HTTP로 처리하는 것이 더 많은 작업인지 여부는 논란의 여지가 있습니다. 두 가지 모두에서 처리하는 것은 많은 작업입니다. 나는 아마 최선의 선택이되는 TCP 옵션에 더 의지 할 것이다. TCP는 애플리케이션뿐만 아니라 프로토콜을 설계해야하지만 HTTP는 채팅 서버와 같은 양방향 애플리케이션에 적합하지 않습니다. HTTP를 통해 AJAX를 사용하는 채팅 기능이 많이 구현되어 있지만, 나는 그들이 고통스러운 경험을 통해 리어 엔드에서 완전히 고통 스럽다고 말할 수 있습니다.

엔드 포인트 (예 : 클라이언트)가 브라우저가되도록하려는 경우 HTTP 만보아야한다고 말합니다. 끝점에 대한 데스크톱 응용 프로그램을 작성하려는 경우 직접 TCP 링크를 사용하는 것이 좋습니다. 이것의 주된 이유는 HTTP가 클라이언트가 서버에 요청을 보내고 서버가 응답하는 요청 - 응답 방식으로 작동한다는 것입니다. TCP를 통해 양방향 통신에 사용할 수있는 단일 TCP 스트림을 열 수 있습니다. 이는 서버가 클라이언트에 즉시 이벤트를 푸시 할 수 있다는 것을 의미합니다. HTTP를 통해 클라이언트가 요청을 보낼 때까지 기다려야하므로 이벤트로 응답 할 수 있습니다. 브라우저를 클라이언트로 사용하려는 경우 전체 파일 전송 작업을 훨씬 까다로워 할 것입니다 (적어도 보내는 것).

긴 폴링과 서버 푸시 (read this)를 사용하여 HTTP를 통해이를 구현할 수있는 방법이 있지만 구현하기가 정말 어려울 수 있습니다.

LAN상에서 (또는 심지어 인터넷을 통해) 이것을 구현하려고한다면 TCP를 통한 UDP를 고려할 가치가 있습니다 - 채팅 응용 프로그램에서는 메시지가 올바른 순서로 도착한다는 것이 절대적으로 중요하지 않습니다. 그렇다고하더라도 네트워크 대기 시간의 변동 (아마도 < 100ms)보다 사용자가 입력하는 것이 더 빠를 것입니다. 그런 다음 파일 전송을 위해 FTP와 같은 데이터 교환을 위해 별도의 TCP 소켓을 협상하거나 TFTP와 같은 일종의 UDP ACK 시스템을 구현할 수 있습니다.

이 주제에 관해 더 많은 이야기가 있지만 지금은 말로 표현할 수 없다고 생각합니다. 나는이 대답을 어느 시점에서 연장 할 수 있습니다.

+0

node.js/socket.io 클라이언트 측에서 tcp를 수행하는 방법을 알고 있습니까? 내가 여기에 나열된이 질문을 가지고 : http://stackoverflow.com/questions/7340475/client-side-tcp-with-node-js-socket-io – Derek

+0

btw. 많이 설명해 주셔서 감사합니다. 그것의 많은 도움. 그러나, udp와 tcp보다 장점/단점에 대해 더 자세히 설명 할 수 있습니까? 정말 고마워! – Derek

+0

udp 패킷 손실이 채팅 앱에 영향을 줍니까? – Derek

2

채팅 서버는 노드의 Hello World 프로그램입니다. http를 사용하십시오.

얼마나 많은 동시 연결 수를 처리 할 수 ​​있는지에 대한 질문은 모두 해당 시스템에 따라 다릅니다. 간단한 채팅 서버를 설정 한 다음 벤치마킹 해보십시오.

또한 http://search.npmjs.org/을 확인하고 chat에 대한 몇 가지 포인터를 검색하십시오.