【Linux】网络层、数据链路层、DNS、ICMP协议、NAT技术

​🌠 作者:@阿亮joy.
🎆专栏:《学会Linux》
🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根
在这里插入图片描述

目录

    • 👉网络层👈
      • IP 协议
      • 基本认识
      • 协议头格式
      • 网段划分
      • 特殊的 IP 地址
      • IP 地址的数量限制
      • 私有 IP 地址和公有 IP 地址
      • 路由
      • 路由表生成算法
    • 👉数据链路层👈
      • 基本认识
      • 认识以太网
      • 以太网帧格式
      • 认识 MAC 地址
      • 认识 MTU
      • MTU 对 IP 协议的影响
      • MTU 对 UDP 协议的影响
      • MTU 对于 TCP 协议的影响
      • ARP 协议
    • 👉DNS👈
      • 什么是 DNS
      • hosts 文件
      • 域名的层级关系
      • 域名服务器分类
      • 域名解析过程
    • 👉ICMP 协议👈
      • ICMP 协议的功能
      • ICMP 的报文格式
      • ping 命令
      • traceroute 命令
    • 👉NAT👈
      • NAT 技术背景
      • NAT 转换过程
      • NAPT
      • NAT 技术的缺陷
      • NAT 和代理服务器
    • 👉总结👈

👉网络层👈

IP 协议

应用层主要解决的是如何使用数据的问题,而传输层、网络层和数据链路层三层隐藏网络的细节,将数据可靠从一台主机送到另一台主机。可靠性主要是通过传输层中的 TCP 协议来保证,而网络层中的 IP 协议具有将数据从一台主机送到另一台主机的能力,但仅仅是有非常大的概率能够做到,并不是一定。

在这里插入图片描述

基本认识

  • 主机:配有 IP 地址,但是不进行路由控制的设备。
  • 路由器:即配有 IP 地址,又能进行路由控制。
  • 节点:主机和路由器的统称。
  • 数据并不是从一台主机直接送到另一台主机的,而是传输到路由器,经过路由器根据 IP 地址进行路径选择,然后一跳一条地到达目标主机的。而这个过程就是数据转发的过程。

协议头格式

在这里插入图片描述

如何封装和解包?

IP 报文是由固定的 20 字节的报头、选项字段和数据组成的。当收到一个 IP 报文时,先读取 IP 报文的前 20 个字节,再根据 4 位首部长度来判断该报文是否有选项字段。如果有,则继续读取选项字段。读取完选项字段,这样就完成解包,即报头与有效载荷分离。而当我们有一个 TCP 报文时,我们只需要给 TCP 报文加上选项字段和 IP 报头,即可完成数据的封装。

如何交付(分用)?

IP 报头中的 8 位协议用来标识 UDP 协议和 TCP 协议,读取该字段就能够知道向上交付给 UDP 协议还是 TCP 协议了。

IP 报头的详细介绍

  • 4 位版本号(version):指定 IP 协议的版本,对于 IPv4 来说,就是 4。
  • 4 位首部长度(header length):4 个比特位能够表示的范围是 0(0000)到 15(1111),其单位是 4 字节,也就是说能够表示从 0 到 60 字节。如果 IP 报文没有选项字段,那么 4 位首部长度填写的就是 5(0101)。
  • 8 位服务类型(Type Of Service)3 位优先权字段已经被弃用,4 位 TOS 字段和 1 位保留字段(必须置为0)。4 位 TOS 分别表示:最小延时、最大吞吐量、最高可靠性和最小成本。4 位 TOS 字段表示 IP 报文的转发属性,其中最小延时表示经过转发该报文,不能在路由器上停留太久;而最大吞吐量就是可以对 IP 报文进行一定的累积,以发送更多的数据;最高可靠性就是将该报文转发给可靠性的路径上。这四者相互冲突,只能选择一个。对于 ssh / telnet 这样的应用程序,最小延时比较重要;对于 ftp 这样的程序,最大吞吐量比较重要。
  • 16 位总长度(total length):表示 IP 数据报整体占多少个字节,有效载荷的字节数等于 16 位总长度减去 4 位首部长度 * 4。
  • 8 位生存时间(Time To Live, TTL):数据报到达目的地的最大报文跳数。一般是 64,每次经过一个路由,TTL 就要减 1。如果一直减到 0 还没到达,那么就丢弃该报文,这个字段主要是用来防止出现路由循环。
  • 8 位协议:表示上层协议的类型,即 UDP 协议或 TCP 协议。
  • 16 位头部校验和:使用 CRC 进行校验,来鉴别头部是否损坏。如果校验失败,那么报文会直接被丢弃,上层的 TCP 协议会对该报文进行重传。
  • 32 位源地址和 32 位目标地址:表示发送端和接收端的 IP 地址,可以根据目的 IP 地址选择最优的路径来进行数据包转发。
  • 选项字段:不定长,最多 40字节。
  • 16 位标识(id):唯一的标识主机发送的报文。如果 IP 报文在数据链路层被分片了,那么每一个片里面的这个 id 都是相同的。
  • 3 位标志字段:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。第二位置为 1 表示禁止分片,这时候如果报文长度超过 MTU,IP 模块就会丢弃报文。第三位表示 “更多分片”,如果分片了的话,最后一个分片置为 0,其他是 1,类似于一个结束标记。
  • 13 位分片偏移(framegament offset):是分片相对于原始 IP 报文开始处的偏移,其实就是在表示当前分片在原报文中处在哪个位置。

深入理解 IP 报文的分片

数据链路层由于物理特性的原因,一般无法转发太大的数据,因此数据链路层对转发到网络的报文大小有限制,称之为 MTU(Maximum Transmission Unit,最大传输单元),一般是 1500 字节。如果 IP 报文超过了 MTU,就需要对 IP 报文进行分片。分片的行为是在网络层进行的,同样数据的装置也是在网络层进行的。IP 报文分片和组装的行为,传输层是不知道,也不关心的。

16 位标识(id)是 IP 报文的序号。如果 IP 报文在数据链路层被分片了,那么每一个片里面的这个 id 都是相同的。如果 16 位标识不相同,则说明它们不是同一个 IP 报文。

3 位标志字段中的第一位是保留的,而第二位为 1 表示禁止分片,主要用来探测数据链路层的最大传输单元。第三位表示 “更多分片”,如果分片了的话,最后一个分片置为 0,其他是 1,类似于一个结束标记。

13 位分片偏移(framegament offset)是分片相对于原始 IP 报文开始处的偏移,其实就是在表示当前分片在原报文中处在哪个位置,实际偏移的字节数是这个值 * 8 得到的。

深入理解 IP 报文的组装

想要真正理解 IP 报文的组装,要认识到一下几点:

  • 分片这种行为并不是主流,如果分片了,就会大大增加丢包的概率。
  • 能够从众多报文中识别出哪些是不同的报文,哪些是相同的报文,这个可以通过 16 位标识来区分。不同的报文,标识是不同的。而相同报文的分片,标识是相同的。
  • 能够识别报文是否被分片与是否没有被分片:如果保温没有被分片,那么更多分片标志位位 0 并且 13 位片偏移为 0。 如果更多分片标志位是 1,则表明该报文被分片了。
  • 能够识别出分片是原始报文中的哪一部分:如果更多分片标志位为 1,片偏移为 0,则表示该分片是报文的开始部分。而如果更多分片标志位为 0,片偏移不为 0,则表示该分片是报文的结尾部分。如果更多分片标志位为 1,片偏移不为 0,则表示该分片是报文的中间部分。中间部分的分片可能会有多个,那如何保证收齐了这些分片呢?其实可以根据偏移量进行升序排序,然后扫描全部分片来判断分片是否收齐。因为下一个分片的偏移量等于上一个分片的偏移量 + 上一个分片的大小,如果分片没有收齐,那么一定不符合这个关系,那么中间的分片就一定有丢失的。
  • 异常处理:如果有分片丢失,需要能够识别出来。

