一、DNS(Domain Name System)
DNS 是一整套从域名映射到 IP 的系统。
1、DNS 背景
TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序,但是 IP 地址不方便记忆。于是人们发明了一种叫主机名的东西,是一个字符串,并且使用 hosts 文件来描述主机名和 IP 地址的关系。
- DNS 是应用层协议
- DNS 底层使用 UDP 进行解析
- 浏览器会缓存 DNS 结果
- 一个组织的系统管理机构,维护系统内的每个主机的 IP 和主机名的对应关系。
- 如果新计算机接入网络,将这个信息注册到数据库中。
- 用户输入域名的时候,会自动查询 DNS 服务器,由 DNS 服务器检索数据库,得到对应的 IP 地址。
至今,我们的计算机上仍然保留了 hosts 文件。在域名解析的过程中仍然会优先查找 hosts 文件的内容。
查看 hosts 文件内容命令:cat /etc/hosts
2、域名简介
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称,例如:www.baidu.com。域名使用 . 来连接
- com:一级域名,表示这是一个企业域名。同级的还有 .net(网络提供商),.org(开源组织或非盈利组织)等。
- baidu:二级域名,公司名。
- www:只是一种习惯用法。之前人们在使用域名时,往往命名成类似于 ftp.xxx.xxx/www.xxx.xxx 这样的格式来表示主机支持的协议。
3、域名解析服务
为什么要有域名呢?
域名可以让用户用起来更方便,辨识度更高。
例如:百度的域名是 36.152.44.96,但是这对普通人来说不友好,还是 www.baidu.com 对普通人友好。
但是这个影响的范围太小了,所以后来就有了组织把全世界的主机名和 IP 地址的映射关系全部写成了一套网络服务,这个网络服务允许任何人请求,然后把域名转换成 IP 地址返回去。也叫做域名解析服务。
通过域名得到 IP 地址后才向网络发起请求,这个工作是我们自己安装的软件完成的。
4、从输入网址到获得页面的过程
浏览器中输入 url 后,会发生什么事情?
- DNS 解析获得 IP 地址。
- 浏览器获得域名对应的 IP 地址以后,浏览器向服务器请求建立链接,发起三次握手。
- TCP/IP 链接建立起来后,浏览器向服务器发送 HTTP 请求。
- 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器。
- 回答整体结构,重点放在应用层 HTTP、HTTPS,部分涉及到 TCP。
拿 HTTP 来说,首先浏览器要想办法进行三次握手,先把连接建立好,紧接着浏览器要结合用户请求构建 HTTP 请求。HTTP 请求里面涉及到 HTTP 格式,构建一个 HTTP request,该 request 经过已经建立好的 TCP 连接,将连接推送至服务器,之后服务器经过我们的对应的读将请求全部读至应用层,读上来之后对 HTTP 请求做分析,提取我们要访问的资源和该次请求对应的请求方法。进而定位到对应资源,在服务端将资源打开。通过服务器的方式构建 HTTP 响应,将 HTTP 响应再通过网络推送给浏览器端,浏览器端拿到响应后,也正常进行读取,读取到完整的响应,然后对响应的报头和有效载荷进行解析。尤其是对报头解析出来,请求内容、返回内容,假设是一张网页,把网页交给浏览器,浏览器再对网页内容进行解释,最后就可以呈现出网页的效果。
应用层:介绍 HTTP 协议的请求(构建和发送过程)和响应格式,建立好连接后就可以交换请求和响应,有些浏览器在请求之前可能要先做 DNS 域名解析,得到 IP 后才能向目的 IP 和目的端口发送请求,关于请求有 GET 和 POST 方法。关于请求和响应里面常见的字段有:状态码,Cookie 和 Session。以及序列和反序列化、读取到完整报文(数据包粘包问题)。
然后关于连接的过程和信息传输的过程可能出现问题(数据丢包、拥塞控制、数据路由),然后就可以讲下面几层。
可以参考:当你在浏览器地址栏输入一个URL后回车,将会发生的事情?_url在浏览器 按下回车 七层协议-CSDN博客
5、使用 dig 工具分析 DNS 过程
(1)安装 dig 工具
命令:sudo yum install bind-utils
(2)使用 dig 指令查看域名解析过程
- 开头位置是 dig 指令的版本号。
- 第二部分是服务器返回的详情,重要的是 status 参数,NOERROR 表示查询成功。
- QUESTION SECTION 表示要查询的域名是什么。
- ANSWER SECTION 表示查询结果是什么。这个结果先将 www.baidu.com 查询成了 www.a.shifen.com,再将 www.a.shifen.com 查询成了两个 ip 地址。
- 最下面是一些结果统计,包含查询时间和 DNS 服务器的地址等。
二、ICMP 协议
ICMP 协议是一个网络层协议。
一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通。但是 IP 协议并不提供可靠传输,如果丢包了,IP 协议并不能通知传输层是否丢包以及丢包的原因。
1、ICMP 功能
IP 协议不仅仅要有通信能力,还需要有故障排查能力。
ICMP 是一个处于网络层和传输层之间的协议,它主要是用来确认报文是否丢失。
ICMP 的主要功能包括:
- 确认 IP 包是否成功到达目标地址。
- 通知在发送过程中 IP 包丢弃的原因。
- ICMP 也是基于 IP 协议工作的,但是它并不是传输层的功能,因此人们仍然把它归结为网络层协议。
- ICMP 只能搭配 IPv4 使用,如果是 IPv6 的情况下,需要使用 ICMPv6。
比方说主机 A 和主机 B 之间有多个路由器,但是数据在最后一个路由器到达不了 B,此时这路由器就会多次发送 ARP 请求如果还得不到应答,最后就会返回信息给主机 A。此时主机 A就知道自己发送的数据无法到达主机 B。
2、ICMP 的报文格式(了解)
- 一类是通知出错原因。
- 一类是用于诊断查询。
3、ping 命令
(1)Windows 下
(2)Linux 下
注意:
- 此处 ping 的是域名,而不是 url。一个域名可以通过 DNS 解析成 IP 地址。
- ping 命令不光能验证网络的连通性,同时也会统计响应时间和 TTL(IP包中的Time To Live,生存周期)。
- ping 命令会先发送一个 ICMP Echo Request 给对端。
- 对端接收到之后,会返回一个 ICMP Echo Reply。
所以,ping 命令底层是通过 ICMP 协议设置 TTL(跳数)来检测网络连通性。
3、ping 的端口号(注意)
telnet 对应的端口号是 23,ssh 对应的端口号是 22,那么 ping 对应的端口号是多少呢?
ping 命令基于 ICMP,是在网络层,而端口号是传输层的内容。在 ICMP 中根本就不关注端口号这样的信息,所以 ping 根本没有端口号,ping 命令实际是绕过了传输层的直接访问底层 ICMP 协议的一种做法。
4、traceroute 命令
也是基于 ICMP 协议实现,能够打印出可执行程序主机,一直到目标主机之前经历多少路由器。
三、NAT 技术
1、NAT 技术背景
在讲 IP 协议的时候说过 IPv4 协议的 IP 地址数量不足的问题,而 NAT 技术就是当前解决 IP 地址不够用的主要手段,是路由器的一个重要功能。
NAT(网络地址转换)技术,是解决 IP 地址不足的主要手段,并且能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
- NAT 能够将私有 IP 对外通信时转为全局 IP,也就是一种将私有 IP 和全局 IP 相互转化的技术方法。
- 很多学校、家庭、公司内部采用每个终端设置私有 IP,而在路由器或必要的服务器上设置全局 IP。
- 全局 IP 要求唯一,但是私有 IP 不需要,在不同的局域网中出现相同的私有IP是完全不影响的。
2、NAT IP 转换过程
- 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 发送数据时就会生成表中的映射关系。
(1)数据包从局域网到公网的过程
这个在之前的 IP 协议的网段划分讲过,其实就是当数据包到达家用路由器的时候,路由器会把源 IP 替换成 WAN 口 IP。
此时目标服务器收到了数据包,然后构成响应,现在要返回给我们自己的主机,但是这个响应信息只能返回到运营商路由器,那么如何从运营商服务器转发到我们自己的主机呢?
因为一个局域网内多台主机都同时访问一台外网服务器,此时服务器返回的数据中所有的目的IP都是相同的(发送的过程替换了源 IP),所以就不知道返回给局域网中哪台主机(路由器)了。
3、NAPT(地址转换表)
如果局域网内有多个主机都访问同一个外网服务器,那么对于服务器返回的数据中,目的 IP 都是相同的。那么 NAT 路由器如何判定将这个数据包转发给哪个局域网的主机?
NAPT 就能很好的解决数据返回的问题, 使用 IP + port 来建立这个关联关系。
- 其实路由器在进行源地址转换过程中,可能不仅仅只改变了源 IP,必要的时候,源端口也要被替换,还维护了一张地址转化表。
- 路由器在 NAT 转换的过程中,除了单纯的替换,还会为我们根据报文请求的四元组,为我们构建一个映射关系。
- 源 IP 表示唯一的一台主机,源端口表示该主机上唯一的一个进程,所以 源 IP + 源端口表示唯一的一个进程 —— 自己在自己的内网中的唯一性。
- 无论从内向外,还是从外向内,都能在各自的网络中表示唯一性。所以,这个映射关系是互为 key 值得。
如果从来没有访问过外网,那外网可以直接访问内网吗?
理论上来说是不能得。但是有很多基于 NAT 原理的软件可以帮助我们进行从外网访问内网 —— 内网穿透。
这两个家用路由器在转发到运营商路由器的时候,此时运营商路由器就会建立地址转化表:
左侧表里面的就是 IP:端口的四元组形式,标识了局域网内的唯一一台主机。
右侧就是替换完成后的源地址和目标地址。
这样就构成了一组互为键值的映射表。
这种关联关系也是由 NAT 路由器自动维护的。例如在 TCP 的情况下,建立连接时就会生成这个表项;在断开连接后,就会删除这个表项。
这里讲一以下端口号相同的问题,有可能同一个局域网的两台主机用的同一个客户端(有相同的端口号)相同, 此时进过外网路由器,要替换源 IP,这样就导致了区分不了这两台主机了。解决办法就是向外转发的时候发现两个主机有相同的端口号,那么就在转发出去的时候改变端口号。
所以,NAT 路由器除了做 WAN 口 IP 的替换,还会进行端口号的替换。
在数据进行转发的时候每个路由器都会维护一张 NAPT 地址转换表。
如果一台主机从来都没有访问过外网的服务器,那么这个服务器能够找到这台主机吗?
不能,因为路由器没有建立映射关系,所以找不到。
无法从 NAT 外部向内部服务器建立连接,因为外部无法知道内部的私网 IP,也就无法主动与内部服务器建立连接。
4、NAT 技术的缺陷
由于 NAT 依赖这个转换表,所以有很多的限制:
- 无法从 NAT 外部向内部服务器建立连接。
- 装换表的生成和销毁都需要额外开销。
- 通信过程中一旦 NAT 设备异常,即使存在热备,所有的 TCP 连接也都会断开。
5、NAT 和代理服务器
路由器往往都具备 NAT 设备的功能,通过 NAT 设备进行中转,完成子网设备和其他子网设备的通信过程。
代理服务器看起来和 NAT 设备有一点像。客户端像代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器。服务器返回结果后,代理服务器又把结果回传给客户端。
(1)代理服务器
代理服务器的功能就是代理网络用户去取得网络信息,代理服务器又分为正向代理和反向代理。
代理服务器是一种应用比较广的技术。
- 翻墙:广域网中的代理。
- 负载均衡:局域网中的代理。
举例帮助理解:花王尿不湿是产自日本的一个很经典的尿不湿品牌。张三去日本买尿不湿不方便,但是可以让他在日本工作的表姐去超市买了快递给他。此时超市看到的买家是张三的表姐,张三的表姐就是是 “正向代理”。后来找张三表姐买尿不湿的人太多了,他表姐觉得天天去超市太麻烦,干脆去超市买了一大批尿不湿屯在家里,如果有人来找她代购,就直接把屯在家里的货发出去,而不必再去超市,此时张三表姐就是 “反向代理”。
正向代理用于请求的转发( 例如借助代理绕过反爬虫) ,反向代理往往作为一个缓存。
A. 正向代理
客户端并不直接访问目标服务器,而是先访问代理服务器,由代理服务器代替客户端去访问对应的目标服务器,并将目标服务器的响应结果返回给客户端。
当多台主机都要访问外网的同一个资源,那么正向代理服务器就可以将对应的资源缓存到本地,此时当其他主机要访问该资源时,直接在正向代理服务器就可以获取,而不需要再次进行外网访问。
B. 反向代理
对于客户端而言,反向代理服务器就相当于目标服务器,它不做任何业务的处理,只负责将请求推送到后端的指定主机。用户不需要知道目标服务器的地址,用户只需要访问反向代理服务器就可以获得目标服务器提供的服务。
比如域名 www.baidu.com 对应的服务器实际就是一个反向代理服务器。
百度内部实际并不是只有一台服务器,但不同地区的人们都可以通过访问 www.baidu.com 享受到百度提供的服务,实际我们访问的就是百度的反向代理服务器。
当这台反向代理服务器收到客户端的数据请求后,就会将我们的数据请求转发给百度内部的某台服务器进行数据处理,然后再将数据处理的结果返回给客户端。
C. 正向代理和反向代理的关系
对于客户端而言,离客户端近的就是正向代理,离服务端近的就是反向代理。
正向代理代理的是客户端,反向代理代理的是服务端,一个为客户端服务,一个为服务端服务,在区别上非常明显,如下图:
不同点:
正向代理是客户端的代理,帮助客户端访问其无法访问的服务器资源的,而反向代理则是服务器的代理,帮助服务器做负载均衡、安全防护等工作的。
正向代理中,服务器不知道真正的客户端到底是谁,服务器认为正向代理服务器就是真实的客户端,而反向代理中,客户端不知道真正的服务器是谁,客户端认为反向代理服务器就是真实的服务器。
(2)NAT 和代理服务器的区别
NAT 和代理服务器都是代替我们向服务器发起数据请求的,但它们有如下区别:
- 从应用上讲,NAT 设备是网络基础设备之一(必须的),解决的是 IP 不足的问题。代理服务器则是更贴近具体应用,比如通过代理服务器进行翻墙,另外像迅游这样的加速器,也是使用代理服务器。
- 从底层实现上讲,NAT 工作在网络层,直接对 IP 地址进行替换,而代理服务器往往工作在应用层。
- 从使用范围上讲,NAT 一般在局域网的出口部署,代理服务器可以在局域网做,也可以在广域网做,也可以跨网。
从部署位置上看,NAT 一般集成在防火墙,路由器等硬件设备上,代理服务器则是一个软件程序,需要部署在服务器上。