【Linux】DNS系统,ICMP协议,NAPT技术

遏制自己内心的知识优越感,才能让你发自内心的去尊重他人,避免狂妄自大,才能让你不断的丰富自己的内心。

文章目录


一、DNS系统

1.DNS服务器返回域名对应的ip

域名其实就是平常我们所访问的www.baidu.com、www.google.com网址,有人说,我们访问服务器上的某个进程不应该用ip+port的方式来访问吗?怎么用域名开始访问了?其实主要还是因为服务器的ip都是数字,数字对于计算机很友好,但对我们人类就不太友好了,如果我今天要访问一下百度,那我记一下百度服务器的ip地址,明天访问edge,再记一下edge的ip地址,一旦要访问的网站数量上来或时间线拉长了,那一定会混的。
为了互联网的商业化推广和普通百姓的使用体验,有人就搞出来了域名这样的东西,一个域名对应映射一个ip地址,这样的映射关系最初是存储在一个hosts文件当中的,这个hosts文件最初是由互联网信息中心(SRI-NIC)来管理的,如果有设备想要入网,则必须向SRI-NIC中心机构申请变更hosts文件,其他已经入网的设备也要定期的从SRI-NIC下载更新新的hosts文件,更新新的ip和域名的映射关系,只有这样才可以正常上网。

但这样让用户自己定期更新的方式太麻烦了,于是就产生了DNS系统。
DNS是一个分布式的系统,由许许多多不同的DNS服务器组成,这些DNS服务器分布在全球各地,你家所在的区,市,省都会有相应的DNS服务器,这些服务器共同组成了一个庞大的网络基础设施。
在DNS系统中,服务器有很多级,例如根域名服务器,顶级域名服务器,权威域名服务器,像中国互联网网络中心(CNNIC)负责管理顶级域名服务器和权威域名服务器,提供对.cn域名的解析服务,像电信,联通,移动,或其他大型互联网厂商,等都会维护自己的DNS服务器,用于内部网络和客户的域名解析需求。

实际我们在访问网站时,大部分的人都不会在地址栏输入ip地址或者域名的方式来访问,最常见的访问方式就是先搜索,在搜索的结果中找到官网,然后点击官网,以这样的方式来访问。
当我们点击官网时,也是要进行dns域名解析的,因为搜索的结果显示的方式就是域名的方式,比如显示出来的https://news.qq.com中,整体是一个完整的URL,协议类型是https,域名部分是news.qq.com,这个URL中没有带路径,也就是访问服务器的web根目录下的哪个服务,此时会带上斜杠(/)斜杠是路径的一部分,而不是域名的。

当我们点击搜索到的官网链接时,浏览器会尝试进行域名解析,将域名转换为ip地址,然后以ip+port的访问去访问对应的服务器,有人说端口号在哪里啊?我怎么没见到啊?我只见到了域名能够通过DNS转换为ip地址啊,其实像https这样成熟的应用层协议,也就是超文本传输安全协议,这样协议对应的进程bind的是知名端口号443,所以我们的浏览器在拿着ip进行访问时,默认访问的就是ip对应的服务器上绑定443端口号的进程。
一般在浏览器进行域名解析时,会首先向OS或browser自带的缓存发起DNS查询请求,如果缓存中没有相应的记录的话,OS会将DNS查询请求发到我主机所在局域网的出口路由器,一般出口路由器都会相应的配置一个本地DNS服务器,当路由器收到dns请求时,会将此请求发送给配置的本地DNS服务器,本地DNS服务器接收到查询请求后,会向根域名服务器发起请求,逐级向上进行查询,根域名服务器会通过自己的数据库找到目标域名的ip地址,找到后会将ip逐级返回至最初的浏览器,让浏览器拿着ip地址进行https请求,以获取网站的内容。

下面分别是我的windows和linux云服务机器的dns缓存内容,一些常见的域名的ip地址都被浏览器缓存了下来,例如csdn.net,cplusplus.com等域名对应的服务。

2.使用dig工具分析DNS过程

域名一般使用 . 来进行连接,例如www.baidu.com,com(commercial)是一级域名,表示这是一个企业,同级域名还有net(网络提供商),org(非盈利组织,kernel.org)等。
baidu是二级域名,一般代表公司的名字。
www只是一个习惯性的用法,在早期的互联网中比较常见,比如人们默认约定www开头的是支持Web服务的主机,ftp开头的是支持FTP协议的主机,但随着互联网技术的发展,这种命名约定变得没有那么重要了,现代的域名系统不要求以www作为Web服务的默认前缀,转而直接用域名本身,例如baidu.com来作为网站的URL。
(所以如果想要让一个国家的网络体系直接瘫痪掉,则只要停掉这个国家的域名解析服务就可以了,一旦停掉,则网民无法访问任何互联网公司所提供的服务,因为没有ip就找不到这些服务对应的服务器主机位置,自然就无法进行网络请求。)