在这里插入图片描述

为什么不推荐分片呢?

当一个大的数据包被分成多片时,这无疑是增加了丢包的概率。因为当所有的分片在对方的网络层中收齐,再进行组装后,才能认为收到了这个数据包。如果缺少某一个分片,对方的传输层都需要进行重传,相当于丢包的概率就提高了。因此,非常地不推荐分片。而为了避免分片问题,传输层也有对数据包的大小有限制。

网段划分

由于 IP 地址资源有限,每个国家都会被分配一定的 IP 地址段。划分好 IP 地址后,国际上的路由器都会有着自己的路由表,负责国家和国家之间的路由转发。同样,在一个国家内部,也要对 IP 地址进行划分以及路由器的配置,这样才能完成省和省之间的路由转发。

因为 IP 地址资源是有限的,我们需要对 IP 地址进行划分,那么就有了各种网络划分方案。IP 地址被分为两部分,分别是网络号和主机号。

  • 网络号保证保证相互连接的两个网段具有不同的标识,本质就是表示不同的区域。
  • 主机号:在同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号。
  • 子网其实就是把所有网络号相同的主机放到一起,而路由器则是局域网内的第一天主机,将不同的子网连接起来,能够进行不同子网的路由转发。
  • 如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中的其他主机重复。
  • 在进行路由转发时,网络号是在不断地变大,并且收敛的,直至找到目标主机所在的区域。
  • 将 IP 地址分为网络号和主机号的原因是:方便定位一台主机,提高查找的效率。

在这里插入图片描述

通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的 IP 地址都不相同。那么问题来了,手动管理子网内的 IP,是一个相当麻烦的事情。

动态主机配置协议(Dynamic Host Configuration Protocol,简称 DHCP)是一种计算机网络协议,它用于在网络中自动分配 IP 地址和其他网络配置参数,以便网络设备(如计算机、手机、打印机等)能够在加入网络时获得所需的网络配置信息。DHCP 能够简化网络管理,使得设备的连接和配置更加便捷。

DHCP 协议的优势在于它简化了网络中的 IP 地址管理,减轻了网络管理员的负担,并且使设备的添加和移除更加灵活和方便。同时,DHCP 也支持 IP 地址重用,即设备离开网络后,它分配的 IP 地址可以被其他设备再次使用,充分利用 IP 地址资源。

一般的路由器都带有 DHCP 功能. 因此路由器也可以看做一个 DHCP 服务器。当设备加入网络时,它会向路由器发送一个 DHCP 请求,请求一个可用的 IP 地址。

分类划分法

过去曾经提出一种划分网络号和主机号的方案,把所有 IP 地址分为五类。如下图所示:

在这里插入图片描述

  • A 类:0.0.0.0 到 127.255.255.255
  • B 类:128.0.0.0 到 191.255.255.255
  • C 类:192.0.0.0 到 223.255.255.255
  • D 类:224.0.0.0 到 239.255.255.255
  • E 类:240.0.0.0 到 247.255.255.255

随着 Internet 的飞速发展,这种划分方案的局限性很快显现出来。大多数组织都申请 B 类网络地址,导致 B 类地址很快就分配完了,而 A 类却浪费了大量地址。例如:申请了一个 B 类地址,理论上一个子网内能允许 6 万 5 千多个主机,A 类地址的子网内的主机数更多。然而实际网络架设中,不会存在一个子网内有这么多的情况,因此大量的 IP 地址都被浪费掉了。

针对这种情况提出了新的划分方案,称为 CIDR。

CIDR,即无类别域间路由(Classless Inter-Domain Routing),是一种 IP 地址的编址和路由选择方案,用于有效地管理和分配 IPv4 地址空间。CIDR 取代了传统的基于类别的 IP 地址分配,使网络管理员可以更灵活地规划和分配 IP 地址,从而更有效地利用 IP 地址资源。

CIDR 采用了前缀长度表示法,将 IP 地址分成两部分:网络前缀和主机号。在 CIDR 中,IP 地址的前缀长度用斜线后面的数字表示,例如,/24 表示前 24 位为网络前缀,后 8 位为主机号。这样,CIDR 允许网络管理员根据实际需求灵活地规划 IP 地址,将 IP 地址划分成更小的子网,避免了过多的 IP 地址浪费。

CIDR 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号。子网掩码也是一个 32 位的正整数,通常用一串 “0” 来结尾。将 IP 地址和子网掩码进行 “按位与” 操作,得到的结果就是网络号。网络号和主机号的划分与这个 IP 地址是 A 类、B 类还是 C 类无关。

在这里插入图片描述
可见 IP 地址与子网掩码做与运算可以得到网络号,主机号从全 0 到全 1 就是子网的地址范围。IP 地址和子网掩码还有一种更简洁的表示方法,例如 140.252.20.68/24,表示 IP 地址为 140.252.20.68,子网掩码的高 24 位是 1,也就是 255.255.255.0。

因为路由器至少要连接两个不同的子网,而每个网络的网络号是不同的,那么每个路由器都需要给自己直接连接的网络配置对应的子网掩码。有了子网掩码,给不同的路由器配置不同位数的子网掩码,也就能够看到不同的网络号了。那么,只需要将目的 IP 地址与路由器子网掩码进行按位与操作,就能够得到该报文要去的目的网络了。

特殊的 IP 地址

  • 将 IP 地址中的主机地址全部设为 0,就成为了网络号,代表这个局域网。
  • 将 IP 地址中的主机地址全部设为 1,就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包。
  • 127.0.0.1 表示本地回环地址,用于测试网络接口是否正常工作。

IP 地址的数量限制

我们知道,IP 地址(IPv4)是一个 4 字节 32 位的正整数。 那么一共只有 2 的 32 次方个 IP 地址,大概是 43 亿左右。 而 TCP / IP 协议规定,每个主机都需要有一个 IP 地址。

这意味着,一共只有 43 亿台主机能接入网络么?实际上,由于一些特殊的 IP 地址的存在,数量远不足 43 亿。另外 IP 地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个 IP 地址。

CIDR 在一定程度上缓解了 IP 地址不够用的问题,提高了利用率,减少了浪费。但是 IP 地址的绝对上限并没有增加, 仍然不是很够用,这时候有三种方式来解决:

  • 动态分配 IP 地址:只给接入网络的设备分配 IP 地址。因此同一个 MAC 地址的设备,每次接入互联网中得到的 IP 地址不一定是相同的。
  • NAT 技术:网络地址转换(Network Address Translation)用于解决 IPv4 地址短缺问题以及增强网络安全性。NAT 技术通过在网络边界设备上进行 IP 地址的映射和转换,将内部网络(私有网络)中的设备使用少量的公网 IP 地址来访问互联网。
  • IPv6:IPv6 并不是 IPv4 的简单升级版,这是互不相干的两个协议,彼此并不兼容。IPv6 用 16 字节 128 位来表示一个 IP 地址,能够让地球上的每一粒沙子都能有自己的 IP 地址,但是目前 IPv6 还没有完全普及。

私有 IP 地址和公有 IP 地址

如果一个组织内部组建局域网,IP 地址只用于局域网内的通信,而不直接连到 Internet上。理论上使用任意的 IP 地址都可以,但是 RFC 1918 规定了用于组建局域网的私有 IP 地址。

  • 10.*,前 8 位是网络号,共 16777216 个地址。

  • 172.16.172.31.,前 12 位是网络号,共 1048576 个地址。

  • 192.168.*,前 16 位是网络号,共 65536 个地址。

  • 包含在这个范围中的 IP 地址,都成为私有 IP,其余的则称为全局 IP 或公网 IP。

私有 IP 地址用于局域网内部,不会直接在公共互联网上使用。当设备从局域网连接到互联网时,私有 IP 地址会通过网络地址转换(NAT)技术转换为公有 IP 地址,使得设备可以与互联网上的其他设备进行通信。云服务器的私有 IP 地址可以通过ifconfig命令来查看。

如果我家要上网,我该做什么?

  • 确保运营商在我家附近有网络覆盖。
  • 联系运行商进行光纤入户,光纤入户是指将光纤网络的连接点延伸到用户家庭或办公室内部。
  • 工作人员上门安装调制解调器和无线路由器。调制解调器是一种用于将数字信号转换为模拟信号和将模拟信号转换为数字信号的设备。
  • 开户获得账号和密码,然后配置路由器的账号和密码,该账号密码是运行商认证我家的密码。再然后配置 WIFI 名称和密码,这密码是认证人的,只要通过密码认证就能够上网了。
  • 正常上网,按期付费。

我们上网并没有给互联网公司交钱,而是给运行商交钱,为什么呢?

基础设施是运营商铺设的,你的上网转发的数据包都要经过运营商,都要使用他们架设的基站、网线等等,这样我们的上网需求才能够转发到互联网的机房里。因此,只要你要上网,就要给运营商交钱。不交钱的话,就没法上网。

为什么我们访问不了 Google、Facebook、YouTube 等网站呢?

因为我们国家是有墙的,其学术名称为防火长城(Great Firewall,GFW)。当你以www.google.com的方式来访问谷歌时,运营商可以直接不给你提供域名解析服务。或者当你直接使用公网 IP 地址的方式来访问谷歌,运营商识别出来可以直接拦截你的请求。

深入认识局域网

在这里插入图片描述

  • 一个路由器可以配置两个 IP 地址,一个是 WAN(Wide Area Network)口 IP,另一个是 LAN(Local Area Network)口 IP(子网 IP)。
  • WAN 口 IP 是指连接到广域网(WAN)或互联网的网络接口的 IP 地址。这个 IP 地址是由互联网服务提供商(ISP)分配给您的路由器或网关设备的,用于连接到互联网并与其他公共网络通信。
  • LAN 口 IP 是指连接到本地区域网络(LAN)的网络接口的 IP 地址。这个 IP 地址通常由路由器在内部网络中自动分配给各个连接到路由器的设备。
  • 路由器 LAN 口连接的主机,都从属于当前这个路由器的子网中。
  • 不同的路由器,子网 IP 其实都是一样的(通常都是192.168.1.1)。子网内的主机 IP 地址不能重复,但是子网之间的 IP 地址就可以重复了。这样,IPv4 地址不足的问题就能够大大地缓解了。只要发放一个公网 IP 组建一个局域网,局域网内部的主机就使用子网 IP 来表示即可。
  • 同一个局域网内的两台主机能够直接通信。
  • 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点。这样的运营商路由器可能会有很多级,最外层的运营商路由器的 WAN 口 IP 就是一个公网 IP 了。
  • 子网内的主机需要和公网进行通信时,路由器将 IP 首部中的 IP 地址进行替换,替换成 WAN 口 IP。这样逐级替换,最终数据包中的 IP 地址成为一个公网 IP,这种技术称为 NAT(Network Address Translation,网络地址转换)。
  • 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有公网 IP 的服务器上。

访问公网的过程

假设我们主机的 IP 地址是192.168.1.201,要访问的服务器的 IP 地址是122.77.241.3。我们将上网请求交给家用路由器,家用路由器发现我们要访问的 IP 地址是122.77.241.3,就将这个网络请求交给最外层的运行商路由器,这样网络请求就到达了公网。然后运行商路由器发现目的 IP 是122.77.241.3,最后就将该网络请求转发给这台服务器了。需要注意的是,每经过一个运营商的内网路由器时,都要将报文中的源 IP 地址替换成该路由器的 WAN 口 IP。当报文出现在公网上,就不再需要做替换了。

在这里插入图片描述

当服务器处理完网络请求后,服务器似乎只能够将响应转发给最外层的路由器,无法将响应转发给用户的主机。但并不是这样的,这个需要我们知道后面的内容才能够了解清楚。

路由

路由过程是指在计算机网络中,数据包从源设备发送到目标设备的过程,其中涉及到多个网络设备(如路由器和交换机)的协作工作,以确保数据包能够正确地从源地址到目标地址进行传输。路由的过程,就是这样一跳一跳(Hop by Hop) “问路” 的过程。所谓 “一跳” 就是数据链路层中的一个区间,具体在以太网中指从源 MAC 地址到目的 MAC 地址之间的帧传输区间。

在这里插入图片描述
以下就是路由的详细过程:

  • 数据包生成:路由过程的第一步是数据包的生成。当源设备(如计算机或服务器)需要向目标设备发送数据时,它会将数据组装成数据包,并在数据包的首部添加必要的网络信息,如源 IP 地址、目标 IP 地址、端口号等。

  • 网络层路由选择:在数据包生成后,源设备需要确定数据包的下一跳路径,即确定如何将数据包发送到目标设备。这个过程由网络层的路由选择算法完成。路由选择算法考虑多个因素,如目标 IP 地址、网络拓扑结构、路由器之间的链路状态、路由器的转发策略等,来选择最佳的下一跳路由器。

  • 下一跳路由器:根据路由选择算法的结果,源设备将数据包发送给下一跳路由器,通常是源设备连接的默认网关或下一跳路由器的 IP 地址。

  • 路由器转发:下一跳路由器接收到数据包后,会根据自己的路由表,确定下一跳路径,并将数据包转发给下一个路由器。这个过程会在一系列的路由器之间逐跳进行,直到数据包到达目标设备所在的局域网。

  • 局域网交换:当数据包到达目标设备所在的局域网时,它会发送到目标设备的 MAC 地址。这个过程由交换机完成,交换机会根据数据包中的目标 MAC 地址,将数据包交付给正确的目标设备。

  • 目标设备接收:最后,目标设备接收到数据包,将数据包解析,提取出其中的数据,并进行相应的处理。如果有需要,目标设备还会向源设备发送响应。

简单来说,IP 数据包的传输过程和问路的过程是一样的。当 IP 数据包到达路由器时,路由器会先查看目的 IP。然后路由器才会决定这个数据包是能直接发送给目标主机还是需要发送给下一个路由器,如此反复,一直达到目标 IP 所在的局域。

那么如何判定当前这个数据包该发送到哪里呢?这个就依靠每个节点内部维护一个路由表。

在这里插入图片描述

  • 路由表可以使用route命令查看。
  • 如果目的 IP 命中了路由表,就直接转发即可。
  • 当目的地址与路由表中其它行都不匹配时,就按默认网关条目规定的接口发送到下一跳地址。

在这里插入图片描述

路由表的 Destination 是目的网络地址,Genmask 是子网掩码,Gateway 是下一跳地址,Iface 是发送接口,Flags 中的 U 标志表示此条目有效(可以禁用某些条目),G 标志表示此条目的下一跳地址是某个路由器的地址,没有 G 标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。

当要发送数据包时,先拿数据包的目的 IP 地址和路由表条目中的子网掩码进行按位与,得到目的网络,然后和 Destination 进行对比。如果相同,则从该条目的发送接口发送出去。如果不相同,则和下一个条目进行一样的操作。如果一直都不相同,则需要经路由器转发。

路由表生成算法

路由表可以由网络管理员手动维护(静态路由),也可以通过一些算法自动生成(动态路由)。路由表相关的生成算法:距离向量算法、LS 算法、Dijkstra 算法等。

总结

在这里插入图片描述
IP 协议只是依据目的 IP 地址、子网划分、路由表查找与路由算法提供了数据转发的策略,并没有实现设备转发的具体功能。具体的设备转发就是局域网内数据转发的问题,这是由下一层数据链路层来解决的。

👉数据链路层👈

在这里插入图片描述

基本认识

  • 要将数据从一台主机送到另一台主机,需要路由器一跳一跳将数据进行转发。
  • 能够将数据交付给下一跳路由器的前提是下一跳路由器和我在同一个局域网内。
  • 每一跳的过程,本质就是局域网内数据的转发。
  • 数据链路层就是要解决局域网内数据转发的问题的,只要解决了这个问题,数据就能够从一条主机送到另一台主机了。

认识以太网

  • 以太网不是一种具体的网络,而是一种技术标准,既包含了数据链路层的内容,也包含了一些物理层的内容。例如:规定了网络拓扑结构,访问控制方式,传输速率等。
  • 例如以太网中的网线必须使用双绞线,传输速率有 10M、 100M、1000M 等。
  • 以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网、无线 LAN 等。

以太网帧格式

在这里插入图片描述

  • 源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是 48 位,是在网卡出厂时固定的,用于在数据链路层标识主机的唯一性。
  • 目标 MAC 地址(Destination MAC Address):6 个字节,表示数据帧的目标设备的物理地址(MAC 地址)。目标MAC地址指示了数据帧应该被发送到局域网中的哪个设备。
  • 源 MAC 地址(Source MAC Address):6 个字节,表示数据帧的发送设备的物理地址(MAC 地址)。源 MAC 地址指示了数据帧的发送者是谁。
  • 帧协议类型字段有三种值,分别对应 IP、ARP、RARP。
  • 数据(Data):46 - 1500个字节,表示上层协议的数据部分,如 IP 数据包等。
  • 帧末尾是 CRC 校验码,用于检测数据帧在传输过程中是否发生错误。

如何封装和解包?

接收上层传递的数据包时,需要给数据包添加上帧首部和帧尾部,其中帧首部包括目的 MAC 地址、源 MAC 地址和类型,帧尾部就是 CRC 校验码,封装好后,传递给物理层。接收到物理层传递上来的数据帧时,去掉固定长度的帧首部和帧尾部就可以完成报头与有效载荷的分类,对相关字段解析完后,将数据传递给网络层进行解析和处理。

如何交付?

读取帧首部中的类型字段,根据类型字段决定交给给哪一个上层。

重谈局域网原理

在这里插入图片描述
在这里插入图片描述
如上图所示,当主机 B 要发送数据给主机 C 时,主机 B 会在网络层查找自己的路由表,发现要先将数据交给路由器 F,那么主机 B 就构建数据帧发送到局域网内。路由器 F 经过对比,发现数据帧是发送给自己的,然后进行解包并向上交付给网络层。如此反复,数据最终就够一跳一跳地从主机 B 送到主机 C 了。

如果局域网中有多台主机同时都在发送数据,此时就会发生数据碰撞问题。数据发生碰撞后,数据就无法使用了。当发生数据碰撞问题时,所有主机都能够检查出来。因此,发送数据碰撞时,所有发送数据帧的主机都要执行碰撞避免算法,也就是等待随机事件,然后再重新发送。

局域网中主机越多越好还是越少越好?

局域网中主机肯定是越少越好,如果主机越来越多的话,局域网中发送数据碰撞的概率就会越来越大。

那如果局域网内的主机真的很多,怎么办呢?那么就需要在局域网中引入交换机,将局域网划分为不同的碰撞域。如下图所示:

在这里插入图片描述

  • 当 H1 想给 H4 发送数据帧时,交换机识别出来 H1 和 H4 都在交换机的左半部分,那么数据帧就不会被扩散到交换机的右半部分,,因此就降低了发生数据碰撞的可能性。
  • 当 H1 想给 H6 发送数据帧时,交换机就会直接将数据帧发送给 H6,并不会发送给其他的主机。

局域网中发送的数据帧是越长越好还是越短越好呢?

在局域网中发送的数据帧,一般来说,较短的数据帧会更好。较短的数据帧具有以下优点:

  • 传输效率:较短的数据帧传输时间较短,能够更快地从发送端传输到接收端,提高了传输效率。在数据量相同的情况下,较短的数据帧能够更快地完成传输,从而减少了传输时间和延迟。
  • 降低碰撞概率:较短的数据帧在传输过程中碰撞的概率较低。在共享介质的局域网中(如以太网的双绞线),当多个设备同时发送数据帧时,可能会发生碰撞。较短的数据帧传输时间较短,碰撞的机会更小,从而减少了碰撞的发生。

然而,数据帧也不能过短,因为过短的数据帧会导致网络利用率降低。过短的数据帧会导致网络利用率降低,因为在传输过程中,帧头和帧尾部的开销相对较多,而实际携带的有效数据较少。

认识 MAC 地址

  • MAC 地址(Media Access Control Address)是数据链路层中用于标识网络设备的唯一物理地址。每个网络适配器(网卡)都会被分配一个唯一的 MAC 地址,它由 48 位二进制数(通常用十六进制表示)组成。MAC 地址是设备出厂时硬件固定的,无法修改。
  • 虚拟机中的 MAC 地址不是真实的 MAC 地址,可能会冲突,也有些网卡支持用户配置 MAC地址。
  • MAC 地址的格式通常以六组十六进制数字表示,用冒号分隔,例如:00:1A:2B:3C:4D:5E
  • MAC 地址在局域网内用于数据链路层的寻址和通信。在局域网中,当一个设备要向另一个设备发送数据帧时,会使用目标设备的 MAC 地址来确定数据帧的接收者。
  • IP 地址描述的是路途总体的起点和终点,MAC 地址描述的是路途上的每一个区间的起点和终点。因此在网络转发的过程中,数据包的 IP 地址是不变的(不考虑 NAT 的话),而 MAC 帧报头会一直发生变化。

认识 MTU

