DNS
我们平常在访问某个网站时不使用IP地址,而是用一串由罗马字和点号组成的字符串。而一般用户在使用TCP/IP进行通信时也不使用IP地址。能够这样做是因为有了DNS(Domain Name System,域名系统)功能的支持。DNS可以将那字符串自动转换为具体的IP地址。
这种DNS不仅适用于IPv4,还适用于IPv6。
因为IP地址由一串数据序列组成,并不好记。
于是人们发明了一种叫做主机名的东西,是一个字符串,并且使用hosts文件来描述主机名和IP地址的关系。
在互联网的起源ARPANET中,起初由互联网信息中心(SRI-NIC)整体管理一份hosts文件。如果新增一台计算机接入到ARPANET网或者已有的某台计算机要进行IP地址变更,中心的这个hosts文件就得更新,而其他计算机则不得不定期下载最新的hosts文件才能正常接入网络。
然而,随着网络规模的不断扩大,接入计算机的数量不断增加,使得这种集中管理主机名和IP地址的登录、变更处理的可行性逐渐降低。
在上述背景下,DNS应运而生:
- 一个组织的系统管理机构,维护系统内的每个主机的IP和主机名的对应关系。
- 如果新计算机接入网络,将这个信息注册到数据库中。
- 用户输入域名的时候,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址。
至今,我们的计算机上仍然保留了这个hosts文件。在域名解析的过程中仍然会优先查找hosts文件的内容。
cat /etc/hosts
域名简介
域名解析服务器采用分布式存储。全世界根域名服务器只有13台(组)。分布式好处:提高解析速度/提高容灾能力。
- 顶级域名:.com(商业)、.org(公益)、.edu(教育)、.cn(中国)、.jp(日本)、.us(美国)。
- 二级域名:.qq.com、.baidu.com。
- 三级域名:.zhidao.baidu.com、.image.baidu.com。
域名解析流程
- 检测本机host文件。
- 检测本地DNS解析器缓存。
- 向本地DNS服务器发起请求。谷歌DNS服务器为(8.8.8.8),百度DNS服务器(180.76.76.76),默认走的都是运营商的DNS服务器。
可以使用dig命令查看域名解析过程:
安装dig工具。
[sss@aliyun ~]$ sudo yum install dig
使用dig指令查看域名解析过程:
dig www.baidu.com
- 开头位置是dig指令的版本号。
- 第二部分是服务器返回的详情,重要的是参数status,NOERROR表示查询成功。
- QUESTION SECTION表示要查询的域名是什么?
- ANSWER SECTION表示查询的结果是什么。这个结果先将www.baidu.com查询成了www.a.shifen.com,再将www.a.shifen.com查询成了两个IP地址。
- 最下面是一些结果统计,包含查询时间和DNS服务器的地址等。
输入URL后,发生了什么?
- DNS解析。
- 组织HTTP请求信息。
- 建立TCP客户端发送HTTP请求。
- 网络层IP协议。
- 链路层的以太网协议。
ICMP
ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的信息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
辅助IP的ICMP
架构IP网络时需要特别注意两点:确认网络是否连接正常,以及遇到异常时进行问题诊断。
例如:
一个刚刚搭建好的网络,需要验证该网络的设置是否正确。此外,为了确保网络能够按照预期正常工作,一旦遇到什么问题需要立即制止问题的蔓延。为了减轻网络管理员的负担,这些都是必不可少的功能。
ICMP正是提供这类功能的一种协议。
ICMP的功能
- 确认IP包是否成功到达目标地址。
- 通知在发送过程中IP包被丢弃的原因。
- ICMP也是基于IP协议工作的,但是它并不是传输层的功能,因此人们仍然把它归结为网络层协议。
- ICMP只能搭配IPv4使用,如果是IPv6的情况下,需要使用ICMPv6。
如下图所示:
主机A向主机B发送了数据包,由于某种原因,途中的路由器2未能发现主机B的存在,这时,路由器2就会向主机A发送一个ICMP包,说明发往主机B的包未能成功。
ICMP的这种通知消息会使用IP进行发送。因此,从路由器2返回的ICMP包会按照往常的路由控制先经过路由器1在转发给主机A。收到该ICMP包的主机A则分解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) |
ping命令
- 注意,此处ping的是域名,而不是URL!一个域名可以通过DNS解析成IP地址。
- ping命令不光能验证网络的连通性,同时也会统计响应时间和TTL(IP包中的Time To Live,生存周期)。
- ping命令会先发送一个ICMP Echo Request给对端。
- 对端接收到之后,会返回一个ICMP Echo Reply。
telnet是23端口,ssh是22端口,那么ping是什么端口?
注意:ping命令基于ICMP,是在网络层。端口号,是传输层的内容。在ICMP中根本不关注端口号这样的信息。
traceroute命令
也是基于ICMP协议实现,能够打印出可执行程序主机到达目标主机之间经历了多少路由器。
NAT
之前我们讨论过,IPv4协议中,IP地址数量不够用的问题。
NAT(Network Address Translation,网络地址转换)技术是当前解决IP地址不够用的主要手段,是路由器的一个重要功能。
- NAT能够将私有IP对外通信时转为全局IP。也就是一种将私有IP和全局IP相互转化的技术方法。
- 很多学校、家庭、公司内部采用每个终端设置私有IP,而在路由器或必要的服务器上设置全局IP。
- 全局IP要求唯一,但是私有IP不需要;在不同的局域网中出现相同的私有IP是完全不影响的。
NAT工作机制
- NAT路由器将源地址10.0.0.0.10替换成全局的IP地址202.244.274.37。
- NAT路由器收到外部的数据时,又会到目标IP从202.244.174.37替换回10.0.0.10。
- 在NAT路由器内部,有一张自动生成的,用于地址转换的表。
- 当10.0.0.10向163.221.120.9发送数据时就会生成表中的映射关系。
NAPT
问题来了,如果在局域网内,有多个主机都访问同一个外网服务器,那么对于服务器返回的数据中,目的IP都是相同的,那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机呢?
这时候,提出了NAPT(Network Address Ports Translation,网络端口地址替换),使用IP + Port来建立这个关联关系。
主机163.221.120.9的端口号是80,LAN中有两个客户端10.0.0.10和10.0.0.11同时进行通信,并且这两个客户端的本地端口都是1025。此时,仅仅转换IP地址为某个全局地址202.244.274.37,会令转换后的所有数字完全一致。为此,只要将10.0.0.11的端口号映射为1026就可以解决问题。
这种关联关系也是由NAT路由器自动维护的。例如在TCP的情况下,建立连接时,就会生成这个表项;在断开连接后,就会删除这个表项。
NAT潜在问题
由于NAT(NAPT)都依赖于自己的转换表,因此会有如下几点问题:
- 无法从NAT的外部向内部服务器建立连接。
- 转换表的生成与转换操作都会产生一定的开销。
- 通信过程中一旦NAT遇到异常需要重启时,所有的TCP连接都将被重置。
- 即使配置两台NAT做容灾备份,TCP连接还是会被断开。
NAT潜在问题的解决
解决NAT上述潜在的问题有两种方法:
- 改用IPv6,在IPv6的环境下可用的IP地址范围有了极大的扩展,以至于公司或家庭中的所有设备都可以配置一个全局IP地址。使用NAT就是以地址复用的方式来解决地址不够用的问题,如果地址完全够用的话,就不用使用NAT技术了。但是IPv6的普及到现在为止都远不及人们的预期。
- 即使是在一个没有NAT的环境里,根据所制作的应用,用户可以完全忽略NAT的存在而继续进行通信。在NAT内侧(私有IP地址的一边)主机上运行的应用为了生成NAT转换表,需要先发送一个虚拟的网络包给NAT的外侧。而NAT并不知道这个虚拟包究竟是什么,还是会照样读取包首部中的内容并自动生成一个转换表。这时,如果转换表构造合理,那么还能实现NAT外侧的主机与内侧的主机建立连接进行通信。有了这个方法,就可以让那些出在不同NAT内侧的主机之间也能够进行相互通信。此外,应用还可以与NAT路由器进行通信生成NAT表,并通过一定的方法将NAT路由器上附属的全局IP地址传给应用。
如此一来,NAT外侧与内侧可以进行通信,这种现象叫做NAT穿越。于是NAT那个无法从NAT的外部向内部服务器建立连接的问题也就迎刃而解了。而且这种方法与已有的IPv4环境的兼容非常好,即使不迁移到IPv6也能通信自如。处于这些优势,市面上已经出现了大量与NAT紧密结合的应用。
然而,NAT友好的应用程序也有它的问题。例如,NAT的规范越来越复杂,应用的实现变得更耗时。而且应用一旦运行在一个开发者未预想到的特殊网络环境中时,会出现无法正常工作、遇到状况时难于诊断等问题。
NAT和代理服务器
路由器往往都具备NAT设备的功能,通过NAT设备进行中转,完成子网设备和其他子网设备的通信过程。
代理服务器看起来和NAT设备有一点像。客户端向代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器;服务器返回结果后,代理服务器又把结果回传给客户端。
NAT和地阿里服务器的区别?
- 从应用上讲,NAT设备是网络基础设施之一,解决的是IP不足的问题。代理服务器则是更贴近具体应用,比如通过代理服务器进行翻墙,另外像迅游这样的加速器,也是使用代理服务器。
- 从底层实现上讲,NAT工作在网络层,直接对IP地址进行替换。代理服务器往往工作在应用层。
- 从使用范围上讲,NAT一般在局域网的出口部署,代理服务器可以在局域网做,也可以在广域网做,也可以跨网。
- 从部署位置上看,NAT一般集成在防火墙,路由器等硬件设备上,代理服务器则是一个软件程序,需要部署在服务器上。
代理服务器是一种应用比较广的技术:
- 翻墙:广域网中的代理。
- 负载均衡:局域网中的代理。
负载均衡,英文名为Load Balance,其含义就是将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务程序和其它主要任务服务器等,从而协同完成工作任务。
负载均衡构建在原有网络结构上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。
代理服务器分为正向代理和反向代理。
举例说明:
假如我女朋友很喜欢韩国的化妆品。
我国我自己去韩国买是很不方便的,但是可以让我在韩国的表姐去超市买了寄给我,此时超市看到的卖家是我表姐,我的表姐就是“正向代理”。
后来找我表姐买化妆品的人太多了,我表姐觉得天天去超市太麻烦,干脆去超市买了一大批化妆品屯在家里,如果有人来找她代购,就直接把屯在家里的货发出去,而不必再去超市,此时我表姐就是“反向代理”。
正向代理用于请求的转发(例如借助代理绕过反爬虫)。
反向代理往往作为一个缓存。