下面我们来用dig工具来分析DNS域名解析的过程,安装dig工具的指令sudo yum install bind-utils,安装好之后,就可以使用dig指令来查看域名解析的过程了。

3.浏览器中输入url后发生的事情?

这道题是非常经典的开放性面试题,你说的越多越详细越好,但需要注意的是我们不能乱说,一定要有条理性的去说,这样能够体现出你的知识是成体系化的,你不是东一榔头西一棒子学出来的。

通常我们在回答这种开放式的问题时,一定要先交代清楚,准备怎么回答这个问题,从哪几个方面回答这个问题,把这些先告诉HR,正确的做法应该是下面这样的。
提前语:回答过程中,可能有些技术的细节占用的时间比较长,欢迎面试官随时打断我。
我接下来准备从两个方面来回答这个问题,首先我会从纯应用层的角度解释这个问题,然后再从贯穿协议栈的角度来回答。
(1)输入URL后,浏览器会先查自己的dns缓存,如果找到那就将url中域名对应的ip交给浏览器,浏览器拿到ip后,会向服务器发起HTTPS请求(常见的),请求报头中会包含请求行,请求行最常见的字段就是GET和POST,请求报头,空行,请求正文,服务器收到HTTPS请求后,会构建HTTPS响应报文(状态码),除此之外,HTTP还有周边会话保持,长连接等技术,周边会话中还有内存级cookie和文件级cookie,以及为了解决cookie文件私密性太差的session技术。
HR最关心的还是应用层,因为大部分的程序员都是在做应用层开发的,所以我们在回答时,先把面试官最关心的东西交给他,一个从业十年的程序员其实应用层下面的东西早就忘记了,他最熟练的还是应用层,但如果我们能把应用层和其下面的协议都说明白,那就很加分了。
(2)传输层的UDP和TCP,面向连接和无连接,面向数据报和面向字节流,socket接口的不同,TCP的连接管理,确认应答,超时重传,流量控制,滑动窗口,拥塞控制,网络层的IP,网段划分,NAT技术,数据包如何实现路由,路由表的结构,数据链路层的以太网,ARP请求,数据碰撞,交换机,ARP欺骗。
结束语:如果我刚刚的回答有细节遗漏 或 概念不清晰的问题的话,烦请面试官指出,下来后我会再认真学习。

在工作中,沟通和表达能力是非常重要的,在秋招市场上,有三类同学很受欢迎,纯技术能力强,技术能力过关,沟通和表达能力很强,技术能力过关,心态很好,对工作和生活充满激情,这三类人是最容易找到好工作的。
还有一定要诚实,千万不要在项目上造假,一个刚毕业的本科生或研究生,能够做什么样的项目,面试官心里都是有数的,不要欺骗面试官。

浏览器中输入url后发生的事情?

二、ICMP协议

1.ICMP功能

ICMP是基于网络层IP的一个协议,但他并没有被划分到传输层,因为他主要的作用还是在于路由数据包,IP报头的protocol值为1时,就代表将IP报头拆开后,将有效载荷交付给ICMP协议,而不是UDP或TCP。

之前我们谈过IP协议将数据包跨网络发送到对端主机的过程,但如果网络层在路由的时候出了问题呢?那网络层是不是应该提供一些,他自己所在层的故障排查的功能呢?当然应该提供,ICMP主要用于确认数据包是否成功到达目的主机,或者当数据包没有到达目的主机时,我们想知道是什么原因造成的。
所以ICMP报文大概分为两类,一类是查错报文,由网络中间节点设备或目标主机返回的错误报文,常见的错误问题有超时问题,目标不可达,以及参数问题等,另一类是查询报文,用于探测网络的健康状况等。

下面是ICMP报文的类型

2.ping 和 traceroute命令

ping和traceroute是典型的基于ICMP协议实现的应用程序,ping程序是最常见的用于检测ipv4或ipv6网络设备的连通性的工具,ping使用ICMP的echo信息来确定网络的连通性如何,比如远程设备是否可达,与主机通信的来回时延(round-trip),数据包的丢失情况。
ping的时候,ping的不是url,而是域名,通过域名就可以DNS解析得到ip地址,ping命令会发送ICMP Echo Request报文给对端。

traceroute可以打印出数据包到达目的主机过程中经过的网络节点信息,为我们显示出数据包的路由路径,可以显示出每一个节点的延迟时间信息。
打印结果中的***代表该网络节点选择忽略或不响应ICMP请求,这可能是由于防火墙设置,路由器配置或网络设备有自己的策略所导致的,这并不一定表示存在问题或故障,而可能是该节点只是选择不回复ICMP请求而已。

有些面试官可能会问,telnet程序是23端口,ssh是22端口,那么i、ping是什么端口?
因为ping是基于ICMP协议的,而ICMP是网络层的协议,没有端口号这样的概念,而telnet和ssh是基于TCP的,所以他们有端口号。

3.ICMP攻击

之前讲数据链路层的时候,谈到过ARP欺骗的攻击,实际上ICMP也有攻击,正因为他的设计简单,所以违法者才会利用他的漏洞从而进行攻击。

(1)ICMP Flood攻击:ICMP洪水攻击是最为常见的一种攻击方式,攻击者会发送大量的ICMP echo请求报文来查询网络健康状况,而目标主机会因为处理大量的echo报文而造成资源消耗过度,从而导致网络延迟,或目标主机的服务不可用
(2)ICMP Smurf 攻击:攻击者会伪造自己的源ip地址,然后向广播地址发送大量的echo请求报文,这些请求报文会被广播到网络上的所有主机,所有主机收到后都会向源ip对应的主机返回echo响应报文,而这个伪造的源ip其实就是被攻击主机的ip地址,该主机也会由于同一时间内受到大量的报文,而导致主机性能下降,网络延迟等问题。
(3)ICMP Redirect 攻击:攻击者可以发送伪造的ICMP Redirect报文到目标主机,欺骗目标主机更改路由表中的路由信息。这就可能导致目标主机讲流量转发到攻击者控制的路由器上,从而导致中间人进行数据窃取。

三、NAT和NAPT

NAT技术之前讲网络层协议时已经介绍过了,这里再简单的提一下,NAT技术最成功的地方就是解决了ipv4地址不足的问题,NAT技术可以将让多个内网主机共享公网ip地址,而所谓的共享,其实就是当这些主机想要连接或访问公网上的服务时,NAT技术可以将他们发送的数据包一步步替换为最终发送给目标主机的节点的公网源ip,以这样的方式来解决ipv4地址不足的问题,因为大部分的主机都会共享同一个公网ip,同时在不同的局域网中出现不同的私有ip也是可以的,大部分的局域网主机都可以高频率重复的使用私有ip,这也正是网段划分,所以NAT+网段划分解决了ipv4地址不足的问题。
之前在讲述IP协议的时候,在《产生的疑问》那一部分,我就演示过我家庭里面所有的入网设备的公网ip地址是相同的。

【Linux】网络层协议:IP

NAT技术着重于解决ipv4地址不足的问题,在讲IP层的时候,也学习过一个局域网中的数据包是如何转发到公网环境上去的,在转发过程中会不断的替换源ip地址,但数据包如何从公网环境上转发回原来的局域网呢?
这样的问题靠NAT技术就无法解决了,而是需要NAPT技术。

NAPT技术是基于NAT技术,用来解决数据包如何从公网返回到内网的问题的。
NAPT不仅仅会替换源ip地址,同时还会替换源端口号,其目的就是维护一张在映射关系上是具有唯一性的NAT转换表。在下面的通信过程中,A和B都要访问公网上的服务器,他们的数据包的源ip是不同的,但源端括号是相同的,当数据包发送到NAT路由器时,路由器会将数据包里面的源ip替换为自己的公网ip地址,同时路由器发现两个数据包的源端口号是相同的,此时路由器会将其中一个数据包的源端口号替换为一个不重复的值,所以你可以在NAT转换表中看到,替换后的源端口号一个是1025,一个是1026,为什么要这么做呢?后面再说
当数据包成功发送到公网上的服务器后,公网上的数据包会构建响应报文,响应报文的目的ip和目的端口号,服务器会查看收到的数据包的头部内容而填充,如果响应报文的目的ip是202.244.174.37,端口号是1025,那么这个数据包被发送到路由器后,路由器会查自己的NAT转换表,发现这个目的ip和目的port对应的映射关系是10.0.0.10:1025,所以下一步,该路由器就会将报文转发回内网的主机A,如果服务器发送的数据包的目的ip不变,端口号是1026,那么路由器也可以通过查NAT转换表的方式来查到对应的映射关系,将数据包再发送回内网的主机B。
这就是除了源ip外,还要进行源端口号替换的原因,因为当数据包从服务器先返回到路由器时,所有数据包的目的ip都是完全相同的,都是路由器的公网ip,只有目的端口号的不同,才能区分数据包应该由路由器转发到哪个内网主机,因为从内网发送出来的数据包的端口号可能是相同的,为了保证数据包从外边发送回来的唯一性,路由器必须要将端口号进行替换以,以此来保证NAT转换表中映射关系的唯一性。

像运营商的路由器一般都不需要维护NAT转环表,因为运营商路由器只需要负责将数据包发送回家用路由器即可,家用路由器的wan口ip一定是不同的,所以运营商路由器没必要维护NAT转换表,因为返回的数据包从运营商到家用路由器是具有唯一性的!
而从家用路由器到内网主机是不具有唯一性的,所以此时路由器需要维护转换表,他需要决策将数据包返回给哪个内网主机,而这是需要转换表来决定的。

如果主机A从来没有访问过公网上的服务器,那么服务器能否直接从外部的公网将数据包发送给内网的主机A呢?
这一定是做不到的,因为如果没有内网先到公网的访问,就无法在NAT转换表中维护好一个新的转换条目,而此时数据包只能从服务器到路由器,无法从路由器转发到内网主机,因为路由器没有对应的映射关系条目。

由于NAT依赖这个转换表,所以NAT技术也有很多缺陷,比如无法从NAT外部向内部直接建立连接,通信过程中一旦NAT设备异常,所有的TCP连接都会断开,NAT转换表的生成和销毁都需要额外开销。
不过这些缺点相对于NAT的优点,根本不算什么,NAT的优点一定是远远大于缺点的!

四、代理服务器

1.正向代理

正向代理和反向代理都是横在目标服务器和客户端中间的代理服务器,但在访问方式上,两者还是不同的。当客户端需要访问目标服务器时,请求会先发送到正向代理服务器,然后由正向代理服务器代表客户端发送请求到目标服务器,接收响应后再转发回客户端。
在发送的过程中,通过正向代理可以对请求进行修改、过滤或缓存,通过配置正向代理,客户端可以通过正向代理访问受限制的资源,例如fq,匿名浏览等。

像正向代理这样的服务器,在学校里面最为常见,一般学校都会有自己的内网,和学校自己的服务器,当学生连接学校wifi后,进行的任何互联网请求都会由学校的服务器进行代理请求,有的学校会搭建自己的电影网站,供学生去看,此时当学生请求某些电影资源(例如战狼)时,如果学校的服务器缓存过,那么该正向代理服务器就会将缓存的资源返回给学生。
除此之外,有些学校的服务器会拦截使用ssh协议进行远程登录云服务器的请求,这也是由于正向代理的作用,正向代理检测到你进行的是ssh请求,可能学校会觉得ssh不太安全,直接就掐断你对于公网的访问,解决的办法也很简单,不要连学校的wifi,而是直接用移动热点,连接附近的运营商基站即可,运营商会转发我们的合法的数据包请求。

正向代理另一种常见的使用情景就是游戏的加速器,假设你和你的舍友都在西安,你们在开黑王者荣耀,可能此时你们的王者荣耀客户端访问的都是北京的服务器,但如果你用了加速器,你会发现你玩游戏的流畅度立马提高了,而这其实就是因为正向代理的作用,例如西安附近有一些王者荣耀的正向代理服务器,如果你购买了加速器的话,那么你玩游戏时,各种网络请求都会由该正向代理服务器代你请求,同时该服务器可能会缓存各种有效数据和资源,像这样的网络请求就属于加速通道,这也是为什么玩游戏流畅的原因。

2.反向代理

反向代理主要功能是代理目标服务器,客户端的请求会经反向代理转发给他后面的多个目标服务器,反向代理隐藏了后端服务器的真实地址和身份,客户端只与反向代理服务器进行通信,像这样的反向代理服务器,还有另一种称呼就是入口服务器。


2.
Nginx是常见的一种反向代理服务器技术,公司内部的服务器有很多台,当客户进行访问时,总不能由客户自己来决定要访问哪台服务器吧,而此时反向代理就能够很好解决这种问题,所有的客户端直接访问的都是机房的入口服务器,然后再由入口服务器将请求分发到后端的服务器上,这就是负载均衡,一般向反向代理这样的服务器都是直接放在公网上的,而真正的后端服务器都会放在公司的内网环境中。

3.访问外网的原理(正向代理)

fq也是典型的正向代理的功能,在我们国家,一切网络请求都会经过运营商,这是一定的,因为运营商是网络基础设施的搭建者,所以所谓的fq,其实就是翻运营商。
如果你想访问google.com公司,则你会使用浏览器发起一个http请求,请求行的url是google.com,当这个http请求报文想要交给公网上的google服务器之前,http请求报文要先交给运营商,运营商一看,你访问的网址不是国内的网站啊,而是国外的网站,那就直接拦截你的请求,不让你f到外网。