MTU是最大传输单元(Maximum Transmission Unit)的缩写,指的是据链路层可以一次性传输的最大数据包大小。

  • 以太网帧中的数据长度规定最小 46 字节,最大 1500 字节,ARP 数据包的长度不够 46 字节,要在后面补填充位。
  • 最大值 1500 称为以太网的最大传输单元(MTU),不同的网络类型有不同的 MTU。
  • 如果一个数据包从以太网路邮到拨号链路上,数据包长度大于拨号链路的 MTU 了,则需要对数据包进行分片(fragmentation)。
  • 不同的数据链路层标准的 MTU 是不同的。

MTU 对 IP 协议的影响

由于数据链路层 MTU 的限制,对于较大的 IP 数据包要进行分包。

  • 将较大的 IP 包分成多个小包,并给每个小包打上标签。
  • 每个小包 IP 协议头的 16 位标识(id)都是相同的。
  • 每个小包的 IP 协议头的 3 位标志字段中,第 2 位置为 0 表示允许分片,第 3 位来表示结束标记,当前是否是最后一个小包,是的话置为 0,否则置为 1。
  • 到达对端时再将这些小包,会按顺序重组,拼装到一起返回给传输层。
  • 一旦这些小包中任意一个小包丢失,接收端的重组就会失败,但是 IP 层不会负责重新传输数据。那么是否会重传数据就取决于传输层采用的是 TCP 协议还是 UDP 协议了,如果是 TCP 协议就会进行重传,而如果是 UDP 协议,那么数据就会真的丢失了。

在这里插入图片描述
在这里插入图片描述

MTU 对 UDP 协议的影响

  • 一旦 UDP 携带的数据超过 1472(1500 - 20(IP 首部) - 8(UDP首部)),那么就会在网络层分成多个 IP 数据报。
  • 这多个 IP 数据报有任意一个丢失,都会引起接收端网络层重组失败。那么这就意味着,如果 UDP 数据报在网络层被分片,整个数据被丢失的概率就大大增加了。

MTU 对于 TCP 协议的影响

  • TCP 的一个数据报也不能无限大,还是受制于 MTU。TCP 的单个数据报的最大消息长度,称为 MSS(Max Segment Size)。
  • TCP 在建立连接的过程中, 通信双方会进行 MSS 协商。
  • 最理想的情况下,MSS 的值正好是在 IP 不会被分片处理的最大长度,这个长度仍然是受制于数据链路层的 MTU。
  • 双方在发送 SYN 的时候会在 TCP 头部写入自己能支持的 MSS 值。
  • 然后双方得知对方的 MSS 值之后,选择较小的作为最终 MSS。
  • MSS 的值就是在 TC P首部的 40 字节变长选项 kind=2 中。
  • 常见的 MSS 值是 1460 字节,因为通常的以太网链路的 MTU 是 1500 字节,减去 IP 头部(20 字节)和 TCP 头部的开销(20字节)就得到了 MSS 值。

在这里插入图片描述

ARP 协议

ARP 协议的作用

在局域网通信中,发送方需要知道目标设备的 MAC地址才能发送数据帧。但通常情况下,发送方只知道目标设备的 IP 地址,而不知道其对应的 MAC 地址。如果不知道目标设备的 MAC 地址,就无法封装数据帧了。这时,就需要使用 ARP 协议了。

ARP 协议不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议。其主要用于将 IP 地址转换为 MAC 地址,以便在局域网中进行通信。ARP 协议的主要功能是解决局域网设备之间的地址映射问题,从而实现数据包的传输。

ARP 数据报的格式

在这里插入图片描述

  • 源 MAC 地址、目的 MAC 地址在以太网首部和 ARP 请求中各出现一次,这种情况并不在是多余的。因为 ARP 层是在 MAC 层之上的。

  • 硬件类型(Hardware Type):2 字节,指定链路层网络的类型,例如以太网是 1。

  • 协议类型(Protocol Type):2 字节,指定网络层协议的类型,例如 IPv4 是 0x0800。

  • 硬件地址长度(Hardware Address Length):1 字节,表示硬件地址的长度,以字节为单位。以太网地址长度是 6。

  • 协议地址长度(Protocol Address Length):1 字节,表示网络层协议地址的长度,以字节为单位。IPv4 地址长度是 4。

  • 操作码(Operation Code):2 字节,1 表示 ARP 请求,2 表示 ARP 应答。

  • 发送方硬件地址(Sender Hardware Address):6 字节,发送方的 MAC 地址。

  • 发送方协议地址(Sender Protocol Address):4 字节,发送方的 IP 地址。

  • 目标硬件地址(Target Hardware Address):6 字节,目标的 MAC 地址,在 ARP 请求中通常为空。

  • 目标协议地址(Target Protocol Address):4 字节,目标的 IP 地址。

ARP 协议的工作流程

在这里插入图片描述

  • ARP 请求:当发送方需要目标设备的 MAC 地址时,会在局域网中广播一个 ARP 请求数据包。该数据包包含了发送方的 IP 地址和 MAC 地址,以及目标设备的 IP 地址。ARP 请求的目标 MAC 地址设置为广播地址(全 FF:FF:FF:FF:FF:FF),使得所有设备都能收到该请求。

  • ARP 响应:接收到 ARP 请求的设备会检查请求中的目标IP地址,如果与自己的 IP 地址匹配,就会发送一个 ARP 响应数据包。该响应包含了自己的 IP 地址和 MAC 地址,作为响应发送方的回应。ARP 响应是点对点的,只会发送给请求方。

  • 地址缓存:发送方收到 ARP 响应后,会将目标 IP 地址和对应的 MAC 地址建立映射关系,并将其存储在本地的地址缓存中。这样,发送方以后就可以直接使用目标设备的 MAC 地址进行通信,而无需再进行 ARP 请求。

  • 构建 ARP 请求与应答随时可能在路由的过程中发生。

  • 每台主机都维护一个 ARP 缓存表,无需再次进行 ARP 请求和响应,从而提高通信性能和效率。该缓存表可以用arp -a命令查看。缓存表中的表项有过期时间,一般为 20 分钟。如果 20 分钟内没有再次使用某个表项,则该表项失效,下次还要发 ARP 请求来获得目的主机的硬件地址。

  • ARP 缓存表中的表项为什么要有过期时间,而不是一直有效。在网络中,设备的 IP 地址和 MAC 地址映射可能会随着设备的加入、离开或移动而发生变化。如果 ARP缓存表中的映射一直有效,就无法及时反映这些变化,可能导致通信出现问题。 ARP 缓存表是有限资源,如果表中的映射一直有效,可能会占用大量的资源。通过设置过期时间,可以释放不再需要的映射,从而优化资源利用。

  • 在局域网内,可以使用向所有可能的 IP 地址发起 ping 请求,以构建 ARP 缓存。

通过 ARP 欺骗实现中间人攻击

ARP欺骗(ARP Spoofing)是一种恶意攻击技术,也被称为 ARP 缓存投毒攻击,它利用 ARP 协议的工作方式漏洞,通过发送虚假的 ARP 响应来篡改网络设备的 IP 地址与 MAC 地址之间的映射关系。这种攻击旨在使攻击者能够拦截、篡改或重定向网络通信流量,从而窃取敏感信息、进行中间人攻击或干扰网络通信。

攻击者发送虚假的 ARP 响应,欺骗目标设备将攻击者的 MAC 地址与目标 IP 地址关联。这会导致目标设备在发送数据包时将其发送到攻击者的 MAC 地址。通过欺骗双方通信的两个设备,攻击者可以将自己置于通信路径中,实现中间人攻击。攻击者可以拦截、篡改或窃取双方之间的通信内容,从而获取敏感信息。

在这里插入图片描述

👉DNS👈

什么是 DNS

DNS,全称 Domain Name System,即域名系统,用于将易于记忆的域名)转换为与之对应的 IP 地址。域名解析服务使用的是 UDP 协议的 53 号端口,DNS 协议是应用层协议。

当用户在浏览器输入域名的时候,会自动查询 DNS 服务器, 由 DNS 服务器检索数据库,得到对应的 IP 地址。当获得对应的 IP 地址后,浏览器回将域名解析的结果缓存起来,避免重复的解析工作。

hosts 文件

/etc/hosts文件是一个文本文件,用于将主机名(或域名)映射到对应的 IP 地址,实现本地域名解析。这个文件允许你在不依赖于 DNS 服务器的情况下,将特定的域名与 IP 地址关联起来。

在这里插入图片描述

域名的层级关系

域名的层级关系是指域名在 DNS 中的分层结构。域名系统采用类似于文件系统的层次结构,将域名划分为不同的层级,从根域名开始,逐级向下分解,直到最底层的主机名。

  • 根域名(Root Domain):根域名是域名层次结构的最顶层,它没有子域名,用一个点(.)表示。根域名服务器是全球分布的一组特殊 DNS 服务器,负责存储顶级域名服务器的地址信息,帮助启动域名解析的迭代过程。

  • 顶级域名(Top-Level Domain,TLD):顶级域名位于根域名下一级,通常表示不同的域名类别或国家或地区。例如,.com、.org、.net 是通用顶级域名,而国家顶级域名如.cn(中国)、.uk(英国)表示特定国家或地区。

  • 二级域名(Second-Level Domain):二级域名位于顶级域名之下,通常用来标识组织、公司或个人。例如,在域名 www.baidu.com 中,“baidu” 就是二级域名。

  • 三级域名(Third-Level Domain):三级域名位于二级域名之下,用来更细分特定部门、服务或主题。例如,在域名 www.baidu.com 中,“www” 就是三级域名。

  • 主机名(Host Name):主机名是域名的最底层,它通常指代特定的计算机或服务器。例如,在域名 www.baidu.com 中,“www” 是主机名。

域名服务器分类

  • 根域名服务器(Root DNS Servers):根域名服务器是 DNS 层次结构的最顶层,它们存储了顶级域名服务器的地址信息。根域名服务器的数量很少,它们分布在世界各地,由一些组织和机构管理。根域名服务器并不直接负责解析具体的域名,而是指向顶级域名服务器,帮助解析查询的迭代过程开始。

  • 顶级域名服务器(TLD DNS Servers):顶级域名服务器管理顶级域名(例如.com、.org、.net等)下的授权域名服务器。每个顶级域名都有对应的顶级域名服务器,负责管理该顶级域名下的权威域名服务器和域名记录。顶级域名服务器会告知查询请求者下一步应该去询问哪个权威域名服务器。

  • 权威域名服务器(Authoritative DNS Servers):权威域名服务器负责管理特定域名下的 DNS 记录。

  • 本地域名服务器(Local DNS Servers):本地域名服务器也称为递归域名服务器,通常由互联网服务提供商(ISP)或企业提供。它们负责处理终端用户发起的 DNS 查询。当用户请求解析一个域名时,本地域名服务器会从根域名服务器开始,通过迭代查询的方式逐级向下查找,直到找到负责该域名的次级域名服务器,并将结果缓存以提高查询效率。

域名解析过程

  • 用户在浏览器中输入 www.baidu.com 的域名,浏览器首先看一下自己的缓存中有没有。如果没有就向操作系统的缓存要,还没有就检查本地域名解析文件 /etc/hosts。如果还是没有,就会向 DNS 服务器查询。
  • 客户端首先会发送一个 DNS 请求,问 www.baidu.com 的 IP 地址是什么,并发送给本地域名服务器。
  • 本地域名服务器收到客户端的请求后,如果在缓存里能找到 www.baidu.com,则它直接返回其对应的 IP 地址。如果没有,本地域名服务器就会去问根域名服务器。根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
  • 根域名服务器收到本地域名服务器的请求后,发现顶级域名是 .com,根域名服务器则返回顶级域 .com 顶级域名服务器地址。
  • 本地域名服务器收到顶级域名服务器的地址后,则会顶级域名服务器发起 www.baidu.com 的域名解析请求。此时,顶级域名服务器就会给本地域名服务器返回二级域 .baidu.com 的权威域名服务器地址。
  • 本地域名服务器就又向权威域名服务器发起域名解析请求,权威域名服务器查询后将 www.baidu.com 的 IP 地址返回给本地域名服务器。
  • 本地域名服务器再将 IP 地址返回给客户端,客户端与目标建立连接,并设置相应的缓存。

👉ICMP 协议👈

ICMP(Internet Control Message Protocol,互联网控制消息协议)是一种网络层协议,用于在 IP 网络上传递错误消息、诊断信息和操作性消息。

ICMP 协议的功能

  • 错误报告: ICMP 最常见的用途之一是传递有关通信问题的错误报告。例如,当 IP 数据包无法到达目标主机或网络时,ICMP 会生成目标不可达消息,通知发送者发生了错误。

  • 回显和回复: ICMP 还包括回显请求和回显应答消息,通常用于诊断网络连接和测量往返时间(Round-Trip Time,RTT)。其中,发送主机发送一个回显请求消息,接收主机收到后会立即发送回一个相应的回显应答消息,以表示连接正常。
    在这里插入图片描述

ICMP 的报文格式

在这里插入图片描述
ICMP 报文大概分为两类报文,分别为通知出错原因的报文和用于诊断查询的报文。

在这里插入图片描述

ping 命令

ping 是一个用于测试网络连通性的命令行工具,通常用于检测目标主机是否在线以及计算网络往返时间(Round-Trip Time,RTT)。ping 命令发送 ICMP 回显请求(Echo Request)消息到目标主机,并等待目标主机返回 ICMP 回显应答(Echo Reply)消息,从而测量网络延迟和检查主机的可达性。

在这里插入图片描述

以下是 ping 命令的用法和选项:

ping [option] <host>
  • -c <count>:指定发送的回显请求次数。默认为无限次。
  • -i <interval>:设置发送回显请求的时间间隔(秒)。
  • -s <size>:设置回显请求消息的数据部分大小(字节)。
  • -t <ttl>:设置生存时间(Time-to-Live,TTL)字段,表示报文在网络中可以传递的最大跃点数。
  • -q:以简化输出模式显示结果,只显示统计信息。
  • -v:显示详细的命令执行过程。
  • -4:仅使用 IPv4。
  • -6:仅使用 IPv6。

在这里插入图片描述
在这里插入图片描述
telnet 是 23 端口,ssh 是 22 端口, 那么 ping 是什么端口呢?千万要注意,ping 命令基于 ICMP协议的,是在网络层。而端口号是传输层的内容,在 ICMP 协议中根本就不关注端口号这样的信息。

traceroute 命令

