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

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》网络编程)