Heim > Web-Frontend > js-Tutorial > Hauptteil

Eine eingehende Analyse des Netzmoduls in Nodejs

青灯夜游
Freigeben: 2022-04-29 21:11:55
nach vorne
3604 Leute haben es durchsucht

Dieser Artikel führt Sie durch das Netzmodul in Node, ich hoffe, er wird Ihnen hilfreich sein!

Eine eingehende Analyse des Netzmoduls in Nodejs

Dies ist der erste Artikel in der Nodejs-Reihe. Viele davon begannen mit den IO-, Puffer-, Pfad-, Ereignis-, FS-, Prozess- und Knotenereignisschleifenmechanismen In der Tat hängt die Entwicklung von Knoten hauptsächlich von der Entwicklungsabhängigkeit ab. Seit ich etwas über Knoten erfahren habe, bedeutet dies, dass der Knoten das Backend übernehmen kann, aber in der ersten Hälfte dieser Kurse geht es nur um die Fähigkeiten, die er hat ist, wie man am Ende mit dem Client interagiert.

Ich fühle mich sehr unwohl. Wenn ich also meine eigene Zusammenfassung schreibe, muss ich zuerst das Modul schreiben, das zwischen dem Server und dem Client kommuniziert, um mich wohl zu fühlen Auch wenn die Wissenspunkte des Event-Moduls und des FS-Moduls in den Prozess involviert sind, können Sie es vorerst beiseite legen und einfach verstehen, wie das net-Modul die Kommunikation als Ganzes implementiert net模块如何实现通信的.

1. OSI 七层协议模型

想要学明白通信模块,就不得不了解网络通信模型,想要记住网络通信模型,就不得不实际操作来辅助记忆. 这个是面试的重点. 这一块内容很多,想要跟深入的了解,还说需要体系的学习的. 这里只是简单提提.

寄出这张老图:

Eine eingehende Analyse des Netzmoduls in Nodejs

对于我们前端而言, 需要记住 TCP/IP 协议簇的体系结果既可.

  • 应用层: http(80 端口)、FTP(21)、SMTP(发送邮件)、POP(接收邮件)、DNS

  • 传输层: TCP/ UDP

  • 网际层: IP,ICMP(是 IP 层的附属协议)

  • 数据链路层: PPP, SLIP

  • 物理层: 网有双绞线、同轴电缆、光纤等传输方式, 遵循 ISO2110 规范

ICMP这种依附于 IP 协议的协议可以知道,对于网络协议的分层不用过于较劲. ICMP明明需要 IP 协议为基础,但是它也被规划为网络层. 我们对于 OSI 模型的正确的认识,我认为应该是用 OSI 模型来进行问题的分析比用来对于协议进行所谓的分层更加来得有意义.

TCP/IP 协议簇 并不是只是指 TCP 和 IP 协议,只是因为这两个协议过于出圈,所以就用 TCP/IP 来统称互联网相关联的协议集合起来. 还有另外一种说法是,在使用 TCP/IP 协议过程中使用到的协议族的统称.

而客户端和服务端的传输流如下

Eine eingehende Analyse des Netzmoduls in Nodejs

如果角色变成发送者接受者的时候,传输流如下图:

Eine eingehende Analyse des Netzmoduls in Nodejs

可以看出来传输的过程中,从发送端开始,没经过一层协议都会加上所需要的首部信息.层层把关,层层加码. 然后到了接收端的时候, 就反而行之, 每经过一层都剥去对应的首部. 只等到最后拿到的 HTTP 数据.

上面图片出自《图解 HTTP》

上面就是大体的网络协议模型.

疑惑: 为什么书上和很多地方在把 OSI 体系结果中合并成 TCP/IP 五层协议之后,网络层的名称会变成网际层呢?

2. TCP 连接

Eine eingehende Analyse des Netzmoduls in Nodejs

第一次握手: 客户端向服务端发送 SYN 标志位(序号是 J), 并进入 SYN_SENT 状态(等待服务端确认状态)

第二次握手: 服务端收到来自客户端的 SYN J, 服务端会确认该数据包已收到并发送 ACK 标志位(序号是 J + 1)和 SYN 标志位(序号是 K), 随后进入 SYN_REVD 状态(请求接受并等待客户端确认状态)

第三次握手: 客户端进入连接建立状态后,向服务端发送 ACK 标志位(K+ 1) , 确认客户端已收到建立连接,服务器收到 ACK 标志后,服务端进入连接已建立状态.