traceroute 是一个用于跟踪数据包在网络中的路径的命令行工具,其也是基于 ICMP 协议实现的。traceroute 显示每个数据包的往返时间(Round-Trip Time,RTT),以及经过的中间节点的IP地址,帮助用户了解数据包从源主机到目标主机的网络路径。

以下是 traceroute 命令的用法和选项:

traceroute [options] <host>
  • -n:以 IP 地址而不是主机名显示路由器的信息。
  • -q :每个 TTL 值发送的查询数量,默认为 3 个。
  • -m <max_ttl>:设置最大 TTL 值,即查询的最大跳数。
  • -w :设置每个查询的超时时间(毫秒)。

👉NAT👈

NAT 技术背景

IPv4 协议存在 IP 地址数量不充足的问题,NAT 技术当前解决 IP 地址不够用的主要手段,是路由器的一个重要功能。

  • NAT 能够将私有 IP 对外通信时转为全局 IP,也就是就是一种将私有 IP 和全局 IP 相互转化的技术方法。
  • 很多学校、家庭、公司内部采用每个终端设置私有 IP,而在路由器或必要的服务器上设置全局 IP。
  • 全局 IP 要求唯一, 但是私有 IP 不需要。在不同的局域网中出现相同的私有 IP 是完全不影响的,这样就大大缓解了 IP 地址不足的问题。

NAT 转换过程

在这里插入图片描述

  • NAT 路由器将源地址从 10.0.0.10 替换成全局的 IP 202.244.174.37。
  • NAT 路由器收到外部的数据时,又会把目标 IP 从 202.244.174.37 替换回 10.0.0.10。
  • 在 NAT 路由器内部,有一张自动生成的,用于地址转换的表。
  • 当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系。

NAPT

那么问题来了,如果局域网内有多个主机都访问同一个外网服务器,那么服务器返回的数据中的目的 IP 都是相同的. 那么 NAT 路由器如何判定将这个数据包转发给哪个局域网的主机?这时候 NAPT 来解决这个问题了,使用 IP + port 来建立这个关联关系。

在这里插入图片描述

  • 与 NAT 技术的不同就是 NAPT 不仅仅映射内部设备的 IP 地址,还映射它们使用的端口号。这样,多个内部设备可以共享同一个公共 IP 地址,并通过不同的端口号来区分。

  • 外部网络可以通过目标端口号来区分不同的内部设备。这样,当数据包到达 NAPT 设备时,NAPT 根据目标端口号将数据包重定向到正确的内部设备。

  • 是因为 IP 地址加端口号能够表示某个子网中的某台主机上的唯一一个进程。无论是从内网到公网,还是从公网到内网,都能够在各自的网络中具有唯一性。所以,NAPT 中的映射关系是能够相互转换的。

  • 这种映射关系也是由 NAT 路由器自动维护的,例如在 TCP 的情况下,建立连接时就会生成这个表项,在断开连接后就会删除这个表项。

  • 如果内网没有访问过外网,外网理论上是不能够直接访问内网的。但是很多基于 NAT 技术的软件能够帮助我们从外网访问内网,这也就是内网穿透。

  • 内网穿透(Intranet Penetration)用于实现从一个私有网络(内网)中的设备与另一个私有网络或公共网络之间的通信。通常,内网中的设备由于位于防火墙、NAT设备或其他安全措施后面,无法直接从外部访问。内网穿透技术通过各种方法允许外部设备访问内网设备,实现了内外网络的连接。

NAT 技术的缺陷

由于 NAT 依赖这个转换表,所以有诸多限制。

  • 无法从 NAT 外部向内部服务器建立连接。
  • 转换表的生成和销毁都需要额外开销。
  • 通信过程中一旦 NAT 设备异常,即使存在热备,所有的 TCP 连接也都会断开。

NAT 和代理服务器

路由器往往都具备 NAT 设备的功能,通过 NAT 设备进行中转,完成子网设备和其他子网设备的通信过程。

代理服务器看起来和 NAT 设备有一点像,客户端向代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器,服务器返回结果后,代理服务器又把结果回传给客户端。

那么 NAT 和代理服务器的区别有哪些呢?

  • 从应用上讲,NAT 设备是网络基础设备之一,解决的是 IP 不足的问题,代理服务器则是更贴近具体应用,比如通过代理服务器进行翻墙,另外像迅游这样的加速器也是使用代理服务器。
  • 从底层实现上讲,NAT 是工作在网络层,直接对 IP 地址进行替换,而代理服务器往往工作在应用层。
  • 从使用范围上讲,NAT 一般在局域网的出口部署,代理服务器可以在局域网做,也可以在广域网做,也可以跨网。
  • 从部署位置上看,NAT 一般集成在防火墙、路由器等硬件设备上,代理服务器则是一个软件程序,需要部署在服务器上。

正向代理服务器

正向代理是位于客户端和目标服务器之间的代理服务器,代表客户端向目标服务器发起请求。当客户端需要访问互联网资源时,正向代理会代替客户端发起请求,并将响应传递给客户端。正向代理在客户端所在的网络中,充当客户端的代表。

在这里插入图片描述

正向代理服务器的主要特点和用途:

  • 身份认证:只有通过身份认证后,才能够访问互联网资源。
  • 缓存: 代理服务器可以缓存之前请求的内容,以便在下次相同请求出现时,直接从缓存中返回响应,从而提高访问速度和减轻服务器负担。
  • 内容过滤: 代理服务器可以实施内容过滤,根据预定规则拦截或允许特定类型的请求和响应。
  • 保证内网安全:内网设备的网络请求都是通过代理服务器来完成的,同样外部服务器也不能直接访问内网设备,只能访问代理服务器。代理服务器能够识别访问是否合法并对此对访问进行拦截,从而保证了内网的安全。

反向代理服务器

反向代理是位于目标服务器和客户端之间的代理服务器,代表目标服务器向客户端提供服务。反向代理服务器不做任何业务的处理,只负责负载均衡地将客户端的请求转发到后端服务器上,等后端服务器处理完请求后,再将响应返回给客户端。客户端只能与反向代理通信,无法直接与后端服务器通信。

在这里插入图片描述

当并发量越来越大时,反向代理服务器也能够进行横向扩展,进而处理更大的并发量。

反向代理服务器的主要特点和用途:

  • 负载均衡: 反向代理服务器可以用于负载均衡,将客户端请求分发到多个后端服务器,以平衡服务器的负载,提高系统性能和可靠性。
  • 缓存: 反向代理服务器可以缓存目标服务器的响应,从而提高性能并减轻服务器负担。

科学上网的原理

因此我们的各种网络请求都是要经过运营商的,所以当你想浏览一些被封锁的内容、网站、APP 等,运营商会直接拦截你。那你怎么样才可以访问外网呢?

能够访问外网的本质就是:将你访问外网的请求进行加密(加密后运营商无法看到你真实的网络请求)后,再封装成一个网络请求并发送给海外或未受限制地区的代理服务器,然后代理服务器将你的真实的网络请求进行解密,再帮你进行访问,获得响应后再进行加密,最后你再进行解密就可以获得外网服务器返回给你的响应了。

👉总结👈

本篇博客详细讲解了网络层中的 IP 协议、数据链路层、ARP 协议、DNS 域名解析系统、ICMP 协议、NAT 技术以及代理服务器等等。以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家啦!💖💝❣️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/73318.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL | 检索数据

