网络数据传递

以node发送一个请求为例

创建 HTTP 请求

应用程序使用 http.request() 方法生成一个 HTTP 请求对象,指定请求的 URL、方法和头部信息。

Node.js 在解析 URL 时会提取主机名和端口等相关信息。如果目标 IP 地址尚未确定,会通过 DNS 解析将主机名转换为 IP 地址。

  1. HTTP 模块发起请求
    • Node.js 应用通过 HTTP 模块发起 HTTP 请求,例如使用 http.request() 方法创建一个 HTTP 请求对象。
  1. Net 模块建立 TCP 连接
    • HTTP 模块通过 Net 模块在传输层建立 TCP 连接。Net 模块提供了 TCP 套接字接口,用于处理底层的网络通信

数据到TCP 层

TCP 对数据进行分段,并为每个数据包添加 TCP 头部信息,包括源端口和目标端口。TCP 还会进行流量控制、拥塞控制等处理,以确保数据的可靠传输。

TCP数据段的格式

  • 源端口号和目标端口号,计算机通过端口号识别访问哪个服务,比如http服务或ftp服务,发送方端口号是进行随机端口,目标端口号决定了接收方哪个程序来接收
  • 32位序列号 TCP用序列号对数据包进行标记,以便在到达目的地后重新重装,假设当前的序列号为 s,发送数据长度为 l,则下次发送数据时的序列号为 s + l。在建立连接时通常由计算机生成一个随机数作为序列号的初始值
  • 确认应答号 它等于下一次应该接收到的数据的序列号。假设发送端的序列号为 s,发送数据的长度为 l,那么接收端返回的确认应答号也是 s + l。发送端接收到这个确认应答后,可以认为这个位置以前所有的数据都已被正常接收。
  • 首部长度: TCP 首部的长度,单位为 4 字节。如果没有可选字段,那么这里的值就是 5。表示 TCP 首部的长度为 20 字节。
  • 控制位 TCP的连接、传输和断开都受这六个控制位的指挥
    • PSH(push急迫位) 缓存区将满,立刻传输速度
    • RST(reset重置位) 连接断了重新连接
    • URG(urgent紧急位) 紧急信号
  • 紧急指针:尽在 URG(urgent紧急) 控制位为 1 时有效。表示紧急数据的末尾在 TCP 数据部分中的位置。通常在暂时中断通信时使用(比如输入 Ctrl + C)
    • SYN(synchronous建立联机) 同步序号位 TCP建立连接时要将这个值设为1
    • ACK(acknowledgement 确认)为1表示确认号
    • FIN发送端完成位,提出断开连接的一方把FIN置为1表示要断开连接
  • 窗口值:说明本地可接收数据段的数目,这个值的大小是可变的。当网络通畅时将这个窗口值变大加快传输速度,当网络不稳定时减少这个值可以保证网络数据的可靠传输。它是来在TCP传输中进行流量控制的
    • 窗口大小:用于表示从应答号开始能够接受多少个 8 位字节。如果窗口大小为 0,可以发送窗口探测。
  • 16位校验和:校验和用来做差错控制,TCP校验和的计算包括TCP首部、数据和其它填充字节。在发送TCP数据段时,由发送端计算校验和,当到达目的地时又进行一次检验和计算。如果两次校验 和一致说明数据是正确的,否则 将认为数据被破坏,接收端将丢弃该数据

UDP数据段格式:

  • UDP是一个无连接、不保证可靠性的传输层协议,也就是说发送端不关心发送的数据是否到达目标主机、数据是否出错等,收到数据的主机也不会告诉 发送方是否收到了数据,它的可靠性由上层协议来保障
  • 首部结构简单,在数据传输时能实现最小的开销,如果进程想发送很短的报文而对可靠性要求不高可以使用

数据段到IP层

经过 TCP 处理后的数据包传递给 IP 层,IP 层为数据包添加 IP 头部信息,包括源 IP 地址和目标 IP 地址。若不知道目标 IP 的 MAC 地址,通常会使用 ARP 协议来获取。

在网络中,每台计算机都有一个唯一的地址,方便别人找到它,这个地址称为IP地址。

  • P地址是一个网络编码,用来确定网络中的一个节点。
  • IP地址是由32位二进制(v4版本)组成,分为网络部分(NETWORK)、主机部分(HOST)