J 和 K 都是为了确立是谁在请求. SYN 和 ACK 的结构没有什么不同,只是发送的对象不一样.

3. net 模块

net模块1. Siebenschichtiges OSI-Protokollmodell

Wenn Sie das Kommunikationsmodul verstehen möchten, müssen Sie das Netzwerkkommunikationsmodell verstehen Um sich an das Netzwerkkommunikationsmodell zu erinnern, muss man es üben, um das Gedächtnis zu unterstützen. Dies ist der Schwerpunkt des Interviews. Es gibt viele Inhalte in diesem Bereich, und ich möchte es vertiefen und diese systematisch studieren ist erforderlich. Hier nur eine kurze Erwähnung. 🎜🎜Senden Sie dieses alte Bild:🎜🎜Eine eingehende Analyse des Netzmoduls in Nodejs🎜🎜Für unser Frontend müssen wir uns die Systemergebnisse der TCP/IP-Protokollsuite merken.🎜
  • 🎜Anwendungsschicht: http ( Port 80), FTP (21), SMTP (E-Mail senden), POP (E-Mail empfangen), DNS🎜
  • 🎜Transportschicht: TCP/ UDP🎜
  • 🎜Internetschicht: IP , ICMP (ein Nebenprotokoll der IP-Schicht)🎜
  • 🎜Datenverbindungsschicht: PPP, SLIP🎜
  • 🎜Physikalische Schicht: Netzwerk Twisted Pair, Koaxialkabel, Glasfaser und andere Übertragungsmethoden folgen der ISO2110-Spezifikation🎜
🎜Aus ICMP, einem Protokoll, das an das IP-Protokoll angehängt ist, können wir erkennen, dass für Netzwerkprotokolle keine Notwendigkeit besteht ICMP erfordert offensichtlich das IP-Protokoll als Basis, aber es ist auch als Netzwerkschicht geplant. Um ein korrektes Verständnis des OSI-Modells zu haben, sollten wir das OSI-Modell verwenden Probleme lösen. Analyse ist aussagekräftiger als die sogenannte Schichtung von Protokollen 🎜
🎜TCP/IP-Protokollcluster bezieht sich nicht nur auf TCP- und IP-Protokolle, sondern weil diese beiden Protokolle auch außerhalb des Kreises liegen, TCP/ Unter IP versteht man zusammenfassend die Sammlung von Protokollen im Zusammenhang mit dem Internet. Anders ausgedrückt: die Sammelbezeichnung für die Protokollfamilie, die bei der Verwendung des TCP/IP-Protokolls verwendet wird.🎜
🎜Die Übertragung Der Fluss zwischen dem Client und dem Server ist wie folgt 🎜🎜Eine eingehende Analyse des Netzmoduls in Nodejs🎜🎜Wenn die Rollen Sender und Receiver werden, ist der Übertragungsablauf wie folgt: 🎜🎜Eine eingehende Analyse des Netzmoduls in Nodejs🎜🎜Es ist ersichtlich, dass während des Übertragungsprozesses ab Auf der Sendeseite wird alles hinzugefügt, ohne eine Protokollschicht zu durchlaufen. Die erforderlichen Header-Informationen werden Schicht für Schicht überprüft und Schicht für Schicht codiert. Auf der Empfangsseite wird dann das Gegenteil durchgeführt und der entsprechende Header anschließend abgezogen Warten Sie einfach, bis die endgültigen HTTP-Daten vorliegen An vielen Stellen werden die Ergebnisse des OSI-Systems in das fünfschichtige TCP/IP-Protokoll und die Netzwerkschicht integriert. Wird der Name zur Internetschicht?🎜

2. strong>

🎜Eine eingehende Analyse des Netzmoduls in Nodejs🎜🎜Erster Handshake: Der Client sendet das SYN-Flag (Seriennummer) an den Server (J) und wechselt in den SYN_SENT-Status (wartet darauf, dass der Server den Status bestätigt). 🎜🎜Zweiter Handshake: Der Server empfängt SYN J Vom Client aus bestätigt der Server, dass das Datenpaket empfangen wurde, sendet das ACK-Flag (die Sequenznummer ist J + 1) und das SYN-Flag-Bit (die Sequenznummer ist K) und wechselt dann in den SYN_REVD-Status (Anfrage). Annahme und Warten auf den Client-Bestätigungsstatus) 🎜🎜Der dritte Handshake: Nachdem der Client in den Verbindungsaufbaustatus eingetreten ist, sendet er das ACK-Flag-Bit an den Server (K ​​+ 1), bestätigt, dass der Client die hergestellte Verbindung empfangen hat, und danach Der Server empfängt das ACK-Flag und der Server wechselt in den Status „Verbindung hergestellt“. 🎜
🎜 blockquote>

