1.DNS
DNS是一整套从域名映射到IP的系统
1.1 DNS背景
TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序,但是IP地址不方便记忆,例如我们想访问百度就会在浏览器中输入baidu.com而不是百度的IP地址。于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系。
最初, 通过互连网信息中心(SRI-NIC)来管理这个hosts文件的.
- 如果一个新计算机要接入网络, 或者某个计算机IP变更, 都需要到信息中心申请变更hosts文件.
- 其他计算机也需要定期下载更新新版本的hosts文件才能正确上网
这样就太麻烦了, 于是产生了DNS系统.
- 一个组织的系统管理机构, 维护系统内的每个主机的IP和主机名的对应关系
- 如果新计算机接入网络, 将这个信息注册到数据库中;
- 用户输入域名的时候, 会自动查询DNS服务器, 由DNS服务器检索数据库, 得到对应的IP地址.
至今, 我们的计算机上仍然保留了hosts文件. 在域名解析的过程中仍然会优先查找hosts文件的内容
我们可以使用cat /etc/hosts命令来查看我们的hosts文件
1.2 域名简介
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称例如www.baidu.com
- com: 一级域名. 表示这是一个企业域名. 同级的还有 "net"(网络提供商), "org"(非盈利组织) 等.
- baidu: 二级域名, 公司名.
- www: 只是一种习惯用法. 之前人们在使用域名时, 往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式, 来表示主机支持的协议.
1.3 域名解析过程
当我们使用浏览器输入一个url时,如何完成域名解析的过程。
- 1.本地电脑会检查浏览器的DNS缓存中是否有这个url对应的IP地址,如果有整个解析过程结束。
- 2.当浏览器中DNS缓存中没有找到,计算机就会到操作系统的DNS缓存(如内存中的DNS缓存或本地的hosts文件)中去找,如果能找到,整个解析过程结束。
- 3.浏览器向本地配置的域名解析服务器发送查询请求。域名解析服务器一般由运营商提供,如果本地域名解析服务器中能找到,整个解析过程结束。本地域名解析服务器的地址通常通过DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)或手动设置获得。
- 4.如果本地的域名解析服务器没有找到,那么就向根域名服务器发起查询请求。根域名服务器虽然不存储每个域名的具体信息,但它知道每个顶级域名(如.com, .net, .org等)的权威DNS服务器的地址。
- 5.根DNS服务器会告诉本地DNS顶级域名服务器的IP地址。
- 6.本地域名解析服务器根据根域名服务器返回的顶级域名服务器的地址,继续查询该顶级域名服务器。
- 7.顶级域名服务器会返回该域名对应的权威DNS服务器的地址。
- 8.本地域名解析服务器再向权威DNS服务器发起查询。
- 9.得到该域名的IP地址。
- 10.本地域名解析服务器将查询到的IP地址返回给操作系统,并同时缓存该结果,以便下次快速查询。操作系统将IP地址返回给浏览器,浏览器使用该IP地址进行网站访问。
1.4 dig分析DNS解析
-
- 开头位置是 dig 指令的版本号
-
- 第二部分是服务器返回的详情, 重要的是 status 参数, NOERROR 表示查询成功
-
- QUESTION SECTION 表示要查询的域名是什么
-
- ANSWER SECTION 表示查询结果是什么. 这个结果先将 www.baidu.com 查询成了 www.a.shifen.com, 再将www.a.shifen.com 查询成了两个 ip 地址.
-
- 最下面是一些结果统计, 包含查询时间和 DNS 服务器的地址等
2. ICMP协议
ICMP协议是一个 网络层协议
一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因
例如上图的主机A想要给主机B发送消息,如果主机B关机了,当数据到达主机B所在的局域网的路由器中时,路由器首先会在数据链路层构建ARP请求,问局域网中哪一台主机叫做主机B。但是主机B已经下线了,所以路由器注定是收不到ARP响应的,多次之后,路由器就会将zhujiA发送的消息丢弃了。
但是站在主机A的角度上来看,他并不会收到响应,如果传输层使用的是TCP协议,他会认为报文丢失了,或者网络发生拥塞了。于是继续重传报文。但是无论怎么传送都无济于事,因为对方已经下线了。
所以有了ICMP协议,当路由器多次ARP请求无果时,就会给主机A返回一个ICMP包,其中包含了数据包丢失的原因,主机A知道主机B已经下线了,就不会重发浪费资源了。
2.1 ICMP功能
- 确认IP包是否成功到达目标地址.
- 通知在发送过程中IP包被丢弃的原因.
- ICMP也是基于IP协议工作的. 但是它并不是传输层的功能, 因此人们仍然把它归结为网络层协议;
- ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6
上图就是之前说的例子,主机A发送的数据到达主机B所在局域网的路由器2上,路由器2发起多次ARP请求,多次之后收不到响应就会给A返回一个ICMP包告诉主机A,主机B已经下线了。
2.2 ping命令
ping命令是基于ICMP协议实现的,通常用于测试本地主机与另一台主机之间的通信信道是否正常。
我们可以使用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,也就是网络层的,也就是说他不会经过传输层,而是从应用层直接到达网络层(Linux网络编程中使用原始套接字)。
而端口号其实是传输层的概念(传输层为了区分该报文来自哪个进程已经将报文交给哪个进程),所以ping不会有端口号。
3. NAT技术
3.1 技术背景
IPv4协议中, IP地址数量严重不充足,NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能。
- NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法:
- 很多学校, 家庭, 公司内部采用每个终端设置私有IP, 而在路由器或必要的服务器上设置全局IP;
- 全局IP要求唯一, 但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的;
3.2 NAT转换
现在客户端A想要给服务器发送消息,在局域网中A的IP地址为10.0.0.10,经过NAT路由器时,路由器会将10.0.0.10转化成一个公网IP202.244.174.37。
当服务器接受到该报文后,可以知道发送端的公网IP,也就可以知道响应时应该交给互联网上的哪一台主机了,服务器将响应发送给202.244.174.37.当数据包到达NAT路由器后,又会被转化回10.0.0.10了。
为什么不将10.0.0.10直接发送到公网,而是经过转换的过程
10.0.0.10属于私网,而私网是不能发送到公网当中的,因为在公网之下有很多个局域网,每个局域网中都可能存在一个10.0.0.10,如果直接发送到公网当中,那么无法分辨出这个数据属于谁的了。
为什么要使用私网,直接使用公网不行吗?
理论上来说,所有主机使用不同的IP地址就不要进行转换了,但是问题是IP地址严重不足了,IPV4的ip地址是32位的,也就是说最多能表示2的32次方个IP地址,也就是42亿9千万,但是仅仅中国目前14亿人口,每个人可能上网设备都不止一个。
为了解决IP不足的问题,才有了NAT技术,将IP地址分为公网IP和私网IP,私网IP可以相同。我们只需要给进入公网的路由器分配一个公网IP即可,这个路由器下的局域网使用私网IP,要访问外网直接通过路由器转换即可。
服务端响应IP为202.244.174.37,如何确定是哪一台主机发送的数据?
NAT路由器后会形成一张表,例如当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系,当数据回来时,只需要判断发送端的IP是163.221.120.9,就知道这个报文是发送给10.0.0.10这台主机的。
并且此表中不一定只存放IP,必要时会将端口号也保存起来。
我们会在下面的NAPT详谈
3.3 NAPT
如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系
这种关联关系也是由NAT路由器自动维护的. 例如在TCP的情况下, 建立连接时, 就会生成这个表项; 在断开连接后, 就会删除这个表项。
路由器接收到一个报文后,如何判断该报文交给哪个主机
因为NAT路由器生成了一张转化表,所以当收到一个报文后,我们只需要判断响应报文的发送端的IP地址和之前我请求报文的接受端地址是否相同即可。
比如10.0.0.10给163.221.120.9发送了一个请求报文,路由器就会记录下来,当收到一个报文,且他的发送端的IP是163.221.120.9,那我们就可以知道这个报文应该是发送给10.0.0.10这台主机的。
如果局域网中多台主机访问同一个服务器,响应报文中的发送端IP都相同,那么此时如何分辨出这个报文是谁请求的。
NAT转化表中不仅仅会保存IP还会保存端口号,端口号的作用就体现在这里了,我们仔细观察一下转化表。
- 若主机A发送的报文先到达路由器,那么路由器会将报文的源IP地址替换成自己的WAN口IP地址,由于路由器用于访问该服务器的1025号端口没有被使用,因此该数据包的源端口号可以不变。
- 当主机B发来的数据包到达路由器时,路由器同样将数据包的源IP地址替换成自己的WAN口IP地址,但此时路由器用于访问该服务器的1025号端口已经被主机A使用了,因此路由器会重新选定一个端口号对数据包的源端口号进行替换。
3.4 NAT的缺陷
由于NAT依赖这个转换表, 所以有诸多限制:
- 无法从NAT外部向内部服务器建立连接;
- 装换表的生成和销毁都需要额外开销;
- 通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开
虽然说这是NAT的缺陷,但是也在一定程度上保护了内网的主机,因为内网主机不访问外网,外网是无法访问到内网的。
3.5 NAT和代理服务器
正向代理
正向代理,是一个位于客户端和目标服务器之间的服务器,客户端并不直接访问目标服务器,而是先访问代理服务器,由代理服务器代替客户端去访问对应的目标服务器,并将目标服务器的响应结果返回给客户端。
正向代理服务器的好处就是加快了访问速度,正向代理服务器可以把服务器资源提前缓存一部分,下次客户端再来请求这个资源时,直接从正向代理服务器中拿,而不需要再到服务器了。
反向代理
反向代理,也是一个位于客户端和目标服务器之间的服务器,客户端直接向反向代理服务器发起数据请求,然后再由反向代理服务器将客户端的数据请求转发给真正的目标服务器进行处理,数据处理完毕后反向代理服务器再将数据结果返回给客户端。
例如我们熟知的baidu.com其实就是访问反向代理服务器。当这台反向代理服务器收到客户端的数据请求后,就会将我们的数据请求转发给百度内部的某台服务器进行数据处理,然后再将数据处理的结果返回给客户端。
反向代理服务器的好处:
- 负载均衡:反向代理服务器可以将客户端请求分发到多个实际服务器上,从而平衡服务器的负载,提高系统的可伸缩性和可靠性。
- 安全性::通过在反向代理服务器上配置防火墙和安全策略,可以保护实际服务器免受未经授权的访问和攻击。
代理服务器的主要工作只是对数据进行转发,因此代理服务器处理数据的压力不会特别大,并且代理服务器也可以有多个,因此不必担心代理服务器过载的情况。
正向代理和反向代理
相同点:
- 正向代理和反向代理都位于客户端和真实服务器之间
- 它们的主要作用都是将客户端的请求转发给服务器,并将服务器的响应转发回客户端。
不同点:
- 正向代理:代表客户端执行请求,接收来自客户端的请求,并转发这些请求到目标服务器,然后再将服务器返回的结果返回给客户端。客户端知道实际请求的目标服务器地址,而目标服务器并不知道请求的来源。
- 反向代理:代表服务器接收请求,接收来自客户端的请求,并转发这些请求到内部网络中的某个服务器(如Web服务器),然后将服务器的响应返回给客户端。客户端并不知道实际响应的服务器地址,只知道它正在与反向代理服务器交互。
- 正向代理使用场景::通常用于客户端需要访问无法直接访问的网络资源时,如VPN(虚拟私人网络)服务,或者出于安全和隐私考虑,隐藏客户端的真实IP地址。
- 反向代理使用场景::常用于负载均衡、内容缓存、安全过滤等场景。例如,多个Web服务器可以使用反向代理进行负载均衡,确保请求被均匀地分发到各个服务器上。
NAT和代理服务器
路由器往往都具备NAT设备的功能, 通过NAT设备进行中转, 完成子网设备和其他子网设备的通信过程.
代理服务器看起来和NAT设备有一点像. 客户端像代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后, 代理服务器又把结果回传给客户端.
那么NAT和代理服务器的区别有哪些呢?
- 从应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题. 代理服务器则是更贴近具体应用, 比如通过代理服务器进行翻墙, 另外像迅游这样的加速器, 也是使用代理服务器.
- 从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换. 代理服务器往往工作在应用层.
- 从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网.
- 从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上.
4. 网络协议总结
4.1 应用层
- 应用层的作用: 满足我们日常需求的网络程序, 都是在应用层能
- 够根据自己的需求, 设计应用层协议.
- 了解HTTP协议.
- 理解DNS的原理和工作流程
4.2 传输层
- 传输层的作用:负责为两个网络通信进程之间的通信提供服务,更多的是为数据的传输提供一些策略。
- 理解端口号的概念。
- 认识TCP协议,理解TCP协议的可靠性,理解TCP协议的状态转化。
- 掌握TCP的连接管理、确认应答、超时重传、滑动窗口、流量控制、拥塞控制、延迟应答、捎带应答特性。
- 理解TCP面向字节流,理解粘包问题和解决方案。
- 能够基于UDP实现可靠传输。
- 理解MTU对UDP/TCP的影响。
4.3 网络层
- 网络层的作用:在复杂的网络环境中确定一条合适的路径。
- 理解IP地址,理解IP地址和MAC地址的区别。
- 理解IP协议格式。
- 理解如何解决IP数目不足的问题,掌握网段划分的两种方案,理解私有IP和公网IP。
- 理解网络层的IP地址路由过程,理解一个数据包如何跨网段到达最终目的地。
- 理解IP数据包分片的原因。
- 了解ICMP协议。
- 了解NAT设备的工作原理。
4.4 数据链路层
- 数据链路层的作用:负责局域网内两个设备之间的数据传递。
- 理解以太网通信原理
- 以太网帧格式。
- 理解MAC地址。
- 理解ARP协议。
- 理解MTU。