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验证证书合法性。
网友评论