目录
- 网络层
- IP协议
- 协议头格式
- 网段划分
- 分类划分法
- 特殊的 IP 地址
- IP 地址的数量限制
- 私有 IP 地址和公有 IP 地址
- 路由
- 路由表生成算法
- 数据链路层
- 以太网
- 以太网帧格式
- 认识 MAC 地址
- ARP协议
- ARP数据报格式
- ARP 协议的工作流程
- ARP欺骗
- DNS
- hosts 文件
- 域名的层级关系
- 域名服务器分类
- 域名解析过程
- ICMP 协议
- ICMP 协议的功能
- ICMP 的报文格式
- ping 命令
- traceroute 命令
- NAT
- NAT技术背景
- NAT 转换过程
- NAPT
- NAT 技术的缺陷
- NAT 和代理服务器
- 正向代理服务器
- 反向代理服务器
- 科学上网的原理
网络层
在复杂的网络环境中确定一个合适的路径。
IP协议
应用层主要解决的是如何对数据进行格式化处理、对数据进行加密解密保证安全性等问题,而传输层、网络层和数据链路层三层隐藏网络的细节,将可靠数据从一台主机送到另一台主机。可靠性主要是通过传输层中的 TCP 协议来保证,而网络层中的 IP 协议具有将数据从一台主机送到另一台主机的能力,但仅凭它并不一定能做到,它还需要TCP协议来保证数据的可靠性以及数据链路层来传输数据!!
基本概念:
- 主机:配有 IP 地址,但是不进行路由控制的设备。
- 路由器:即配有 IP 地址,又能进行路由控制。
- 节点:主机和路由器的统称。
- 数据并不是从一台主机直接送到另一台主机的,而是传输到路由器,经过查询路由器表根据 IP 地址进行路径选择,然后一步一步下一跳地到达目标主机的,这个过程就是数据转发的过程。
协议头格式
IP报头字段:
- 4位版本号(version):指定IP协议的版本,对于IPv4来说, 就是4。
- 4位头部长度(header length):IP头部的长度是多少个32bit,也就是 length * 4 的字节数。4bit表示最大的数字是15, 因此IP头部最大长度是60字节。
- 8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段和1位保留字段(必须置为0)。4位TOS分别表示: 最小延时,最大吞吐量, 最高可靠性,最小成本,这四者相互冲突只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要。
- 16位总长度(total length): IP数据报整体占多少个字节,有效载荷的字节数等于 16 位总长度减去 4 位首部长度 * 4。
- 16位标识(id):唯一的标识主机发送的报文,如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的。
- 3位标志字段: 第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。第二位置为 1 表示禁止分片,这时候如果报文长度超过 MTU,IP 模块就会丢弃报文。第三位表示 “更多分片”,如果分片了的话,最后一个分片置为 0,其他是 1,类似于一个结束标记。
- 13位分片偏移(framegament offset):是分片相对于原始 IP 报文开始处的偏移,其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的,因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了)。
- 8位生存时间(Time To Live, TTL):数据报到达目的地的最大报文跳数, 一般是64。 每次经过一个路由 TTL-= 1,一直减到0还没到达,那么就丢弃了,这个字段主要是用来防止出现路由循环。
- 8位协议: 表示上层协议的类型,如 UDP 协议或 TCP 协议。
- 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏。
- 32位源地址和32位目标地址: 表示发送端和接收端。
- 选项字段(不定长, 最多40字节):略
Q:网络层如何分离有效载荷与报头?
IP报文是由固定的前20个字节、选项字段和有效载荷组成的,4位首部长度字段得知IP报头总大小,16位总长度字段得到IP报文的总长度,由此我们就能找到报头与有效载荷的边界,就能交有效载荷与报头分离!
Q:如何交付给上层?
IP报头中的8位协议字段用来标识UDP与TCP协议,由此我们就知道将数据交给对应的协议向上进行处理了。
Q:IP报头中16位标识、3位标志以及13位片偏移等字段都与分片操作有关,IP报文为什么要进行分片操作?
数据链路层由于物理特性的原因,一般无法转发太大的数据,因此数据链路层对转发到网络的报文大小有限制,称之为 MTU(Maximum Transmission Unit,最大传输单元),一般是 1500 字节。如果 IP 报文超过了 MTU,就需要对 IP 报文进行分片。传输层并不关心你是如何进行分片的,同时分片也需要考虑组装问题。
Q:网络层是如何对数据进行分片和组装的?
要解决这个问题我们必须要了解这三个字段:16位标识字段可以标识主机发送的报文,如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的;3位标志字段中第三位表示 “更多分片”,如果分片了的话,最后一个分片置为 0,其他是 1,类似于一个结束标记;13位分片偏移是分片相对于原始IP报文开始处的偏移,其实就是在表示当前分片在原报文中处在哪个位置。
Q:如何判别报文是否被分片?
如果报文没有被分片,那么更多分片标志位为 0 并且 13 位片偏移为 0,那么此时则为一个独立的报文;如果更多分片标志位是 1或者13位偏移量大于0,则表明该报文被分片了。
Q:如何判别分片是原始报文中的哪一部分?
如果更多分片标志位为 1,片偏移为 0,则表示该分片是报文的开始部分。而如果更多分片标志位为 0,片偏移不为 0,则表示该分片是报文的结尾部分。如果更多分片标志位为 1,片偏移不为 0,则表示该分片是报文的中间部分。如果更多分片标志位为 0 并且 13 位片偏移为 0,则是一个独立报文,未被分片!!
Q:如何保证收齐了这些分片呢?
可以根据偏移量进行升序排序,然后扫描全部分片来判断分片是否收齐。因为下一个分片的偏移量等于上一个分片的偏移量 + 上一个分片的大小,如果分片没有收齐,那么一定不符合这个关系,那么中间的分片就一定有丢失的。
Q:如何将分片组装成报文?
同样的可以根据偏移量进行升序排序,然后去掉各分片对应的报头(除原始报头外),将其组装起来!!分片之后每一片都是IP报文,都要有IP报头,要不然怎么知道哪一个分片是属于哪一种报文呢!!哪一个分片位于原始报文的哪个区域呢!!所以分片之后必须都要有自己的报头信息,这样才能完成组装!!
下面我们来简单模拟一下IP层分片与组装的过程:
虽然分片解决了数据链路层对转发到网络的报文大小限制问题,但实际上我们并不推荐分片!!为何?
当一个大的数据包被分成多片时,这无疑是增加了丢包的概率。因为当所有的分片在对端的网络层中收齐再进行组装后检查无误才能认为收到了一个完整的数据包,如果缺少某一个分片,我们就不会向上交付给传输层,而是进行超时重传,这样相较于原先一个完整的数据包丢包进行超时重传的概率大大增加了,因此,非常地不推荐分片。
那么如何解决这个问题呢?
本质上是因为传输层向下交付给网络层的数据包过大,网络层才要进行分片满足数据链路层对于数据大小的限制,因此我们应该让TCP协议尽量发送数据不要过大,那么应该是多少呢?假设我们抛开TCP/IP协议报头中的选项字段,那么俩者的报头大小固定都是占20字节,因此TCP中有效载荷的长度最大(MSS,最大段尺寸)为1460字节。这也就是我们在tcp协议中不直接把滑动窗口范围内的报文直接打一个包直接向下交付给IP层的原因,而是一般拆成多个报文向下交付,在对端中的接收缓冲区中完成组装成完整报文!!
网段划分
由于 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 地址,一个是 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访问公网的过程:
路由
路由简单来说就是在复杂的网络结构中, 找出一条通往终点的路线。
路由过程是指在计算机网络中,数据包从源设备发送到目标设备的过程,其中涉及到多个网络设备(如路由器和交换机)的协作工作,以确保数据包能够正确地从源地址到目标地址进行传输。路由的过程,就是这样一跳一跳(Hop by Hop) “问路” 的过程。所谓 “一跳” 就是数据链路层中的一个区间,具体在以太网中指从源 MAC 地址到目的 MAC 地址之间的帧传输区间。
以下就是路由的详细过程:
-
数据包生成:路由过程的第一步是数据包的生成。当源设备(如计算机或服务器)需要向目标设备发送数据时,它会将数据组装成数据包,并在数据包的首部添加必要的网络信息,如源 IP 地址、目标 IP 地址、端口号等。
-
网络层路由选择:在数据包生成后,源设备需要确定数据包的下一跳路径,即确定如何将数据包发送到目标设备。这个过程由网络层的路由选择算法完成。路由选择算法考虑多个因素,如目标 IP 地址、网络拓扑结构、路由器之间的链路状态、路由器的转发策略等,来选择最佳的下一跳路由器。
-
下一跳路由器:根据路由选择算法的结果,源设备将数据包发送给下一跳路由器,通常是源设备连接的默认网关或下一跳路由器的 IP 地址。
-
路由器转发:下一跳路由器接收到数据包后,会根据自己的路由表,确定下一跳路径,并将数据包转发给下一个路由器。这个过程会在一系列的路由器之间逐跳进行,直到数据包到达目标设备所在的局域网。
-
局域网交换:当数据包到达目标设备所在的局域网时,它会发送到目标设备的 MAC 地址。这个过程由交换机完成,交换机会根据数据包中的目标 MAC 地址,将数据包交付给正确的目标设备。
-
目标设备接收:最后,目标设备接收到数据包,将数据包解析,提取出其中的数据,并进行相应的处理。如果有需要,目标设备还会向源设备发送响应。
简单来说,IP 数据包的传输过程和问路的过程是一样的。当 IP 数据包到达路由器时,路由器会先查看目的 IP。然后路由器才会决定这个数据包是能直接发送给目标主机还是需要发送给下一个路由器,如此反复,一直达到目标 IP 所在的局域。
那么如何判定当前这个数据包该发送到哪里呢?这个就依靠每个节点内部维护一个路由表。
路由表可以使用route命令查看,如果目的 IP 命中了路由表,就直接转发即可,当目的地址与路由表中其它行都不匹配时,就按默认网关条目规定的接口发送到下一跳地址。
假设某主机上的网络接口配置和路由表如下:
这台主机有两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络接口连到192.168.56.0/24网络。路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口Flags中的U标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。
转发过程例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 协议只是依据目的 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 数据包等。为什么从46开始?因为ARP协议总长为46!
- 帧末尾是 CRC 校验码,用于检测数据帧在传输过程中是否发生错误。
Q:如何分离有效载荷与报头?
目的地址、源地址、类型以及CRC都是固定大小的,因此我们很轻松的就能找出有效载荷与报头之间的边界。
Q:如何交付?
读取帧首部中的类型字段,根据类型字段决定交给哪一个上层。
局域网通信原理:
以太局域网中,任何时刻只能有一台主机给另一台主机发送数据帧(临界资源),否则可能会发生数据碰撞的问题。
Q:局域网中主机越多越好还是越少越好?
如果局域网中有多台主机同时都在发送数据,此时就可能会发生数据碰撞问题,数据发生碰撞后,原始数据就被破坏无法正常使用了。这也就是我们平常在学校如果同一段时间内很多人使用校园网会非常卡顿的原因。因此发生数据碰撞时,所有发送数据帧的主机都要执行碰撞避免算法,也就是等待随机事件,然后再重新发送。
那如果局域网内的主机真的很多,怎么办呢?那么就需要在局域网中引入交换机,将局域网划分为不同的碰撞域。如下图所示:
- 当 H1 想给 H4 发送数据帧时,交换机识别出来 H1 和 H4 都在交换机的左半部分,那么数据帧就不会被扩散到交换机的右半部分,因此就降低了发生数据碰撞的可能性。
- 当 H1 想给 H6 发送数据帧时,交换机就会直接将数据帧发送给 H6,并不会发送给其他的主机。
Q:局域网中发送的数据帧是越长越好还是越短越好呢?
在局域网中发送的数据帧,一般来说,较短的数据帧会更好。较短的数据帧具有以下优点:
- 传输效率:较短的数据帧传输时间较短,能够更快地从发送端传输到接收端,提高了传输效率。在数据量相同的情况下,较短的数据帧能够更快地完成传输,从而减少了传输时间和延迟。
- 降低碰撞概率:较短的数据帧在传输过程中碰撞的概率较低。在共享介质的局域网中(如以太网的双绞线),当多个设备同时发送数据帧时,可能会发生碰撞。较短的数据帧传输时间较短,碰撞的机会更小,从而减少了碰撞的发生。
然而,数据帧也不能过短,因为过短的数据帧会导致网络利用率降低。过短的数据帧会导致网络利用率降低,因为在传输过程中,帧头和帧尾部的开销相对较多,而实际携带的有效数据较少。
认识 MAC 地址
- MAC 地址(Media Access Control Address)是数据链路层中用于标识网络设备的唯一物理地址。每个网络适配器(网卡)都会被分配一个唯一的 MAC 地址,它由 48 位二进制数(通常用十六进制表示)组成。MAC 地址是设备出厂时硬件固定的,无法修改。
- 虚拟机中的 MAC 地址不是真实的 MAC 地址,可能会冲突,也有些网卡支持用户配置 MAC地址。
- MAC 地址的格式通常以六组十六进制数字表示,用冒号分隔,例如:00:1A:2B:3C:4D:5E。
- MAC 地址在局域网内用于数据链路层的寻址和通信。在局域网中,当一个设备要向另一个设备发送数据帧时,会使用目标设备的 MAC 地址来确定数据帧的接收者。
- IP 地址描述的是路途总体的起点和终点,MAC 地址描述的是路途上的每一个区间的起点和终点。因此在网络转发的过程中,MAC 帧报头会一直发生变化,而IP报文地址不会发生变化。
ARP协议
在局域网通信中,发送方需要知道目标设备的 MAC地址才能发送数据帧,但通常情况下,发送方只知道目标设备的 IP 地址,而不知道其对应的MAC 地址,如果不知道目标设备的 MAC 地址,就无法封装数据帧了,所以我们要想办法通过目标设备的IP地址获取到目标设备的MAC地址,这时候就需要APR协议来支撑了!!
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,全称 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)消息,从而测量网络延迟和检查主机的可达性。
telnet 是 23 端口,ssh 是 22 端口, 那么 ping 是什么端口呢?千万要注意,ping 命令基于 ICMP协议的,是在网络层。而端口号是传输层的内容,在 ICMP 协议中根本就不关注端口号这样的信息。
traceroute 命令
traceroute 是一个用于跟踪数据包在网络中的路径的命令行工具,其也是基于 ICMP 协议实现的。traceroute 显示每个数据包的往返时间(Round-Trip Time,RTT),以及经过的中间节点的IP地址,帮助用户了解数据包从源主机到目标主机的网络路径。
以下是 traceroute 命令的用法和选项:traceroute [options]
-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 等,运营商会直接拦截你。那你怎么样才可以访问外网呢?
能够访问外网的本质就是:将你访问外网的请求进行加密(加密后运营商无法看到你真实的网络请求)后,再封装成一个网络请求并发送给海外或未受限制地区的代理服务器,然后代理服务器将你的真实的网络请求进行解密,再帮你进行访问,获得响应后再进行加密,最后你再进行解密就可以获得外网服务器返回给你的响应了。