首页 > 代码库 > nodejs学习笔记之网络编程
nodejs学习笔记之网络编程
了解一下OSI七层模型
OSI层 | 功能 | TCP/IP协议 |
应用层 | 文件传输,电子邮件,文件服务,虚拟终端 | TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet |
表示层 | 数据格式化,代码转换,数据加密 | - |
会话层 | 数据格式化,代码转换,数据加密 | - |
传输层 | 提供端对端的接口 | TCP,UDP |
网络层 | 为数据包选择路由 | IP,ICMP,RIP,OSPF,BGP,IGMP |
数据链路层 | 传输有地址的帧以及错误检测功能 | SLIP,CSLIP,PPP,ARP,RARP,MTU |
物理层 | 以二进制数据形式在物理媒体上传输数据 | ISO2110,IEEE802,IEEE802.2 |
主要内容
- TCP(传输控制协议)
- UDP(用户数据包协议)
- HTTP(超文本传输协议)
- Websocket
- 网络服务与安全(cryto tls https)
TCP特征
- 面向连接的协议
- 需要三次握手
TCP服务实践(一)
创建服务端:
var net = require(‘net‘); var server = net.createServer(function(socket) { //新的连接 socket.on(‘data‘, function(data) { console.log(‘服务端接收到客户端的消息:‘ + data.toString()); socket.write(‘服务端回应:你好‘); }); socket.on(‘end‘, function() { console.log(‘服务端断开连接‘); });}); server.listen(8124, function() { console.log(‘TCP服务创建‘);});
TCP服务实践(二)
创建客户端:
var net = require(‘net‘); var client = net.connect({port:8124}, function() { console.log(‘客户端连接成功‘); client.write(‘客户端发起问候:你好‘);}); client.on(‘data‘, function(data) { console.log(‘客户端接收服务端消息:‘ + data.toString()); client.end();}); client.on(‘end‘, function() { console.log(‘客户端断开连接‘);});
TCP服务的事件(一)
- 服务器事件
- listening:server.listen()
- connection:net.createServer()
- close:server.close()
- error
TCP服务的实践(二)
- 连接事件
- data:一端执行write(),另一端触发该事件
- end:任意一端断开连接,触发该事件
- connect:该事件用于客户端,当套接字服务端连接成功时触发
- drain:当任意一端触发write(),当前这端会触发该事件
- error:当异常发生时,触发该事件
- close:当套接字结束时,触发该事件
- timeout:当一定时间后连接不再活跃时,触发该事件
TCP小结
- 面向连接(建立通信线路:建立、使用、释放)
- 三次握手(建立连接的过程)
- nodejs实现(net模块)
UDP特征
- 无连接
- 不可靠的信息服务
- 在网络差的情况,丢包严重
- 既可以客户端发送消息,又可以做服务端接收消息
- 使用场景:对丢包要求不高的场景(音频、视频、DNS服务)
UDP服务实践(一)
创建服务端:
var dgram = require(‘dgram‘); var server = dgram.createSocket(‘udp4‘); server.on(‘message‘, function(msg, rinfo) { console.log(‘服务端获取信息:‘+msg+‘来自:‘+rinfo.address+‘:‘+rinfo.port);}); server.on(‘listening‘, function() { var address = server.address(); console.log(‘服务端正在监听:‘+address.address+‘:‘+address.port);}); server.bind(41234);
UDP服务实践(二)
创建客户端:
var dgram = require(‘dgram‘); var client = dgram.createSocket(‘udp4‘); var message = new Buffer(‘我是客户端的消息‘);client.send(message, 0, message.length, 41234, ‘10.16.15.155‘, function(err, bytes) { console.log(‘客户端发送完成,关闭客户端‘); client.close();});
UDP套接字事件
- message:当UDP套接字侦听网卡端口后,收到消息时会触发该事件,携带Buffer对象和远程地址信息
- listening:当UDP开始侦听时,触发该事件
- close:调用close()方法时,触发该事件
- error:当出现异常时,触发该事件,如果不处理,会使进程退出
UDP小结
- 面向无连接(不需要建立通信线路,把带有目的地址的包送到线路上)
- 使用场景(对丢包要求不高,IP、UDP协议都是无连接的)
- nodejs实现(dgram模块)
HTTP特征
- 建立在TCP之上的应用层协议
- 经典的模式:B/S
- 知名HTTP标准:RFC2616(W3C和IETF)
HTTP服务实践(一)
创建服务端:var http = require(‘http‘); http.createServer(function(req, res) { res.writeHead(200, {‘Content-type‘: ‘text/plain‘}); res.end(‘Hello world!\n‘);}).listen(8000); console.log(‘服务器已开启‘);
HTTP报文
- 第一部分:经典的TCP三次握手
- 第二部分:客户端(curl)发送请求报文
- 第三部分:服务器响应(包含响应头和响应体)
- 第四部分:结束会话
HTTP服务实践(二)
创建客户端:
var http = require(‘http‘); var options = { hostname: ‘10.16.15.155‘, port: 8000, method: ‘GET‘, path: ‘/‘}; var req = http.request(options, function(res) { console.log(‘Status:‘+res.statusCode); console.log(‘Headers:‘+JSON.stringify(res.headers)); res.setEncoding(‘utf-8‘); res.on(‘data‘, function(chunk) { console.log(chunk); });}); req.end();
HTTP服务的事件(一)
- 服务端事件
- connection
- request
- close
- checkContinue
- connect
- upgrade
- clientError
HTTP服务的事件(二)
- 客户端事件
- response
- socket
- connect
- upgrade
- continue
HTTP小结
- HTTP建立在TCP之上的协议
- 客户端的请求可以通过模拟完成(curl、http_client.js、浏览器等)
- nodejs实现(http模块)
Websocket特征
- 建立在http服务之上
- 连接建立之后会upgrade至数据帧协议,进而实现服务端和客户端的交互
- 全双工通信
Websocket实例(socketio)
socketio文档
socketio例子
Websocket小结
- 全双工通信
- 创建http服务后会切换协议
- nodejs实现(ws、socket.io模块)
网络服务与安全
安全连接的过程:
- 根据数字证书进行认证
- 进行加密传输
- 交换公钥
- 客户端使用服务端的公钥进行加密
- 服务端使用服务端私钥就行解密
- 服务端使用客户端的公钥进行加密
- 客户端使用客户端的私钥解密
网络编程小结
- 了解OSI七层模型
- 重点学习传输层(TCP、UDP)和应用层(HTTP、Websocket)协议的nodejs实现
- 初步了解网络传输安全
参考资料:
《深入浅出nodejs》--第七章网络编程
nodejs学习笔记之网络编程
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。