IP地址的分类

  • IP地址的网络部分是由Internet地址分配机构来统一分配的,这样可以保证IP的唯一性。
  • ip地址中全为1的ip即255.255.255.255,它称为限制广播地址,如果将其作为数据包的目标地址可以理解为发送到所有网络的所有主机
  • ip地址中全为0的ip即0.0.0.0,它表示启动时的ip地址,其含义就是尚未未分配时的ip地址
  • 127是用来进行本机测试的,除了127.255.255.255外,其它的127开头的地址都代表本机

因为现网的设备比可用ip地址数的不匹配,所以提出了公有地址和私有地址:

分类 范围
A类私有IP 10.0.0.0 ~ 10.255.255.255
B类私有IP 172.16.0.0 ~ 172.31.255.255
C类私有IP 192.168.0.0 ~ 192.168.255.255

其他范围的IP均为公有IP地址

子网掩码

子网掩码设置可以参考下面路由器和交换机的内容

  • 子网掩码(subnet mask)又叫子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机位的掩码。
  • 子网掩码不能单独存在,它必须结合IP地址一起使用。
  • 子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。
    • 子网掩码也是32个二进制位
    • 对应IP的网络部分用1表示
    • 对应IP地址的主机部分用0表示
  • A B C 三类地址都有自己默认的子网掩码
    • A类 255.0.0.0
    • B类 255.255.0.0
    • C类 255.255.255.0

数据包到数据链路层

数据包传输到数据链路层时,会被封装成帧并根据目标 MAC 地址进行传输。在两个网络实体之间提供数据链路通路的建立、维持和释放的管理,以及如何控制帧在物理信道上的传输,包括如何处理传输差错,如何调节发送速率以使与接收方相匹配。

在数据通信中,每个网络层都有自己的数据格式和协议规范。数据链路层负责将网络层提供的数据包转换为比特流,并在物理介质上传输。因此,数据链路层需要确定数据格式,以便正确地封装和传输数据。

而以太网是一种常见的数据链路层协议,定义了数据帧的格式、地址分配和数据传输规则,是数据链路层中最常用的协议之一。以太网规定了数据帧的结构,包括目标地址、源地址、数据字段和校验字段等,以确保数据在局域网中正确传输。

以太网(Ethernet)是一种计算机常用的局域网技术。以太网使用 MAC 地址进行设备间的唯一标识,数据链路层负责处理 MAC 地址的分配和管理,以确保数据包能够正确传输到目标设备。可以在不同类型的物理介质上运行,如双绞线、光纤等,数据链路层负责将以太网数据帧转换为适合的物理信号进行传输。

MAC地址:

  • 在通信过程中是用内置在网卡内的地址来标识计算机身份的
  • 每个网卡都有一个全球唯一的地址来标识自己,不会重复
  • MAC地址48位的二进制组成,通常分为6段,用16进制表示

以太网帧格式

  • 在以太网链路上的数据包称作以太帧。

数据帧到物理层(网卡)

随后,数据包通过网卡发送到网络中,计算机在传递数据的时候传递的都是0和1的数字,而物理层关心的是用什么信号来表示0和1,网卡会将数据帧转换成电信号并通过物理介质发送。介绍物理层的数字信号编码有两种方式:

  • 非零编码
    • 低电平代表逻辑0,高电平代表逻辑1
    • 优点: 编/译码简单。
    • 缺点: 内部不含时钟信号, 收/发端同步困难。
  • 曼彻斯特编码
    • 用趋势从低到高表示逻辑1,从高到低表示逻辑0
    • 优点是内部自含时钟信息,收/发端容易同步
    • 缺点是编码复杂,占用更多信道

数据帧到达交换机

当数据包到达交换机时,根据 MAC 地址表进行数据包的转发。若目标 IP 不在同一 VLAN,交换机将数据包发送到 VLAN 绑定的路由器接口。

交换机分为傻瓜交换机和可网管交换机,交换机的接口不需要设置ip,使用傻瓜交换机时设备的网关和子网掩码根路由机接口保持一致,同一路由器下设备都在一个子网内,可网管交换机使用vlan进行子网划分,vlan设置时需要绑定一个ip和子网掩码,ip为交换机连接的路由器接口ip,也即该vlan下的网关地址。子网掩码取决于对网络划分的粒度。

设置vlan: vlan 100

进入vlan: interface vlanif vlan100

设置vlan100的ip地址: 192.168.100.1 255.255.255.0/24

