Ich habe angefangen, als ich ein Kind war, denke ich, auf der Suche nach Möglichkeiten, einen öffentlichen Server vom lokalen Server bei NPM zu hosten . Gesucht nach Schlüsselwörtern wie:
- Reverse Proxy
- Ws Tunnel
- HTTP umkehren
- TCP-Tunnel
Versuchtes ws-tunnel:
Es benötigte einen separaten Port für die WebSocket-Verbindung und einen separaten Port für das Hosting eines Webservers . Obwohl es so funktionieren könnte, erlaubte Heroku, nur einen Port zu verwenden, und ich wusste nicht, ob ein anderer Cloud-Anbieter zwei öffentliche Ports zulässt (ich hielt es für nicht möglich).
Reverse-http versucht:
Es könnte als Reverse-HTTP-Client fungieren . Reverse HTTP ist ein von IETF bereitgestelltes Protokoll. Aber dann brauchte ich einen Reverse HTTP-Server . Es gab jedoch immer noch ein Problem mit Reverse HTTP, da nur jeweils eine Anforderung gestreamt werden konnte . Es war im Grunde eine umgekehrte HTTP-Verbindung vom öffentlichen zum lokalen Server . Das bedeutete entweder, ich müsste Anfragen von mehreren Benutzern irgendwie zu einer oder mehreren Verbindungen serialisieren (mehrere Reverse-HTTP-Verbindungen müssten zwischen lokalem Server und öffentlichem Server eingerichtet werden ).
Versuchen Sie es mit TCP-Paketen:
Dann wurde mir klar, dass es möglich war, dies mit einer einzelnen Verbindung und einer einfacheren, nicht gepufferten Methode des Proxys zu tun. Reverse HTTP erfordert möglicherweise eine Pufferung, wenn eine neue Verbindung besteht und alle Reverse HTTP-Verbindungen verwendet wurden. Erwägen Sie die Verwendung einfacher Pakete des folgenden Formats:
-------------------------------------- | Packet Size | Connection ID | Data | --------------------------------------
Ich suchte nach einer Möglichkeit, dies mit WebSockets zu tun, falls sie über ein vorhandenes Feature verfügte, das ich verwenden konnte, aber dann sah ich, dass Heroku jedes HTTP-Upgrade zuließ, und entschied mich daher für ein TCP-Upgrade. Ich weiß, ich habe es mir ausgedacht. So sieht die Kopfzeile aus. Ich habe geprüft, ob Heroku sie akzeptiert:
GET / HTTP/1.1 Upgrade: tcp Connection: Upgrade Origin: XXX
Ok, jetzt gab es eine Idee, wie Sie die Verbindung zwischen lokalem Server und öffentlichem Server mithilfe von TCP aktualisieren und dann über Pakete kommunizieren können. Das Paketformat sagt uns jedoch nicht aus, ob der Benutzer verbunden oder getrennt wurde. Es sagt uns nur, welche Daten der Benutzer gesendet hat. Also habe ich dem Paket ein weiteres Feld hinzugefügt:
---------------------------------------------- | Packet Size | Event | Connection ID | Data | ----------------------------------------------
Ein Problem, das noch nicht gelöst wurde, bestand darin, zwischen der Verbindung eines Benutzers und einem lokalen Server zu unterscheiden, da für beide derselbe Port verwendet wird. Es gibt viele Möglichkeiten, dies zu tun, aber ich entschied mich für einen User-Agent
lokalen Server.
Weitere Zweifel, ob der Code für den öffentlichen Server mit HTTP von Node oder mit TCP von Node erstellt werden soll. Dieses Mal las ich über verschlüsselte Codierung und Trailer und entschied, dass es besser wäre, TCP zu verwenden. Ich müsste also die anfängliche Anfrage nach einer Verbindung analysieren und die Anfrage je nach dem ermittelten Typ als Benutzer oder als lokaler Server verarbeiten. Ich stellte mir jedoch vor, dass es ein Leistungsproblem geben würde, da ich die HTTP-Header jeder Verbindung analysieren würde. Wenn wir jedoch eine seltene HTTP-Methode zur schnellen Unterscheidung verwenden, HEAD
müssen wir nur 4 Zeichen lesen. Also können wir das jetzt tun:
1. If first 4 characters not HEAD, process as User. 2. Parse all the HTTP headers. 3. If User-Agent is special value, process as Local server 4. Process as User.
Ich habe jetzt auch Unterstützung für mehrere Kanäle hinzugefügt, wodurch ich jetzt als SSH-Server auf einem anderen Computer (private IP) zugreifen kann. Code verschoben und die README-Datei dekoriert: https://github.com/nodef/rhost .
Einige interessante Seiten, die ich bei der Suche gefunden habe: