目录
1. DNS
DNS 全称 Domain Name System,域名系统,其是一个分层的分布式数据库系统,用于将域名解析为相应的IP地址。
1.1. DNS 背景
TCP/IP 中使用IP地址和端口号来标定全网中的特定主机和该主机上特定的进程,但是由于点分十进制的IP地址是不太方便人们记忆的,于是人们发明了一个主机名的东西,本质上就是一个字符串,并且使用 hosts 文件来保存主机名和IP地址的映射关系。
最初,这个 hosts 文件是通过互联网信息中心 (SRI-NIC) 来管理的。
- 当一个新的主机要接入网络,或者某个主机的IP变更,都需要到信息中心申请变更 hosts 文件;
- 其他主机也要定期更新 hosts 文件才能正确上网。
可是这样太繁琐了,于是诞生了DNS系统。
- DNS 是一个网络服务,是由特定组织维护的,DNS其中保存了每个主机的IP和主机名的映射关系;
- 如果有新主机要接入网络,就需要将这个主机的IP和相应的域名注册到数据库中;
- 用户输入域名的时候,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址。
直到现在,用户的计算机仍然保留了 hosts 文件,在域名解析的过程中仍然会有先查找 hosts 文件的内容。
hosts 文件在 etc/ 目录下:
[Xq@again 2024_5]$ cat /etc/hosts
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
172.29.4.55 iZf8zehlq3f9xxevwxuqp2Z iZf8zehlq3f9xxevwxuqp2Z
1.2. 域名简介
域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称。
如 www.xxx.com,域名使用 . 连接:
- www: 是一种习惯用法 (可以省略 ),之前人们在使用域名时,往往命名成类似于 ftp.xxx.xxx / www.xxx.xxx 这样的格式,来表示主机支持的协议;
- xxx: 二级域名,一般是公司或者组织的名称;
- com:一级域名,表示这是一个企业域名,同级的还有 "net" (网络提供商)、"org" (非营利组织)、"edu" (教育机构) 等等。
1.3. 域名解析过程
在域名解析过程中,当用户在浏览器中输入一个域名时,操作系统会发送查询到本地DNS解析器。本地解析器会首先查找自身的缓存,如果有对应的IP地址则直接返回给用户;如果没有,则向根DNS服务器发起查询。根DNS服务器会返回顶级域名服务器的IP地址,然后本地解析器继续向顶级域名服务器查询,直到找到目标域名的IP地址,并返回给用户。整个过程可能会经过多次查询和转发,直到最终获取到目标域名的IP地址为止,这样用户就可以通过域名访问相应的服务或网站。
2. ICMP
ICMP 是一个网络层协议,在TCP/IP四层协议栈中的位置:
可以看到,ICMP和IGMP属于网络层协议,但是它们两都在IP协议的上层,而我们以前学习过数据链路层,知道 ARP 和 RARP 协议也属于数据链路层,但是它们两在MAC帧的上层。
2.1. ICMP 的功能
- 确认IP数据报是否成功到达目标主机;
- 通知在发送过程中IP数据报被丢弃的原因;
- ICMP只能搭配IPv4使用,如果是IPv6的情况下,需要用ICMPv6。
比如:
主机A要将数据跨网络传输给主机B,因此,需要将数据通过路由器一跳一跳的将数据路由到目标主机,假设已经到达主机B所在的网络 (目标网络) 的入口路由器 (路由器c),由于此时只知道主机B的IP地址,而不知道主机B的MAC地址 (无法构成MAC数据帧 (有效载荷是IP数据报)),故路由器c向当前网段广播发送MAC数据帧 (数据帧的有效载荷是 ARP 请求报文),但由于主机B已经关机,无法对ARP请求做出响应,因此,当路由器c多次发送ARP请求报文没有得到响应时,此时路由器c就会构建一个 Destination Unreachable 的 ICMP 响应返回给主机A,此时主机A就知道数据无法发送给主机B,即目标不可达。
2.2. ICMP 的报文格式
ICMP 大概分为两类报文:
- 一类是通知出错原因;
- 一类是用于诊断查询。
ICMP的常见类型如下:
类型 (十进制数) | 内 容 |
0 | 回送应答 ( Echo Reply ) |
3 | 目标不可达 ( Destination Unreachable ) |
4 | 原点抑制 ( Source Quench ) |
5 | 重定向或改变路由 ( Redirect ) |
8 | 回送请求 ( Echo Request ) |
9 | 路由器公告 ( Router Advertisement ) |
10 | 路由器请求 ( Router Solicitation ) |
11 | 超时 ( Time Exceeded ) |
17 | 地址子网请求 ( Address Mask Request ) |
18 | 地址子网应答 ( Address Mask Reply ) |
2.3. ping 命令
ping 命令的底层采用的就是ICMP协议,是一个利用ICMP协议来进行网络连通性测试的工具。一般情况下,用于测试本地主机和目标主机的网络连通是否正常。具体来说:本地主机发送ICMP Echo请求消息 (Echo Request),然后等待目标主机返回Echo回应消息 (Echo Reply) 来判断主机间的网络连接状态。
比如:
不过需要注意的是:
- 此处 ping 的是域名,而不是URL,因为域名可以通过DNS获得IP地址,所以这里本质上还是在 ping IP地址 (目的IP);
- 同时,ping 命令不光能检测网络的连通性,同时也会统计响应时间和TTL (IP报头的 Time To Live,IP数据报的生命周期);
- ping 命令会向目标主机发送一个 ICMP Request;
- 目标主机收到后,会返回一个 ICMP Reply。
如图所示:
一个小细节:有人会问一个问题,telnet 是23号端口,ssh 是22号端口,那么 ping 是什么端口呢?
因为 ping 命令是基于ICMP协议的,而ICMP协议归属于网络层 (IP的上层,传输层下面),而端口号是传输层的内容,在网络层不关心端口号这样的信息,换言之,ICMP 根本就不关心端口号;
2.4. traceroute 命令
traceroute 命令也是基于ICMP协议实现的,能够打印出本地主机到目标主机之前经历的路由器,如下:
traceroute 命令的实现原理是通过发送一系列的UDP数据报到目标主机,每个数据报将在网络中经过不同的路由器。每个数据报的TTL(Time to Live)字段会被设置为不同的值,从而在每一跳路由器上会减少该值,如果TTL值减至0,则路由器会丢弃该数据报并发送一个ICMP时间超时消息回到发送端。通过接收这些ICMP时间超时消息,traceroute命令得以确定每一跳经过的路由器,最终得到整个路由路径。
3. NAT和代理服务器
3.1. NAT 技术
NAT 技术,全称 Network Address Translation,网络地址转换,是一种网络技术,用于将私有网络内部的IP地址转换为上级网络(公共网络)可识别的IP地址。
在学习IP协议的时候,我们说过,IPv4 用32个比特位表示IP地址,其IP数量接近43亿,但在当前网络环境中,已远远不够了,因此,为了解决 IPv4 地址不足的问题,NAT 就在这样的环境中诞生了。NAT 技术是当前网络环境中解决IP地址不足的主要手段,一般的路由器都会内置NAT功能,因此,路由器也可以称之为NAT服务器。
3.2. NAT IP转换过程
下面我们来看看,NAT是如何转化的呢?
如下图所示:
主机A要与公网上的一台主机进行通信,主机A将数据通过路由器路由到了公网的入口路由器,此时,因为数据中的源IP是私网IP,私网IP不能出现在公网中,因此,路由器进行NAT技术,将源IP替换成当前路由器的WAN口IP,此时,源IP和目的IP都是公网IP。
服务器收到数据后,也要对数据进行响应,即要向主机A发送响应数据:
当服务器发送响应数据时,目的IP是入口路由器的WAN口IP,数据到达了NAT路由器后,路由器会将目的IP转化成当前子网中的某台主机,在NAT路由器内部,有一张自动生成的,用于地址转换的映射表,当主机A (192.168.1.199) 第一次公网服务器 (132.1553.22.3)发送数据时,就会向映射表中添加映射关系。
可是现在有一个问题,当公网中的服务器构建响应数据返回时,目的IP都是相同的,即路由器的WAN 口IP,那么此时路由器如何判定这个数据应该转发给当前子网 (192.168.1.0) 中的哪个主机呢?就如同上图一样,当数据到达路由器后,路由器怎么判定将数据转发给主机A,而不是主机B呢?
这时候就需要NATP来解决这个问题,使用 IP + Port 来建立这个映射关系。
事实上,在NAT的转换工程中,可不仅仅会替换IP地址,必要的时候,端口也会被替换;同时,除了替换工作,还会为我们根据报文请求的四元组 (源IP:源端口; 目的IP:目的端口),构建一张表,这张表是NAT转化表,用来维护它们的映射关系,如下图所示:
IP表示唯一的一台主机,端口表示该主机上唯一的一个进程,因此, 源IP + 源端口标识一个唯一的进程,进而可以在自己的内网中的唯一性。
无论从内网到外网, 还是从外网向内网,都能在各自的网络中表示唯一性, 所以,这个映射关系是:互为键值 (Key) 的。
这种关联关系也是由NAT路由器自动维护的。例如在TCP的情况下,建立连接时,就会生成相关表项;在断开连接后,就会删除相关表项;
而我们能理解一件事情了,不同子网的两台主机理论上是不能直接通信的,比如主机A和主机B要通信,主机A首先需要将数据发送到公网的某台主机,再通过公网的某台主机将数据返回给主机B。比如,在生活中,用户通过某个聊天软件聊天,用户首先需要登录聊天软件的客户端,通过客户端先将数据推送到服务端 (公网) ,服务端在将数据推送给其他人。
3.3. NAT 技术的缺陷
由于NAT需要依赖这张转换表,因此就有许多限制:
- 无法从NAT外部向内部服务器建立连接,需要先从内部访问外部;
- 转换表的生成和销毁都需要额外开销;
- 通信过程中一旦NAT设备异常,即使存在热备,所有的TCP连接也都会断开。
3.4. 代理服务器
代理服务器是一种位于客户端和目标服务器之间的服务器,它充当客户端和目标服务器之间的中间人,用于转发客户端的请求并获取目标服务器的响应。
代理服务器分为正向代理服务器和反向代理服务器。
3.4.1. 正向代理服务器
正向代理服务器是指位于客户端和目标服务器之间的代理服务器,用于代理客户端向目标服务器发起请求。客户端不直接与目标服务器通信,而是通过正向代理服务器转发请求,如下图所示:
在日常生活中,正向代理服务器是经常被使用的,比如学校的校园网本质上就是一个正向代理服务器,学生使用校园网时,通常需要先登录学校提供的校园网登陆网站 (当然,一般情况下,学生需要先交网费),这个动作本质上就是在正向代理服务器发起请求,校园网认证成功后 (学生的机器成功获取私网IP),学生就可以正常上网了,后序学生的所有访问都是通过学校提供的正向代理服务器向公网上的服务器发起请求,换言之,学校是可以知道学生在访问什么资源,因此,对于一些隐私内容或者敏感内容,谨慎使用校园网哦。
正向代理服务器可以帮助客户端访问被限制的内容或提高访问速度,同时也用于保护客户端的隐私,常见的使用场景包括绕过访问限制、访问跨境内容 (比如 fq) 等。正向代理服务器是网络中常见的代理方式之一,对于网络访问具有重要作用。
3.4.2. 反向代理服务器
反向代理服务器是指位于目标服务器和客户端之间的代理服务器,用于代理客户端对目标服务器的请求。客户端不直接与目标服务器通信,而是通过反向代理服务器转发请求,隐藏目标服务器的真实IP地址,如下:
通常情况下,一般大型互联网公司有自己的机房,机房中有着非常多的服务器,但是这种互联网公司对外提供的域名 (公网IP地址) 是固定的,为什么呢?
事实上,这些互联网公司对外提供的域名 (公网IP地址) 本质上是反向代理服务器的域名 (IP地址),反向代理服务器不处理客户端的请求,它只负责将客户端请求合理的分配给后台的服务器,后台服务器处理完数据后,再将响应数据返回给客户端。
反向代理服务器的好处:
负载均衡:反向代理服务器可以根据一定的策略将请求分发给后台的多台服务器,从而实现负载均衡,提高整个系统的吞吐量和性能;
高可用性:通过反向代理服务器,即使某台后台服务器发生故障,仍然可以将请求转发给其他健康的服务器,保证系统的可用性;
安全性:反向代理服务器可以作为一个安全防火墙,屏蔽一些恶意请求和攻击,保护后台服务器的安全,提高系统的安全性;
隐藏真实服务器信息:通过反向代理服务器,可以隐藏后台服务器的真实IP地址,增加系统的安全性,防止直接被攻击。
3.4.3. 正向代理服务器和反向代理服务器的异同
相同点:
正向代理服务器和反向代理服务器都是位于客户端和目标服务器之间的,都用来将客户端请求转发给目标服务器。
异同点:
- 正向代理是代理客户端,代替客户端访问目标服务器的资源,隐藏客户端的真实IP地址;反向代理是代理目标服务器,帮助目标服务器实现负载均衡和安全防护等工作。
- 正向代理,目标服务器认为正向代理服务器就是客户端;反向代理,客户端认为反向代理服务器就是真正的目标服务器。
3.4.4. NAT 和 反向代理服务器的区别
- 从应用上讲,NAT设备是网络基础设备之一,解决的是IP不足的问题,而代理服务器则是更贴近具体应用,比如通过代理服务器进行fq,另外一些加速器,也是使用代理服务器;
- 从底层实现上讲,NAT是工作在网络层,直接对IP地址进行替换 (也可以替换端口号,因为当今路由器已经可以工作在传输层,甚至应用层),而代理服务器往往工作在应用层;
- 从使用范围上讲,NAT一般在局域网的出口部署,代理服务器可以在局域网做,也可以在广域网做,也可以跨网;
- 从部署位置上看,NAT一般集成在路由器等硬件设备上,代理服务器则是一个软件程序,需要部署在服务器上;
4. 网络总结
TCP/IP 四层协议栈如下所示:
数据链路层:
- 数据链路层的作用:两个设备(同一种数据链路节点)之间进行转发数据;
- 以太网帧格式;
- 理解 MAC 地址;
- 理解 arp 协议;
- 理解MTU和MSS。
网络层:
- 网络层的作用:在复杂的网络环境中确定一个合适的路径 (提供一种能力)。
- 理解IP地址,理解IP地址和MAC地址的区别;
- 理解IP协议格式;
- 了解网段划分;
- 理解如何解决IP数目不足的问题,掌握网段划分的两种方案,理解私有IP和公网IP;
- 理解网络层的IP地址路由过程,理解一个IP数据报如何跨越网段到达最终目的地;
- 理解IP数据报分包的原因;
- 了解ICMP协议;
- 了解NAT设备的工作原理。
传输层:
- 传输层的作用:负责将数据能够从发送端传输到接收端,如果是TCP,那就可靠传输;
- 理解端口号的概念;
- 认识UDP协议,了解UDP协议的特点;
- 认识TCP协议,理解TCP协议如何实现可靠性,理解TCP协议的 (连接管理过程中) 的状态转化;
- 掌握TCP的连接管理,确认应答,超时重传,滑动窗口,流量控制,拥塞控制,延迟应答,捎带应答等机制;
- 理解面向字节流,理解粘包问题和解决方案;
- 能够基于UDP实现可靠传输;
- 理解MTU对UDP/TCP的影响,例如TCP的MSS。
应用层:
- 应用层的作用:满足我们日常需求的网络程序,比如我们所说的业务,就是在应用层;
- 能够根据自己的需求,设计应用层协议;
- 了解 HTTP 和 HTTPS 协议;
- 理解 DNS 的原理和工作流程。