而网络上一些加速器能够实现fq,其实就是靠正向代理来实现的,由于我国的一国两制制度,有一些地区是天然能够连接到外网的,比如hongkong和macon,大部分连接外网的正向代理服务器都在hongkong和macon这些地方。
当客户端想要访问google时,如果你电脑上有fq的软件的话,其实这个软件就是客户端,这个软件会将你的http请求加密,放到http的正文里面,通过运营商将http请求交给香港的服务器,运营商一看你的http请求,他也不知道你访问的是外网,因为他没办法解密你的http正文,所以你的http包就成功交到了香港的服务器,而香港的服务器其实就是正向代理服务器,该正向代理服务器收到客户端的http包后,拆分报头和有效载荷后,会将请求正文中的密文进行解密,他发现你要访问google.com,此时该正向代理会代你去请求外网的google服务器,再获取到内容后,同样再以加密的方式将google服务器上的内容返回到客户端,这样就实现了fq。
fq过程中,请求地址的加密和解密过程都是由加速器的客户端和服务器做的,如果你有加速器的话,该加速器在你的主机上一定有一个客户端,在hongkong也有他的正向代理服务器。
(声明:并不鼓励大家fq,严禁传播fq软件)

4.NAT和代理服务器的区别

从应用上来讲,NAT设备是网络基础设施之一,解决的是ipv4地址不足的问题,而代理服务器更贴近于实际用途,例如翻墙,负载均衡,迅游加速器等等实际应用。

从底层实现来讲,NAT工作在网络层,用于进行数据包源ip 或 源port的替换,而代理服务器往往工作在应用层。

从使用范围上来讲,NAT一般都在局域网的出口部署,代理服务器可以在局域网中做,也可以在公网上做。

从部署位置上看,NAT一般集成在防火墙,路由器等硬件设备上,而代理服务器只是一个应用层的软件程序,需要部署在服务器主机上。

五、总结

应用层

应用层的作用: 满足我们日常需求的网络程序, 都是在应用层

能够根据自己的需求, 设计应用层协议.

了解HTTP协议.

理解DNS的原理和工作流程

理解HTTPS加密原理

传输层

传输层的作用: 负责数据能够从发送端传输接收端.

理解端口号的概念.

认识UDP协议, 了解UDP协议的特点.

认识TCP协议, 理解TCP协议的可靠性. 理解TCP协议的状态转化.

掌握TCP的连接管理, 确认应答, 超时重传, 滑动窗口, 流量控制, 拥塞控制, 延迟应答, 捎带应答特性.

理解TCP面向字节流, 理解粘包问题和解决方案.

能够基于UDP实现可靠传输.

理解MTU对UDP/TCP的影响.

网络层

网络层的作用: 在复杂的网络环境中确定一个合适的路径.

理解IP地址, 理解IP地址和MAC地址的区别.

理解IP协议格式.

了解网段划分方法

理解如何解决IP数目不足的问题, 掌握网段划分的两种方案. 理解私有IP和公网IP

理解网络层的IP地址路由过程. 理解一个数据包如何跨越网段到达最终目的地,路由表+目的ip

理解IP数据包分包的原因.

了解ICMP协议.

了解NAT设备的工作原理

数据链路层

数据链路层的作用: 两个设备(同一种数据链路节点)之间进行传递数据

以太网是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑

结构, 访问控制方式, 传输速率等;

以太网帧格式

理解mac地址

理解arp协议

理解MTU

理解局域网中的数据碰撞,以及解决办法

相关推荐
我言秋日胜春朝★13 分钟前
【Linux】进程地址空间
linux·运维·服务器
繁依Fanyi34 分钟前
简易安卓句分器实现
java·服务器·开发语言·算法·eclipse
C-cat.34 分钟前
Linux|环境变量
linux·运维·服务器
yunfanleo1 小时前
docker run m3e 配置网络,自动重启,GPU等 配置渠道要点
linux·运维·docker
m51271 小时前
LinuxC语言
java·服务器·前端
hakesashou1 小时前
Python中常用的函数介绍
java·网络·python
C++忠实粉丝1 小时前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法
九州ip动态1 小时前
做网络推广及游戏注册为什么要换IP
网络·tcp/ip·游戏
运维-大白同学1 小时前
将django+vue项目发布部署到服务器
服务器·vue.js·django
Estar.Lee1 小时前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip