针对网络知识的提问可能会涵盖基础理论、Node.js网络模块的使用、网络性能优化以及安全等方面。
解释TCP/IP协议栈的工作原理,包括各层的主要职责。
TCP是面向连接的、可靠的传输层协议,而IP是无连接的、不可靠的网络层协议。TCP在IP之上提供了更高级的通信服务,确保了数据的可靠传输和顺序,而IP则负责将数据从源地址发送到目的地址。
TCP/IP协议栈分为四层:链路层、网络层、传输层、应用层。链路层(如以太网)负责物理媒介上的数据传输;网络层(IP协议)处理数据包的路由与寻址;传输层(TCP/UDP)提供端到端的可靠或无连接的数据传输服务;应用层(HTTP, FTP等)实现具体的网络应用服务。
描述TCP和UDP之间的主要区别。
TCP是面向连接的,提供可靠的服务,有流量控制、错误校验、确认重传机制,适合对数据完整性要求高的场景。UDP是无连接的,数据传输快但不保证可靠性,适用于实时应用如在线视频、语音通话等,因为这些应用容忍一定量的数据丢失。
Node.js中如何处理HTTP请求的并发和异步特性?
Node.js利用事件驱动和非阻塞I/O模型处理并发。当执行I/O操作时,Node.js不会等待其完成,而是继续执行其他任务,当I/O操作完成时,通过事件回调通知应用,这样即使面对大量并发连接也能保持高效响应。
描述Node.js中的Buffer对象及其用途。
Buffer是Node.js中用于处理二进制数据的类,常用于网络通信(如读写文件、处理HTTP响应体)和处理字节流。它允许在JavaScript中直接操作二进制数据,提高处理效率,特别是在处理图片、音频、视频等文件时非常有用。
如何在Node.js中防止HTTP头部注入攻击?
避免直接拼接HTTP响应头,使用安全的库或框架来处理HTTP请求和响应;对用户输入进行严格的验证和清理,拒绝包含非法字符的输入;使用安全的HTTP头部设置,如Content-Security-Policy限制外部资源加载,X-Content-Type-Options防止MIME类型嗅探等。
异步编程和非阻塞I/O
Node.js采用事件驱动和非阻塞I/O模型,确保在等待I/O操作(如数据库查询、文件读写、网络请求)完成时,线程不会被阻塞,而是继续处理其他任务。
事件循环与微任务/宏任务
理解:确保对事件循环的各个阶段有深刻理解,合理安排setTimeout
、setImmediate
、Promise的使用,以优化任务调度。
策略:优先使用微任务(如process.nextTick
, Promises)来提高响应速度,但需谨慎以避免过度使用导致栈溢出。
连接复用
HTTP Keep-Alive:启用HTTP Keep-Alive可以在同一TCP连接上发送多个请求,减少握手延迟。
Connection Pooling:对数据库或外部服务的连接使用连接池,复用连接而非每次都创建新连接。
性能监控与调试
工具:使用PM2、New Relic、Node.js内置的performance
模块或第三方库如cls-hooked
进行性能监控和瓶颈分析。
日志:合理配置日志级别和格式,便于问题追踪。
代码优化
避免内存泄漏:定期检查和释放不再使用的资源,避免长时间运行的服务内存占用持续增长。
算法与数据结构:优化关键路径上的算法和数据结构,减少计算复杂度。
模块与依赖管理
精简依赖:定期审查并移除未使用的npm包,减少应用体积。
更新依赖:保持依赖库最新,利用新版本的性能优化和漏洞修复。
HTTP/2与HTTP/3
升级协议:利用HTTP/2的多路复用、头部压缩和服务器推送特性,进一步提升性能。HTTP/3引入QUIC协议,提供了更快速的连接恢复和更低的延迟。