对可网管交换机的接口进行vlan绑定,连接接口的设备子网掩码要跟vlan设置的保持一致,一般使用dhcp无需关心ip及子网掩码的设置,如果手动设置需要知道连接vlan的ip和子网掩码

vlan划分子网,将接口绑定已设定的vlan

通过interface 命令进入接口设置:interface GigabiEthernet0/0/1

指定端口类型:port lint-type trunk/access

指定允许通过的端口:port trunk allow-pass vlan all/(vlan名)

查看配置:display this

这时不同vlan间的通过设置的网关ip,经由路由器进行通信。

数据帧到达路由器

路由器根据路由表确定下一跳,根据 NAT 服务替换内网地址为外网地址,并更改源 MAC 地址和目标 MAC 地址,然后将数据包发送到下一跳路由器。

为什么需要nat服务,看下面这个例子

192.168.2.2这台机器如果不配置nat时想要跟192.168.1.1通信,是ping不通的,ping的时候192.168.2.2的消息可以到192.168.1.1,因为192.168.1.2配置了缺省路由下一跳是192.168.1.1。但是192.168.1.1的返回消息时不能再设置自己的缺省路由是192.168.1.2的,因为这样会出现循环。解决方案也有,那就是在192.168.1.1指定回程路由为192.168.1.2。

但是如果是互联网,192.168.1.1是运营商的路由器了,像这样

运营商不会在自己的路由器上指定每个用户的回程路由。这个时候就需要nat服务了。

nat服务是什么

nat服务就是在192.168.2.2的数据到达自己路由器网关时,将数据中的源ip改为端口的220.1.1.2,这样跟运营商的路由器在同一个网段,就可收发消息了。

nat服务怎么配置

配置nat首先需要了解acl,因为nat服务就是在网关的接口中绑定acl

执行如下命令即可

进入配置公网ip的接口视图:

绑定acl: nat outbound 2000

那如何设置acl呢

acl访问控制:

进入acl: acl 2000

设置:rule permit source 192.168.1.0 0.0.0.255(反掩码)----做nat用,允许通过nat出去

这样内网消息中的ip就会转为公网ip,同时保持此次的nat会话,当消息返回时根据nat的会话将消息送达指定计算机。

路由器在转发数据时会更新源设备的 MAC 地址为当前路由器的 MAC 地址,目标mac地址为下一跳路由器的mac地址,因为MAC 地址是数据链路层(第二层)的地址,用于在局域网内唯一标识设备。当数据包通过路由器进入下一个网络时,需要使用下一个网络接口的 MAC 地址来正确传输数据。但ip地址保持不变,因为IP 地址是网络层(第三层)的地址,用于在全局网络中唯一标识设备。IP 地址在路由器之间传递时不会改变,因为它用于路由器之间的路由选择和数据包传输。

这样每经过一个路由器,源设备的 MAC 地址会被更新为当前路由器的 MAC 地址,但 IP 地址保持不变。

最终

数据包到达目标设备,目标路由器根据 NAT 配置获取目标设备的内网 IP 和端口,将数据传递到目标设备。目标设备根据数据包头部的 MAC 地址和 IP 地址解析数据包内容并进行相应处理。

到达目标网关如何找到内网提供服务的计算机

对外提供服务的计算机都会在自己的出口网关上配置nat serve

nat serve是什么

将外网访问的80端口映射到内外192.168.2.100的80端口(www指80端口)

nat serve怎么配置

在ar7的g0/0/0上配置nat serve操作如下

至此,node发出的数据终于到达了目标服务器!欢迎补充指正,轻喷!!

相关推荐
莹雨潇潇10 分钟前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
Jiaberrr18 分钟前
Element UI教程:如何将Radio单选框的圆框改为方框
前端·javascript·vue.js·ui·elementui
Tiffany_Ho1 小时前
【TypeScript】知识点梳理(三)
前端·typescript
安冬的码畜日常2 小时前
【D3.js in Action 3 精译_029】3.5 给 D3 条形图加注图表标签(上)
开发语言·前端·javascript·信息可视化·数据可视化·d3.js
小白学习日记3 小时前
【复习】HTML常用标签<table>
前端·html
丁总学Java3 小时前
微信小程序-npm支持-如何使用npm包
前端·微信小程序·npm·node.js
yanlele3 小时前
前瞻 - 盘点 ES2025 已经定稿的语法规范
前端·javascript·代码规范
懒羊羊大王呀4 小时前
CSS——属性值计算
前端·css
DOKE4 小时前
VSCode终端:提升命令行使用体验
前端