目录
[📁 网络层](#📁 网络层)
[📁 IPV4](#📁 IPV4)
[📂 什么是IP地址](#📂 什么是IP地址)
[📂 网段划分](#📂 网段划分)
[📂 特殊IP](#📂 特殊IP)
[📂 内网和公网](#📂 内网和公网)
[📂 IPV4的危机](#📂 IPV4的危机)
[📁 IP协议格式](#📁 IP协议格式)
[📁 路由](#📁 路由)
[📁 分段和组装](#📁 分段和组装)
[📁 NAT](#📁 NAT)
[📂 概念](#📂 概念)
[📂 内网穿透](#📂 内网穿透)
[📂 内网打洞](#📂 内网打洞)
[📁 代理服务器](#📁 代理服务器)
[📂 正向代理服务器](#📂 正向代理服务器)
[📂 反向代理服务器](#📂 反向代理服务器)
[📁 总结](#📁 总结)
🌈前言🌈
欢迎说看本期【网络世界】,本期内容将讲解网络层的一些概念,例如IP地址是什么,IP协议格式,以及IP分段和组装,以及IPV4的危机,NAT技术等等。
通过学习网络层两个最重要的协议:IP协议和ICMP协议,来理解为网络层的概念。
📁 网络层
网络层是OSI(开放系统互连)参考模型中的第三层,也是TCP/IP协议族中的核心层之一,其主要功能是实现数据包的传输和路由选择。
📁 IPV4
📂 什么是IP地址
IP地址,即互联网协议地址(Internet Protocol Address),是为网络设备(如计算机、打印机、服务器、路由器等)在网络上进行通信而分配的一个唯一标识符。它用于在网络层标识和定位设备,使得数据包能够在互联网上正确地路由和传输到目的地。
主流的ip地址为IPv4地址,但是随着互联网的发展万物互联,可以预见的是IPV6将成为主流。
IPv4地址,采用32位二进制数,通常采用4个点分十进制数表示,每个数的范围是【0,255】(如192.168.1.1)。而IPv6则是一个128位的二进制数,通常由8个冒号分割的十六进制数。
📂 网段划分
网段划分是网络设计和管理的一项重要技术。有的时候我们想要限制不同主机之间的通信,就要进行网段划分。
ip地址分为两个部分:网络号和主机号
网络号: 保证相互连接的两个网段具有不同的标识。
主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号。
不同的子网就是将网络号相同的主机放在一起。如果子网中新增一台主机,那么这台主机的网络号和这个子网的网络号一致,但是主机号不能和子网内其他主机重复。
通过设置合理的网络号和主机号,就可以报好着呢个相互连接的网络中,每台主机的IP地址都不相同。但是手动管理要求太大,相当麻烦。因此有一种技术叫做DHCP,能够自动给子网内主机分配IP地址,一般路由器带有DHCP功能,因此路由器也可以看成一台DHCP服务器。
提高网络性能:通过划分网段,可以减少网络中的广播流量。广播是网络设备向同一网段内的所有其他设备发送消息的过程,如果网络过大,广播流量会占据大量网络资源,导致网络性能下降。划分网段后,广播被限制在较小的范围内,从而提高了整体网络性能。
增强网络安全性:网段划分有助于隔离网络中的不同部分,使得攻击者更难在网络中横向移动。通过在网络边界上实施访问控制策略,可以限制不同网段之间的通信,从而增加网络的安全性。
优化网络管理:划分网段使得网络管理员能够更轻松地管理网络。每个网段可以独立配置和管理,这有助于简化网络故障排查、地址分配和策略实施等任务。
适应不同业务需求:不同的业务部门或应用可能需要不同的网络环境和资源。通过网段划分,可以为每个部门或应用提供定制的网络设置,以满足其特定的业务需求。
提高可扩展性:随着业务的增长,网络也需要不断扩展。网段划分使得网络扩展变得更加容易和灵活。通过添加新的网段和相应的网络设备,可以轻松地扩展网络规模,而不会对现有网络造成太大的影响。
常见的网段划分有:静态划分(IP地址范围),CIDP(子网划分)等等。
静态划分
过去曾经提出一种划分网络号和主机号的方案, 把所有 IP 地址分为五类, 如下图所示 (该图出 自[TCPIP])。
• 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
但是随着互联网的发展,这种划分方案局限性就暴露出来了,最大的问题就是不能满足个性化的需求,造成了大量IP地址浪费,因此这种方案很快就被丢弃了。
CIDR
针对上述方案,又重新提出了CIDP方法。通过引入额外的子网掩码来区分网络号和主机号。
子网掩码是一个32位的正整数(1代表网络号,0代表主机号),将IP 地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号。
网络号和主机号的划分与这个 IP 地址是 A 类、B 类还是 C 类无关。
例如下图,ip地址:140.252.20.68 子网掩码:255.255.255.0,还有一种更简洁的表达方式就是140.252.20.68/24。
📂 特殊IP
主机位全0:表示广播号,不能分配给主机或设备使用;
主机位全1:表示广播号,不能分配给主机或设备使用;
127.*.*.* :表示本网主机,用于本地环回测试
📂 内网和公网
- 内网(Intranet) :
- 指的是在特定组织或机构内部建立的私有网络。
- 主要用于内部通信、资源共享和业务流程管理。
- 通常不对外公开,只有授权用户才能访问。
- 公网(Internet) :
- 是指全球范围内广泛连接的公共网络。
- 由众多不同的网络组成,通过标准的通信协议(如TCP/IP)实现互连互通。
- 对所有人开放,用户可以随时随地访问公网上的资源。
因此种种原因,国内不能随便进入公网,这里就不做讨论了。
此外,还规定了一些私网IP地址,只能在内网中使用,不能出现在公网。
📂 IPV4的危机
上述,IPv4地址是一个32位二进制数组成的地址,即最多有42亿(2^32)多个地址可用,但随着互联网用户和设备数量(路由器)的快速增长,这些地址已经无法满足需求,导致地址池逐渐枯竭。
为了解决危机,有多种解决方案。
**释放闲置地址:**如"240/4"地址段的释放提议,但这些地址的释放面临技术障碍和利益方的反对。
**NAT技术:**主要通过将私有IP地址转换为公有IP地址,从而缓解了IPv4地址枯竭的问题。
**IPv6:**推动IPv6的广泛应用是解决IPv4地址枯竭问题的根本之道。需要加快IPv6网络基础设施的建设、促进IPv6相关技术和产品的研发和应用、加强IPv6安全问题的研究和解决等。
📁 IP协议格式
(1)4位版本号:表示IP协议的版本,当前主要使用的是IPv4(值为4)和IPv6(IPv6的格式和参数与IPv4有较大不同,这里主要讨论IPv4)。
(2)4位首部长度:表示IP协议包头的长度,以32位(4字节)为单位。最小值为5(表示20字节),最大值为15(表示60字节)。该字段允许IP头部包含可选字段。
如果4位首部长度是0101(5)那么IP数据包头为20B(5 * 4B),即没有选项。如果大于20B,减去20B,剩下的就表示选项。
(3)8位服务类型 :也称为Type of Service(TOS),用于标识IP包的优先级和服务质量。其中,前3位为已弃用的优先权字段,有一位保留(必须置为0),后4位分别表示最小延时、最大吞吐量、最高可靠性和最小成本 ,同一时刻只能取其中一种。
(4)16位总长度 :IP数据包整体占多少个字节,包括头部和数据负载,以字节为单位。最大长度为65535字节,但实际中受物理网络限制,一般远小于此值。。
(5)16位标识:用于唯一标识主机发送的每一份数据报。在数据报被分片时,每个分片的标识字段值相同。
(6)3位标志:
第0位是保留为,必须置为0,目前没有实际功能或用途。
第1位(DF,Don't Fragment),表示禁止分片,当被置为1时,如果IP数据报大小超过了某个网络的MTU(最大传输单元),那么数据报将被丢弃,并返回一个ICMP错误信息给对方。有助于避免网络因分片而产生而外的开销和可能的重组错误。
第2位(MF,More Fragment),表示"更多分片"。当置为1时表示"后面还有分片",指示接收方还有后续的分片需要接受和重组。置为0时,表示"这是最后一个分片",指示接收方这是数据序列中最后一个分片了。
(7)13位偏移:表示分片在原数据报中的位置,以字节为单位,用于接收端的重组和分片。
(8)8位TTL:表示数据报在网络中的生存周期,每经过1个路由器,TTL-1,当TTL为0时,数据报被丢弃。
(9)8位协议:表示IP包中封装的上层协议类型,如TCP,UDP等,用来分用,即交给上层哪个协议处理。
(10)16位校验和:用于校验IP头部在传输过程中的完整性和正确性(本文不做详细介绍了)。
源IP地址和目的IP地址如字面意思,表示发送端和接收端的IP地址。
我们通过学习IP协议报头的各个参数的含义,来学IP协议,以及TCP/IP协议栈中的网络层。其中就16位标识,3位标志,13偏移量需要我们学习,其余的我们通过名词介绍即可了解。
📁 路由
我们经常说,网络层负责路由选择,那究竟什么是路由呢?
路由的过程, 就是这样一跳一跳(Hop by Hop) "问路" 的过程。所谓 "一跳" 就是数据链路层中的一个区间.,具体在以太网中指从源 MAC 地址到目的 MAC 地址之间的帧传输区间,这里就是数据链路层的概念了,在数据链层文章中详细介绍。
它指的是数据包(或数据报文)从源地址(起点)到目的地(终点)的路径选择过程。在计算机网络中,路由功能通常由路由器(Router)来执行。
我们知道,每个路由器连接着不同网络,可是我知道我要发送的报文连接着哪个路由器呢?
举个例子,我们想要知道成华大道在哪?就问谭警官,他告诉我们要过二仙桥,一直往前走。这样我们就知道怎么走了,我们就记在心里,这样下次我们就可以直接走了。
每个路由器都会根据路由表(Routing Table)中的信息来决定数据包应该被转发到哪个下一个节点。路由表包含了网络的拓扑信息,包括目的地址、下一跳地址、接口等信息。
路由表可以使用 route 命令查看
• 如果目的 IP 命中了路由表, 就直接转发即可;
• 路由表中的每一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。
路由表的 Destination 是目的网络地址 ,Genmask 是子网掩码 ,Gateway 是下一 跳地址,Iface 是发送接口 ,Flags 中的 U 标志表示此条目有效(可以禁用某些条目),G 标志表示此条目的下一跳地址是某个路由器的地址,没有 G 标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发;
路由器取出数据包中目的IP地址,与路由表中每一项进行比较;
先和每一项的子网掩码(Genmask)按位与,判断网络号(Destination)是否一样。如果一样,判断是否是直连网络,如果是直接将数据包转发的目的主机;如果不是则转发到下一跳的路由器(Gateway)上。
如果网络号不一致,就执行下一项,直到执行到default为止。如果执行到default都没找到一样的网络号,说明目的主机不在相连的网段中,将数据包发送给缺省路由器。
例1:如果要发送的数据包的目的地址是 192.168.56.3
• 跟第一行的子网掩码做与运算得到 192.168.56.0,与第一行的目的网络地址不符
• 再跟第二行的子网掩码做与运算得到 192.168.56.0,正是第二行的目的网络地址,因此从 eth1 接口发送出去;
• 由于 192.168.56.0/24 正 是与 eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发;
例2:如果要发送的数据包的目的地址是 202.10.1.2
• 依次和路由表前几项进行对比, 发现都不匹配;
• 按缺省路由条目, 从 eth0 接口发出去, 发往 192.168.10.1 路由器;
• 由 192.168.10.1 路由器根据它的路由表决定下一跳地址;
路由表可以由网络管理员手动维护(静态路由), 也可以通过一些算法自动生成(动态路由),如离向量算法, LS 算法, Dijkstra 算法等。
📁 分段和组装
网络层对IP数据包进行分片和组装的主要原因在于适应不同物理网络的MTU(Maximum Transmission Unit,最大传输单元)差异,确保数据包能够顺利传输到目的地。这一过程对于传输层是透明的,简化了网络协议的设计和实现。
至于什么是MTU,为什么要有MTU是数据链路层的知识了,这里我们就需要知道在局域网中规定了最大传输单元MTU,常用的以太网的MTU是1500B。
网络层收到上层传下来的数据报,添加报头交付给下层时,下层说不行,你发的数据必须小于等于MTU,超了我不发。网络层这时就很为难,我又不能将数据还给上层,所以只能网络层来处理数据报文过长的问题。
但是数据报文分段了,对端怎么知道顺序,怎么才能重新组装呢?因此需要IP协议中的16位标识,3位标志,13位偏移量。
不同报文,16位标识不同,一个报文的不同分片,16位标识必须相同。
每个分片的13位分片偏移,是分片相对于原始IP报文(有效载荷,不包含IP报头)开始处的偏移。
但是我们只有13位,怎么能表示出16位的有效载荷呢?因此,我们需要在分片时,将有效载荷缩小。**因此13位偏移量单位是8B,写入时右移>>3位(除8),读取时左移<<3位(乘8)。**因此,真实的分片偏移必须是8的倍数,低3个比特位为0,这样可以确保没有数据丢失问题。
为了确保数据能够正确的收到和组装分片,因此需要将每一个分片添加IP报头。
对端是如何知道是数据报分片了?
如果拿到的是第一片,发现MF置为1,偏移量为0,知道这是第一片;拿到中间片,发现MF置为1,偏移量为>0,直到后面还有分片,按照偏移量组装;拿到最后一片,发现,MF置为0,偏移量>0,直到这是最后一片,组装完毕。
将所有分片升序排序,分片偏移量 + DATA长度 = 下一个分片的偏移量。
对端是如何知道是数据报没分片呢?
MF为0,并且偏移量也为0,接收端知道没有进行分片。
IP层不负责重新传输,传输层才进行数据重传等机制。
📁 NAT
📂 概念
NAT(Network Address Translation,网络地址转换)是一种将私有IP地址转成公网IP地址的技术。通过路由器或防火墙重写源IP地址,实现私有网络内的设备通过一个或少数几个公网IP地址来访问互联网,同时隐藏内部网络结构,提高网络安全性。
之前,我们说过,私有IP地址是不能出现在公网中,也就意味着不同网段可以有相同的私有IP地址。想要访问公网,通过NAT技术将私有IP地址转变成公网IP地址。
NAT有多种实现方式,不同方式有不同作用:
- 静态NAT:内部网络的私有IP地址与公网IP地址之间建立一对一的固定映射关系。这种方式适用于内部网络中的服务器需要对外提供服务的情况。
- 动态NAT:内部网络的私有IP地址在访问互联网时,动态地从地址池中分配一个公网IP地址进行转换。当内部设备不再访问互联网时,该公网IP地址会被回收并重新放回地址池中。
- 端口多路复用(PAT/NAPT):内部网络的所有主机通过改变外出数据包的源端口并进行端口转换,共享一个公网IP地址访问互联网。这种方式可以最大限度地节约公网IP资源。
一般我们最长使用的就是NAPT方式,接下来我们讲解什么是NAPT。
但当多个主机访问外网同一个服务时,路由器转换成同一个公网IP,返回数据时,怎么知道数据是谁的呢?返回来的数据包中目的IP地址是一样的,源IP地址也是一样的,NAT服务器是如何判断数据转发给局域网的哪个主机。
当内部网络中的设备尝试访问外部网络(如互联网)时,NAPT路由器会检查数据包的源IP地址和源端口号,并将它们转换为一个公共IP地址和一个非冲突的目的端口号。这个转换过程会记录在一个转换表中,以便在响应数据包返回时能够正确地将其转发给内部网络中的相应设备。
通过IP+Port的方法来建立关联关系,这个关系是由NAT服务器动态维护的。例如TCP情况下,建立连接时,就会生成表项,断开连接时,会删除这个表项。
NAPT改变了数据包的端口号,通过不同端口号映射到同一个公共IP地址从而共享这个IP地址进行通信。
NAT缺陷
1.通信限制,NAPT技术通常只允许从内部网络发起通信。意味着外部网络试图主动与内部网络某个设备建立连接时,NAPT会阻止这种请求,因为它不知道将请求转发到哪个内部设备上。
2. 性能影响,处理所有进出的数据包时,都要进行ip地址和端口号之间的映射,在高流量的情况下,引入额外的延迟,影响性能。
3. 端口号冲突和耗尽,如果内部网络中的设备数量过多,或者单个设备同时建立的连接数过多,可能会导致端口号冲突或耗尽。这可能会影响到内部设备与外部网络的正常通信。
此外还有一系列问题,如安全问题,配置复杂等。
📂 内网穿透
NAPT技术不支持外部网络对内网的访问,因为NAT会屏蔽掉内部网络的真实IP地址,因此内网穿透技术应运而生。
它利用一个具有公网IP地址的中转服务器(也称为"穿透服务器")来辅助实现内部网络到外部网络的连接。内部网络的设备或服务首先向中转服务器注册自己的外网收发接口(如IP地址和端口号),然后中转服务器将这些信息告知给外部网络的用户。当外部网络用户想要访问内部网络的服务时,他们首先连接到中转服务器,然后中转服务器根据注册的信息将请求转发给内部网络的设备或服务。
简单理解为,外网设备通过访问穿透服务器(也称为中转服务器或映射服务器),可以间接地访问到内网中的主机或服务。穿透服务器在这里起到了桥梁的作用,它允许外部网络的数据包经过处理后,能够转发到内部网络中的目标主机上,同时也能够将内部主机的响应数据转发回外部网络。
内网穿透技术广泛应用于需要远程访问内部网络服务的场景,例如:远程办公,远程开发等。
使用内网穿透软件或服务:
- 花生壳:一款老牌的内网穿透软件,支持TCP和UDP协议,并提供了域名解析服务,方便用户进行远程访问。
- FRP:一款开源的内网穿透工具,支持TCP、UDP、HTTP和HTTPS等协议,用户可以在内网机器上安装FRP客户端,并在公网机器上配置FRP服务端来实现内网穿透。
- Ngrok:一个反向代理工具,通过在公共端点和本地Web服务器之间建立安全通道来实现内网穿透。用户只需要在本地启动Ngrok客户端并配置好映射端口,就可以获得一个临时的域名来访问内网应用。
使用SSH端口转发 :
SSH(安全外壳协议)是一种安全的远程登录协议,它可以通过端口转发的方式实现内网穿透。用户可以在内网机器上启动SSH服务并进行相应配置,然后在公网机器上使用SSH客户端连接内网机器并进行端口转发。
使用VPN技术 :
VPN(虚拟专用网络)技术也可以用于实现内网穿透。VPN通过建立一个加密的通道来连接内部网络和外部网络,使得外部网络的用户可以像访问本地网络一样访问内部网络的服务和设备。
📂 内网打洞
可以理解为外网设备通过一次与穿透服务器的交互,获取到内部主机的IP地址和端口信息,之后两台主机之间的通信就不再需要穿透服务器直接中转。
- P2P打洞技术 :
- 中继(Relaying):这是最简单也是最不高效的方式,通过一个有公网IP的服务器作为中继,转发两个内网客户端之间的数据。这种方式在客户端数量较少且网络流量不大时可行,但随着客户端数量的增加,服务器的压力会急剧增大。
- 逆向连接(Connection reversal):当一个内网客户端无法直接访问另一个内网客户端时,可以通过服务器建立逆向连接,即让原本应该是被动接收连接的客户端主动向服务器发送连接请求,从而绕过NAT的限制。
- UDP/TCP打洞:利用UDP或TCP协议的特性,在客户端之间建立直接的通信链路。这种方式需要客户端和服务器之间的紧密配合,以及NAT的支持。
- 基于UDP的打洞技术 :
- 依赖于防火墙和NAT的特性,通过发送特定的UDP数据包来"打洞",使得两个内网客户端之间能够建立直接的通信链路。这种方式通常需要在服务器端进行一些特殊的配置和处理。
- 使用专门的内网穿透软件或服务 :
- 如花生壳、FRP等,这些软件或服务提供了内网穿透的功能,用户只需要在内部网络中的设备上安装客户端软件,并在公网服务器上配置相应的服务,就可以实现内部网络到外部网络的穿透。
📁 代理服务器
📂 正向代理服务器
正向代理(Forward Proxy)是一种常见的网络代理方式,它位于客户端和服务器之间,代表客户端向服务器发送请求。正向代理服务器接受客户端的请求,然后将请求转发给目标服务器,最后将目标服务器的响应返回给客户端。
工作原理:
-
客户端将请求发送给正向代理服务器。
-
正向代理服务器接受请求,并根据配置进行处理,如缓存查找,内容过滤等。
-
正向代理服务器将处理后的请求转发给目标服务器。
-
目标服务器处理请求,并将响应返回给正向代理服务器。
-
正向代理服务器将响应返回给客户端。
常见的应用场景有校园网,企业网管理,通过正向代理实现对学生员工对网络访问的管理和监控等。
📂 反向代理服务器
反向代理服务器是一种网络架构模式,其作为服务器的前置服务器,接收来自客户端的请求,并将这些请求转发给后端服务器,然后将后端服务器的响应返回给客户端。这种架构模式可以提升网络性能,安全性和可维护性等。
工作原理:
反向代理服务器位于客户端和服务器之间,当客户端发起请求时,首先会到达反向代理服务器。反向代理服务器会根据配置的规则将请求转发给后端服务器,并将服务器的响应返回给客户端。这个过程中,客户端不知道和哪个具体服务器交互,只知道反向代理服务器进行通信。
可以看出,反向代理服务器最大应用场景就是实现负载均衡,安全保护等。
• 负载均衡:反向代理服务器可以根据配置的负载均衡策略,将客户端的请求分发 到多个后端服务器上,以实现负载均衡。这有助于提升网站的整体性能和响应速度, 特别是在高并发场景下。
• 安全保护:反向代理服务器可以隐藏后端 Web 服务器的真实 IP 地址,降低其被直接攻击的风险。同时,它还可以配置防火墙、访问控制列表(ACL)等安全策略, 对客户端的请求进行过滤和限制,以保护后端服务器的安全。
• 缓存加速:反向代理服务器可以缓存后端 Web 服务器的响应内容,对于重复的 请求,它可以直接从缓存中返回响应,而无需再次向后端服务器发起请求。这可以大 大减少后端服务器的负载,提升网站的响应速度。
• 内容过滤和重写:反向代理服务器可以根据配置的规则对客户端的请求进行过滤 和重写,例如添加或删除请求头、修改请求路径等。这有助于实现一些特定的业务需 求,如 URL 重写、用户认证等。
• 动静分离:在大型网站中,通常需要将静态资源和动态资源分开处理。通过将静 态资源部署在反向代理服务器上,可以直接从反向代理服务器返回静态资源的响应, 而无需再次向后端服务器发起请求。这可以大大提升静态资源的访问速度。
• CDN(Content Delivery Network,内容分发网络)就是采用了反向代理的原理。
📁 总结
本期【网络世界】,主要讲解了网络层的一些常见概念,包含了IP地址,IP协议报头格式。学习了IP协议工作流程,即通过路由表进行路由选择过程。此外,学习了NAT中的NAPT技术来解决IPv4地址不足的问题。此外,拓展学习了代理服务器的概念。
如果感觉本期内容对你有帮助,欢迎点赞,关注,收藏Thanks♪(・ω・)ノ