美文网首页
《深入浅出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》网络编程

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