1-检索数据 1.1-检索单个列 SELECT prod_name FROM Products; 上述SELECT语句从Products表中检索一个名为prod_name的列。 所要查找的列在select后面&#xff0c;from关键字指出从那个表查询数据。 输出如下&#xff1a; prod_name8 inch teddy bear12 inch teddy bear18…

【Unity3D】Shader Graph节点

1 前言 Shader Graph 16.0.3 中有 208 个 Node&#xff08;节点&#xff09;&#xff0c;本文梳理了 Shader Graph 中大部分 Node 的释义&#xff0c;官方介绍详见→Node-Library。 Shader Graph 通过图像的形式表达了顶点变换和片元着色流程&#xff0c;其背后都是一些列的数学…

ubuntu 安装 python

ubuntu 安装 python 初环境与设备查询是否安装安装python 本篇文章将介绍ubuntu 安装 python 初 希望能写一些简单的教程和案例分享给需要的人 环境与设备 系统&#xff1a;ubuntu 查询是否安装 因为系统也许会自带一个python&#xff0c;所以验证一下&#xff0c;如果自…

FPGA应用学习笔记----CORDIC 算法和小结

加减移位操作来运算三角函数&#xff0c;开根号&#xff0c;求对数 圆周旋转模式

【Uni-App】uview 开发多端应用,密码显示隐藏功能不生效问题

出现的问题&#xff1a; 使用uview组件u-input框密码绑定时会出现右侧密码显隐图标不显示的问题 思路&#xff1a; 1.看了下uview源码&#xff0c;发现这有一段注释&#xff0c;我们需要把源码修改一下&#xff0c;问题出在这里 这行代码修改为 :password"password || …

ChatGPT: 提升程序员开发效率的秘密武器!

引言 在现代软件开发中&#xff0c;时间和效率显得尤为重要。程序员们需要在尽可能短的时间内编写高质量的代码&#xff0c;并使之处于状态良好的维护周期。为满足这些需求&#xff0c;人工智能技术逐渐成为软件开发的一项核心能力。ChatGPT作为自然语言生成模型中的佼佼者&am…

K8S MetalLB LoadBalancer

1. 简介 kubernetes集群没有L4负载均衡&#xff0c;对外暴漏服务时&#xff0c;只能使用nodePort的方式&#xff0c;比较麻烦&#xff0c;必须要记住不同的端口号。 LoadBalancer&#xff1a;使用云提供商的负载均衡器向外部暴露服务&#xff0c;外部负载均衡器可以将流量路由…

面部表情识别(Pytorch):人脸检测模型+面部表情识别分类模型

目录 0 相关资料1 基于人脸检测面部表情分类识别方法2 项目安装2.1 平台与镜像2.2 项目下载2.3 模型下载2.4 上传待测试图片2.5 项目安装 3 demo测试 0 相关资料 面部表情识别2&#xff1a;Pytorch实现表情识别(含表情识别数据集和训练代码)&#xff1a;https://blog.csdn.net…

Java:正则表达式书写规则及相关案例:检验QQ号码,校验手机号码,邮箱格式,当前时间

正则表达式 目标:体验一下使用正则表达式来校验数据格式的合法性。需求:校验QQ号码是否正确&#xff0c;要求全部是数字&#xff0c;长度是(6-20&#xff09;之间&#xff0c;不能以0开头 首先用自己编写的程序判断QQ号码是否正确 public static void main(String[] args) {Sy…

camera hal|如何学习一个新平台

全网最具价值的Android Camera开发学习系列资料~ 作者:8年Android Camera开发,从Camera app一直做到Hal和驱动~ 欢迎订阅,相信能扩展你的知识面,提升个人能力~ 我自己目前从事的是android camera hal 的工作,工作上接触到的芯片平台要么是高通的,要么是mtk的。 其实…

shell脚本循环语句

shell脚本循环语句 一.echo命令二.查看当前系统的时间--date命令三.循环语句for四.while循环语句结构五.while循环语句结构&#xff08;迭代&#xff09;六.continue和break 一.echo命令 echo -n 表示不换行输出 echo -e输出转义符&#xff0c;将转义后的内容输出到屏幕上 常…

公文管理系统SSM+Activiti文档文件日志java jsp源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 公文管理系统SSMActiviti 系统有1权限&#xff1a;管…

Jupyter并发测试以后出现EOFError marshal data too short

Jupyter 并发测试以后出现EOFError: marshal data too short 背景 由于项目需求需要用户能进行网页在线运行python代码程序&#xff0c;调研后决定使用Jupyter的服务接口实现此功能&#xff0c;目前使用docker进行容器化部署&#xff0c;测试针对次服务进行并发测试。测试并发…

k8s service

1、认识Service 程序在容器中、容器在Pod中&#xff0c;可以通过pod的ip来访问应用程序&#xff0c;但是podIP会随着创建销毁而改变。由此&#xff0c;Service出现&#xff1a; Service会对提供同一个服务的多个pod进行聚合&#xff0c;并且提供一个统一的入口地址。通过访问…

自学stm32,需要会到什么程度能找到一份工作?

学STM32&#xff0c;想要找到一份工作&#xff0c;需要具备以下基本条件和技能&#xff1a;掌握新建工程和调试工程的基本操作&#xff0c;熟悉使用官方的STM32CubeIDE等开发工具。熟悉C语言编程&#xff0c;理解基本的语法和编程概念&#xff0c;对汇编语言有一定了解。熟悉ST…

回归预测 | MATLAB实现基于PSO-LSSVM-Adaboost粒子群算法优化最小二乘支持向量机结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于PSO-LSSVM-Adaboost粒子群算法优化最小二乘支持向量机结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于PSO-LSSVM-Adaboost粒子群算法优化最小二乘支持向量机结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考…

elementUI时间选择器el-time-picker的坑

//开始时间<el-time-pickerplaceholder"选择时间":format"HH:mm:ss" //显示的时间样式value-format"HH:mm:ss" //绑定值的样式 //不给默认为 Date 对象值&#xff1a;"2023-07-31T16:00:00.000Z"v-model"FormData.startTime&…

基于SpringBoot的旅游网站的设计与实现【附ppt|开题|万字文档(LW)和搭建文档

主要功能 前台界面&#xff1a; ①首页、旅游线路推荐、旅游资讯、线路搜索、查看更多等 ②旅游线路、度假旅游、探险考察、文化旅游、短程旅游、观光旅游、远程旅游、最新路线等 ③添加购物车、立即购买、评论、点我收藏等 ④个人中心、我的订单、我的地址、我的收藏、客服等…

如何保护员工安全、公司财产?劝你一定要试试这个技能!

在现代办公环境中&#xff0c;办公室视频监控正逐渐成为维护安全、管理风险和提升工作效率的重要工具。 办公室视频监控成为许多组织的一部分&#xff0c;它不仅有助于保护员工和财产&#xff0c;还能提供实时的信息和记录&#xff0c;以应对安全挑战和法规合规性要求。 客户案…

全国各城市-货物进出口总额和利用外资-外商直接投资额实际使用额(1999-2020年)

最新数据显示&#xff0c;全国各城市外商直接投资额实际使用额在过去一年中呈现了稳步增长的趋势。这一数据为研究者提供了对中国外商投资活动的全面了解&#xff0c;并对未来投资趋势和政策制定提供了重要参考。 首先&#xff0c;这一数据反映了中国各城市作为外商投资的热门目…