美文网首页
《深入浅出Node.js》网络编程

《深入浅出Node.js》网络编程

作者: 我叫Aliya但是被占用了 | 来源:发表于2022-08-31 15:20 被阅读0次

TCP

著名的3次握手是属于TCP的,所有HTTP、SMTP都是有的。

Telnet工具需要单独安装,curl命令是系统自带的。

NODE中使用dgram包创建UDP服务

// 服务端
const dgram = require('dgram');
const port = 4004;
const server = dgram.createSocket("udp4")

server.on('listening', () => {
  console.log('正在监听:', JSON.stringify(server.address()))
  // => 正在监听: {"address":"0.0.0.0","family":"IPv4","port":4004}
})
server.on('message', (msg, clientInfo) => {
  console.log('收到消息:', Buffer.from(msg).toString())
  // => 收到消息: 我是客户端
  console.log('来源是:', clientInfo)
  // => 来源是: { address: '127.0.0.1', family: 'IPv4', port: 52802, size: 15 }
})

server.bind(port)
  • bind 创建监听
  • listening 监听成功的回掉
  • message 监听到的消息和客户端信息
  • error 异常
const dgram = require('dgram');
const port = 4004;
const server = dgram.createSocket("udp4")
server.send('我是客户端', port, (err) => {
  server.close()
}) 
  • send 向指定地址(域名|IP+端口)发送消息

HTTP/HTTPS

$ curl -v http://www.baidu.com
* Rebuilt URL to: http://www.baidu.com/
*   Trying 110.242.68.4...
* TCP_NODELAY set
* Connected to www.baidu.com (110.242.68.4) port 80 (#0)
# 以上是三次握手的过程
> GET / HTTP/1.1
> Host: www.baidu.com
> User-Agent: curl/7.54.0
> Accept: */*
# 这些是客户端向服务器端发送请求报文,以下是响应头和响应体
< HTTP/1.1 200 OK
< Cache-Control: ... 
...
* Connection #0 to host www.baidu.com left intact
# 结束会话

webSocket使用ws/wss是由http Upgrade来的(Status Code: 101 Switching Protocols)

客户端使用的http.request背后有一个代理对象(连接池)http.Agent,默认并发5个请求。

WebSocket

> GET /im HTTP/1.1
> Host: www.baidu.com
> Upgrade: websocket   # 请求服务器端升级协议为WebSocket
> Connection: Upgrade  # 请求服务器端升级协议为WebSocket
> Sec-WebSocket-Key: Cljb3RKub00RmSL1sTjNdw== # 用于安全校验
> Sec-WebSocket-Version: 13  # 协议版本号
# 以上为请求,以下为响应
< HTTP/1.1 101 Switching Protocols
< Connection: upgrade
< Upgrade: websocket
< Sec-WebSocket-Accept: 2TAkJFOJY834CSElGJ33jjz1nDY= # 客户端会校验此值

握手完成后,不再进行HTTP的交互,而是开始WebSocket的数据帧协议交互。

数据帧格式:

fin(1位) + rsv1(1位) + rsv2(1位) + rsv3(1位) + opcode(4位)
+ masked(1位) + payload length(7位)
              + payload length(或者7 + 16位)
              + payload length(或者7 + 64位)
[+ masking key(32位)]
+ payload data
  • fin :1 是最后一帧 0 不是
  • rsv1 - rsv3: 自定义拓展
  • opcode:1 文本数据帧 2 二进制 8 连接关闭 9 ping 10 pong
  • masked: 1 进行掩码处理
  • masking:当masked=1,用于解码数据

安全

NODE中与安全相关模块主要有crypto、tls、https。crypto用于SHA256等加密解密。

TLS/SSL:一个(公钥/私钥的)非对称的结构。服务器端和客户端都有自己的公私钥,建立连接前需要互换公钥。可以理解为公钥是锁,私钥是钥匙,数据传输时,使用对方的锁加密数据,对方拿到后使用自己的钥匙解开

[客] =>(使用服务器)公钥加密 => 传输 => (使用服务器)私钥解密 => [服]
[客] <=(使用客户端)私钥解密 <= 传输 <= (使用客户端)公钥加密 <= [服]

为了解决有人冒充服务器(中间人攻击)引入了数字证书,由 CA(Certificate Authority,数字证书认证中心),在请求过程中证书会被发送给客户端,客户端向CA验证证书合法性。

相关文章

  • 异步编程的困惑

    《深入浅出 Node.js》阅读随笔 众所周知,Node.js 虽然也有部分同步编程的方式,但主要还是以后异步编程...

  • [深入浅出Cocoa]ios网络编程之Socket

    一.iOS网络编程层次模型 在前文《深入浅出的Cocoa之Bonjour网络编程》中我介绍了如何在Mac系统下进行...

  • 为什么选择 Node.js

    《深入浅出 Node.js》阅读随笔 Node.js 的横空出世,是 web 从业者的福音。其在并发网络场景中的优...

  • [深入浅出Cocoa]iOS网络编程之NSStream

    [深入浅出Cocoa]iOS网络编程之NSStream 一,NSStream简介 首先来回顾下。在前文《 [深入浅...

  • 2021-04-07each和foreach

    深入浅出 Node.js(三):深入 Node.js 的模块机制 https://www.infoq.cn/art...

  • Node.js 有什么弊端

    《深入浅出 Node.js》阅读随笔 此文为《为什么选择 Node.js》姊妹篇,简单聊一下 Node.js 的缺...

  • Cocoa iOS网络编程--CFNetwork

    一,CFNetwork 简介 首先来回顾下。在前文《[深入浅出Cocoa]iOS网络编程之Socket》中,提到i...

  • Node.js 有必要写测试用例吗?

    《深入浅出 Node.js》阅读随笔 先说结论:很有必要!不单是 Node.js,除非是作为体验或者 Demo 演...

  • python 神经网络学习

    最新在朋友的推荐下看了《python神经网络编程》,深有启发,本文以深入浅出的道理,简单明了的介绍了一种神经网络的...

  • 发布/订阅模式

    《深入浅出 Node.js》阅读随笔 Node.js 下使用发布/订阅的模式写程序,可以很优雅的解藕业务逻辑,尤其...

网友评论

      本文标题:《深入浅出Node.js》网络编程

      本文链接:https://www.haomeiwen.com/subject/cclsnrtx.html