3. net module

🎜net module Es ist die spezifische Implementierung der oben genannten TCP-Verbindung. 🎜

Zuallererst wird beim Erlernen der API immer noch empfohlen, direkt zur offiziellen Dokumentation zu gehen. Der Chinesische DokumentationInhalt wird nicht die neueste Version sein

Wenn Sie lernen, versuchen Sie, die englische Dokumentation zu lesen, wenn Sie möchten Ich habe ein halbes Jahr lang daran festgehalten, aber jetzt kann ich das Unbehagen ertragen und nach einem halben Jahr weitermachen Das ist gut, denn das ist nicht deine Komfortzone. Denn der Mut, die eigene Komfortzone zu überschreiten, ist die Quelle des Fortschritts.

Als nächstes kommen wir zur Sache. Da wir Kommunikation lernen wollen, brauchen wir zwei Objekte, um den Client und den Server zu simulieren. Erstellen Sie zwei Dateien mit client.js: client.jsservice.js两个文件. 通过命令行创建:

touch client.js && touch service.js
Nach dem Login kopieren

3.1 service.js 部分

引入net模块,并让服务器进入LISTENT状态, 以及配置端口号和 HOST 地址(手动略过 DNS 解析过程), 等待客户端的召唤

const net = require("net");
const post = 3306;
const host = "127.0.0.1";

const server = net.createServer();
server.listen(post, host);
Nach dem Login kopieren

此时服务器对应了 TCP 连接中服务器LISTEN状态.

随后监听一些必要的事件,也就是 server 提供的钩子. (属于 event 相关知识)

server.on("listening", () => {
  console.log("服务器已经可以连接啦");
});

server.on("connection", (socket) => {
  console.log("有客户端来访咯");
});

server.on("close", () => {
  console.log("服务器关闭了");
});

server.on("error", (error) => {
  console.log("服务器出错啦: ", error); // error 有错误的信息
});
Nach dem Login kopieren

上面这一串代码涉及到了,

  • listening: 监听端口后出发的事件
  • connection: 有客户端来访的时候触发事件
  • close: 服务器关闭触发
  • error: 服务器出错触发

对于close我们需要注意的是,后台大哥一般是直接

ps
kill -9 pid
Nach dem Login kopieren

通过杀死线程的方式来进行的

connection狗子中, 形参是 socket 命名. 它的中文翻译为嵌套字, 被 node 封装成了 stream(流).在可以粗浅的理解为就是客户端发送过来的数据. 这是这个数据自身是有方法的. 我在connection中对socket来进行处理

server.on("connection", (socket) => {
  console.log("有客户端来访咯");

  socket.on("data", (data) => {
    console.log(data); // 客户端发送过来的数据
  });
});
Nach dem Login kopieren

stream 以后的文章会进行介绍.

服务端既然能够接受客户端发过来的数据,自然也能够给客户端回复. 在socket.on中写入(当然也可以写在外面):

socket.write("我已经收到你的服务器了哦,客户端");
Nach dem Login kopieren

此时如果客户端已经完成了数据的接受,然后关闭了连接.我们可以也可以通过socket.on('close‘)钩子监听到:

socket.on("close", () => {
  console.log("客户端把另外一头的流给关了");
});
Nach dem Login kopieren

对于socket事件的总结放入client.js中. 此时service.js的所有内容如下:

const net = require("net");
const post = 3306;
const host = "127.0.0.1";

const server = net.createServer();
server.listen(post, host);

server.on("listening", () => {
  console.log("服务器已经可以连接啦");
});

server.on("connection", (socket) => {
  console.log("有客户端来访咯");

  socket.on("data", (data) => {
    console.log(data); // 客户端发送过来的数据

    socket.write("我已经收到你的服务器了哦,客户端");
  });

  socket.on("close", () => {
    console.log("客户端把另外一头的流给关了");
    server.close(); // 客户端已经不要数据了,那么我们就把服务器给关闭了吧
  });
});

server.on("close", () => {
  console.log("服务器关闭了");
});

server.on("error", (error) => {
  console.log("服务器出错啦: ", error); // error 有错误的信息
});
Nach dem Login kopieren

3.2 client.js 部分

客户端的就简单很多.

const net = require("net");
const post = 3306;
const host = "127.0.0.1";

const socket = net.connect(post, host);

socket.on("connect", () => {
  console.log("已经连接到服务器了哦");
});

socket.write("服务器, 我来了");
socket.on("data", (data) => {
  console.log(data.toString());
  socket.end();
});

socket.on("close", () => {
  console.log("连接已关闭了");
});
Nach dem Login kopieren

对于socket的事件的总结

  • connect: 成功和服务器连接触发
  • data: 接受到服务器发过来的参数
  • end: 数据接收完毕之后可以触发
  • close: socket 关闭触发

service.jsclient.js

node service.js
node client.js
Nach dem Login kopieren

3.1 service.js-Teil

Führen Sie das Modul net ein, lassen Sie den Server in den Status LISTENT wechseln und konfigurieren Sie es Geben Sie die Portnummer und die HOST-Adresse ein (überspringen Sie den DNS-Auflösungsprozess manuell) und warten Sie auf den Anruf des Clients

rrreee

Zu diesem Zeitpunkt entspricht der Server dem Serverstatus LISTEN in der TCP-Verbindung.

Dann werden einige notwendige Ereignisse überwacht, bei denen es sich um die vom Server bereitgestellten Hooks handelt. (Gehört zum ereignisbezogenen Wissen) : Ereignis, das nach dem Abhören des Ports ausgelöst wird
  • Verbindung: Wird ausgelöst, wenn ein Client zu Besuch kommt. Ereignis
  • Schließen: Wird durch Herunterfahren des Servers ausgelöst
  • error: Ausgelöst durch Serverfehler
  • FürcloseWas wir beachten müssen ist, dass der Hintergrundbruder normalerweise direkt ist

    rrreee

    beendet den Thread

    In connectionGouzi ist der formale Parameter die Socket-Benennung. Die chinesische Übersetzung ist ein verschachteltes Wort, das grob als die gesendeten Daten verstanden werden kann Dies liegt daran, dass die Daten selbst eine eigene Methode zur Verarbeitung von socket haben.
    rrreee

    stream wird in zukünftigen Artikeln vorgestellt.

    🎜Da der Server die vom Client gesendeten Daten akzeptieren kann, kann er diese natürlich auch an den Client senden. Schreiben Sie in socket.on (natürlich kann es auch außerhalb geschrieben werden): 🎜rrree 🎜Wenn der Client zu diesem Zeitpunkt die Annahme der Daten abgeschlossen und dann die Verbindung geschlossen hat, können wir auch den socket.on('close')-Hook abhören: 🎜rrreee🎜Die Zusammenfassung der Das socket-Ereignis wird in client.js eingefügt. Derzeit sind alle Inhalte von service.js wie folgt: 🎜rrreee

    3.2 client.js-Teil h3>🎜Client's Es ist viel einfacher.🎜rrreee🎜Eine Zusammenfassung der socket-Ereignisse🎜
    • connect: Wird durch eine erfolgreiche Verbindung zum Server ausgelöst
    • data: Vom Server gesendete Parameter empfangen
    • end: Kann nach Abschluss des Datenempfangs ausgelöst werden
    • close: Socket-Close-Trigger
    🎜service.js- und client.js-Frameworks wurden geschrieben und werden ausgeführt in zwei Terminals: 🎜rrree🎜Überprüfen Sie die gedruckten Ergebnisse.🎜🎜Das gesamte TCP-Verbindungsgerüst ist natürlich weit mehr als das. Wir müssen uns auch um das Auspacken und Verpacken von Sticky-Paketen kümmern , Heartbeat-Pakete usw.🎜🎜🎜 Dieser Artikel wurde reproduziert von: https://juejin.cn/post/7084618854801866765🎜🎜Autor: I am Little Orange🎜🎜🎜Weitere Informationen zu Knoten finden Sie unter: 🎜nodejs-Tutorial 🎜! 🎜

    Das obige ist der detaillierte Inhalt vonEine eingehende Analyse des Netzmoduls in Nodejs. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Verwandte Etiketten:
    Quelle:juejin.cn
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage
    Über uns Haftungsausschluss Sitemap
    Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!