理论与API相结合理解Node中的网络通信

简介: 理论与API相结合理解Node中的网络通信

随着Node发展,其应用越来越常见,特别是在前端圈,给我们注入了新的活力。在使用中,Node的网络通信部分主要涉及到传输层和应用层,本次就来一起唠一唠常见的TCP、UDP、HTTP协议的使用,通过理论与实践相结合,更加清楚的了解与使用这些协议。


一、传输层


1.1 TCP

TCP是面向连接的,并且通过流量控制、、序号、确认和定时器,确保正确的、按序的将数据从发送进程交付给接收进程。按照服是否进行监听进行划分,TCP分为服务器和客户端。下面来分开聊一下。

640.jpg

认真读Node的API,发现其与TCP的原理暗暗贴合,妈妈再也不用担心我记不住这些API了。先看看TCP的三次握手与四次挥手过程。


  • 三次握手

640.jpg


  1. TCP服务器进程先创建传输控制块TCB(线程控制块),时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;


  1. TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这时报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。


  1. TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。


  1. TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。


  1. 当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。


  • 四次挥手

640.jpg

  1. 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。


  1. 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。


  1. 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。


  1. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。


  1. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。


  1. 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。


1.1.1 TCP服务器

640.jpg


在上述图中,仔细品,可以总结为如何创建服务、服务相关、连接相关。然后并将其中事件与三次握手、四次挥手进行联系,很容易发现其实关键过程都被进行了监听。


  1. 如何创建服务:TCP建立连接前需要进入监听状态,所以这就涉及到图中的创建方式,创建服务后才可以监听特定地址
  2. 服务相关:服务创建之后就要观察其状态,并根据其状态进行一些列的处理,这就是服务器事件做的事情。
  3. 连接相关:服务器监听的目的是有连接建立并进行通信,当连接建立之后就需要对整个数据传输过程进行监听,这就是连接事件。

1.1.2 TCP客户端


TCP客户端做的事情比较简单,只需要与对应服务器建立连接,即可进行数据的传输了。

640.jpg


1.1.3 注意事项

640.jpg


1.2 UDP


一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务.


640.jpg


二、应用层



2.1 HTTP


HTTP应该是日常开发中用的最多的协议,其是建立在TCP传输层之上的应用层协议。搞懂这个协议对前端整体水平的提高至关重要。


640.jpg


2.1.1 服务器


640.jpg

2.1.2 客户端


640.jpg


2.1.3 两个关键对象


IncomingMessage和ServerResponse两个对象在整个协议的使用中至关重要,特别是IncomingMessage。当在使用的时候,若不懂的如何去使用,这个时候是不是应该去考虑一下请求报文与响应报文的结构了?其关键属性刚好与请求报文和响应报文相呼应

  1. HTTP请求报文主要包括:请求行(方法字段、URI字段和协议版本)、请求头部以及请求的数据(实体)。
  2. HTTP响应报文分为三个部分:状态行(版本、状态码和原因语句)、首部行和实体。


640.jpg

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
弹性计算 负载均衡 网络协议
这种情况可能是由于阿里云的API服务出现了短暂的故障或者网络波动导致的
【2月更文挑战第20天】这种情况可能是由于阿里云的API服务出现了短暂的故障或者网络波动导致的
72 1
|
3月前
|
消息中间件 网络协议 Unix
Posix API 与 网络协议栈 详细介绍
Posix API 与 网络协议栈 详细介绍
61 0
|
3月前
|
网络协议 API
2.2.3 Posix API与网络协议栈
2.2.3 Posix API与网络协议栈
|
3月前
|
缓存 网络协议 算法
Posix API与网络协议栈
Posix API与网络协议栈
|
2月前
|
Web App开发 JavaScript NoSQL
深入浅出:构建基于Node.js的RESTful API
在当今快速发展的互联网时代,RESTful API已成为前后端分离架构中不可或缺的一部分。本文旨在为初学者和中级开发人员提供一个清晰、简洁的指南,详细介绍如何使用Node.js构建一个高效、可维护的RESTful API。通过结合实际案例,本文将从API设计理念出发,深入讲解如何利用Express框架及MongoDB数据库实现API的增删改查功能,同时探讨如何通过JWT进行安全认证,确保数据传输的安全性。此外,文章还将简要介绍如何使用Swagger生成API文档,使得API的测试和维护更加便捷。无论你是希望提升现有项目的API设计,还是想从零开始构建一个新项目,本文都将为你提供一条清晰的道路
|
1月前
|
Web App开发 JavaScript 前端开发
使用Node.js和Express构建RESTful API
使用Node.js和Express构建RESTful API
19 0
|
2月前
|
存储 网络协议 安全
POSIX API与网络协议栈
POSIX API与网络协议栈
36 0
|
2月前
|
机器学习/深度学习 人工智能 API
人工智能应用工程师技能提升系列2、——TensorFlow2——keras高级API训练神经网络模型
人工智能应用工程师技能提升系列2、——TensorFlow2——keras高级API训练神经网络模型
33 0
|
2月前
|
NoSQL JavaScript 前端开发
深入浅出:使用Node.js和MongoDB构建RESTful API
在当今的软件开发领域,构建高效、可扩展的Web服务已成为开发者的重要任务之一。本文将引导读者通过现代JavaScript环境——Node.js,搭配流行的NoSQL数据库MongoDB,一步步构建一个RESTful API。不同于常规的摘要,我们将采用故事化的方式,通过一个虚构的应用“BookFinder”的开发旅程,带领读者理解API设计、数据库交互及安全性考量等关键知识点。无论你是前端工程师希望深化后端知识,还是后端新手寻求实践机会,本文都将提供你所需的指南和启示。
|
2月前
|
JavaScript 前端开发 网络协议
轻松搭建远程Node.js服务端,让你的应用在公共网络中畅行无阻!
Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation(原为 Node.js Foundation,已与 JS Foundation 合并)持有和维护,亦为 Linux 基金会的项目。Node.js 采用 Google 开发的 V8 运行代码,使用事件驱动、非阻塞和异步输入输出模型等技术来提高性能,可优化应用程序的传输量和规模。这些技术通常用于资料密集的即时应用程序。