node net模块
node中网络通信支持 UDP
和 TCP
两大传输协议;
我们今天来讲 TCP
.(TCP 协议在node的net 模块中)
TCP
大致了解一下 TCP
(网络传输协议)
- 支持面向连接的传输服务
- 支持字节流的传输
- 支持全双工
- 支持多个同时并发的TCP连接
- 支持可靠的传输服务
支持面向连接的传输服务
端到端的传输: 程序双方都通过端口号来标识
应用程序在使用TCP传输数据之前, 需要进行 3次握手
, 确保程序之间通信的可靠性;
TCP之所以这么做, 是因为 IP 协议是无连接不可靠的; 在IP 协议之上来保证通信的
可靠性, 就只能让TCP协议自己来做;
支持字节流的传输
流(stream) : 相当于一个管道, 从一端放入什么内容, 从另一端可以原样的取出来; 它描述了一个不出现丢失, 重复和乱序的数据传输过程.
应用程序和TCP协议每次交互的 数据长度可能都不相同
. 但是TCP协议是将应用程序提交的数据看作
一连串的, 无结构的 字节流
. 因此, 接受端的应用程序数据字节的起始与终结位置必须由程序自己确定.
为了能支持字节流传输, 发送端和接受端都需要使用 缓存 cache
; (这个会在后面 data事件中验证)
为啥不直接发送呢?
肯定不行啊! 你想你在客户端输入一个字符就发送一个请求, 那岂不是太浪费了!
TCP 报文长度在 20 ~ 60 B 固定长度 20B, 选项和填充 40B
支持全双工
全双工: 接受端和发送端可以互相通信
TCP
协议允许通信双方的应用程序在任何时候都可以进行发送数据.
由于双方都设有发送和接受的 缓冲区
;
发送方把数据发送到TCP的发送端缓存区, 但不会立刻发送; 发送的时机由TCP来控制;
而接受端接受到数据之后, 会把数据放到缓冲区中; 由高层应用程序读取.
支持多个同时并发的TCP连接
TCP
协议支持同时建立多个连接. 这一点是毋庸置疑的;
尤其是在 接受端 (server)
支持可靠的传输服务
TCP是一种可靠的传输服务协议. 它使用确认机制来检查数据是否安全完整地到达, 并且提供拥塞控制功能;
主要是靠对发送和接受的数据进行数据跟踪, 确认和重传;
Socket
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
上面摘自百度百科;
简书上有讲 socket很好的文章
https://www.jianshu.com/p/066d99da7cbd
当然, 在nodejs中的Socket肯定进行一些封装;
下面有个node socket关于事件的大致流程图;
其中缺少了timeout和lookup事件; (一图顶千言)
我们可以通过vs code提供的ts文件, 看到Socket中的属性
分配两个缓冲区,输入缓冲区和输出缓冲区。
// 写入而缓冲的字符数
readonly bufferSize: number;
// 接收的字节数量
readonly bytesRead: number;
// 发送的字节数量
readonly bytesWritten: number;
// 它将保持为真,直到 socket 连接,然后设置为 false 并触发 'connect' 事件
readonly connecting: boolean;
readonly destroyed: boolean;
readonly localAddress: string;
readonly localPort: number;
// 三元组
readonly remoteAddress?: string;
// 远程 IP 协议。'IPv4' 或 'IPv6'
readonly remoteFamily?: string;
readonly remotePort?: number;
Socket 继承 Stream
流
Stream 是啥,这展开来讲就复杂了,涉及到IO方面的知识。
以后会补充上去。
可以看链接的文章了解一些。
https://www.runoob.com/nodejs/nodejs-stream.html
Server
Socket 在客户端和服务端有不同的功能。
服务端会监听 listen 客户端的请求;
从api层面上我们也可以看的出来。
// net 模块
function createServer(connectionListener ? : (socket: Socket) => void): Server;
function createServer(options ? : {
allowHalfOpen ? : boolean,
pauseOnConnect ? : boolean
}, connectionListener ? : (socket: Socket) => void): Server;
function createConnection(options: NetConnectOpts, connectionListener ?