来源:Node.js

TCP协议

TCP(Transmission Control Protocol)是互联网协议套件(TCP/IP)的一部分,是一种面向连接的、可靠的、基于字节流的传输协议,位于应用层和网络层之间,用于在计算机网络上进行数据传输

TCP的特点

  • 可靠性
    • TCP使用确认机制、序列号和重传策略,确保数据的可靠传输
    • TCP可以检测并纠正数据丢失、重复、损坏或失序的问题
  • 面向连接
    • 在进行数据传输之前,TCP需要在发送方和接收方之间建立一个连接
    • 连接的建立是通过三次握手来完成的,确保双方都准备好进行通信
    • 通讯结束后,使用四次挥手关闭连接
  • 全双工通信:TCP支持双方同时进行双向通信,即发送方和接收方可以在同一时间发送和接收数据
  • 流式传输
    • TCP将数据视为连续的字节流进行传输,而不是离散的数据包
    • 发送方会将数据划分为较小的数据块,但TCP在传输过程中将其作为连续的字节流处理
  • 拥塞控制
    • TCP具备拥塞控制机制,用于避免网络拥塞和数据丢失
    • TCP通过动态调整发送速率、使用拥塞窗口和慢启动算法等方式来控制数据的发送速度

net模块

net模块是Nodejs的核心模块之一,它提供了用于创建基于网络的应用程序的API,主要用于创建TCP服务器和TCP客户端、处理网络通信

使用场景

从传输层实现HTTP协议

使用net.createServer创建Unix域套接字,它接受一个回调函数,返回一个server对象

其中,这个回调函数接收的socket可以监听很多事件,例如

  • close:套接字完全关闭就触发
  • connect:成功建立套接字连接时触发
  • data:接收到数据时触发
  • end:当套接字的另一端表示传输结束时触发,从而结束套接字的可读端

server.js:

1
2
3
4
5
6
7
8
9
10
11
import net from 'net'

const server = net.createServer((socket) => {
socket.on('data', (data)=> {
console.log(data.toString())
})
})

server.listen(11451, () => {
console.log('Server listening on port 11451')
})

通过浏览器访问这个url(发送了一个HTTP GET请求)后,发现服务收到了这么一大堆东西

尝试识别GET请求并返回格式正确的响应:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import net from 'net'

const html = `<h1>I am Cheriko</h1>`

const responseHeaders = [
'HTTP/1.1 200 OK',
'Content-Type: text/html',
'Content-Length: ' + html.length,
'Server: Cheriko',
'Connection: close',
'\r\n',
html
]

const server = net.createServer((socket) => {
socket.on('data', (data)=> {
// 捉到GET请求
if(/GET/.test(data.toString())) {
// 返回响应头和响应内容
socket.write(responseHeaders.join('\r\n'))
socket.end()
}
})
})

// 端口号就是在传输层实现的,所以可以使用listen监听
server.listen(11451, () => {
console.log('Server listening on port 11451')
})

浏览器就能识别并渲染这段HTML

服务端间通讯

服务端间可以直接使用TCP通讯,不需要上升到http层

server.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import net from 'net'

// 每隔一段时间发送一条数据
const server = net.createServer((socket) => {
let num = 1
setInterval(() => {
if (num > 10) {
socket.end()
} else {
socket.write('I am Cheriko ' + num)
num++
}
}, 500)
socket.on('data', (data) => {
console.log(data.toString())
})
})

server.listen(11451, () => {
console.log('Server listening on port 11451')
})

client.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import net from 'net'

// 建立与11451的连接
const client = net.createConnection(11451, 'localhost')

// 当有数据来时,输出
client.on('data', (data) => {
console.log(data.toString())
client.write('Hello Cheriko!')
})

client.on('end', () => {
console.log('Connection closed')
client.end()
})