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)=> { if(/GET/.test(data.toString())) { socket.write(responseHeaders.join('\r\n')) socket.end() } }) })
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'
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() })
|