一、DNS
DNS(Domain Name System)是一整套从域名映射到IP的系统
1.1 DNS的背景
TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序. 但是IP地址不方便记忆.
于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系.
最初, 通过互联网信息中心(SRI-NIC)来管理这个hosts文件的.
如果一个新计算机要接入网络, 或者某个计算机IP变更, 都需要到信息中心申请变更hosts文件.
其他计算机也需要定期下载更新新版本的hosts文件才能正确上网.
这样就太麻烦了, 于是产生了DNS系统
一个组织的系统管理机构, 维护系统内的每个主机的IP和主机名的对应关系.
如果新计算机接入网络, 将这个信息注册到数据库中;
用户输入域名的时候, 会自动查询DNS服务器, 由DNS服务器检索数据库, 得到对应的IP地址.
DNS并没有像看起来的那么简单,他非常重要,一旦出现问题影响会非常大!!
我们生活在一个被精心设计过的网络世界,我们专门有人去提供这个DNS服务,当你这家公司要去构建一个互联网产品或者网站的时候,你需要
1、先去申请你的域名(由你特定部署的云服务主机的IP)
2、去DNS中心注册,将域名和IP绑定(这样任何人通过域名访问的时候DNS就会将域名解析成IP地址返回来)
至今, 我们的计算机上仍然保留了hosts文件. 在域名解析的过程中仍然会优先查找hosts文件的内容.
cat /etc/hosts
1.2 域名简介
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称。
域名使用 . 连接
com: 一级域名. 表示这是一个企业域名. 同级的还有 "net"(网络提供商), "org"(非盈利组织) 等.
baidu: 二级域名, 公司名.
www: 只是一种习惯用法. 之前人们在使用域名时, 往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格 式, 来表示主机支持的协议.
http发送的第一件事就是做域名解析!!如果IP地址缓存起来了可以直接用,否则都要先经过DNS服务器(浏览器内置了DNS服务器的IP地址)

当然!域名也需要推广,比如百度告诉你baidu可以搜索,这样你才会去使用
1.3 使用dig工具分析DNS过程
安装 dig 工具
yum install bind-utils
之后就可以使用 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服务器的地址等.
更多 dig 的使用方法, 参见
https://www.imooc.com/article/26971?block_id=tuijian_wz
1.4 浏览器中输入url后, 发生的事情
这是也跟非常经典的问题,可以考到网络中的所有内容,你说的越详细越能体现你的网络功底
建议要先谈应用层
1、http过程+域名解析
协商域名时要通过DNS域名解析拿到目标服务器的IP地址,浏览器随机会拿着ip地址然后进行三次握手,三次握手把链接构建好后发送http请求,经过网络转变,到达目标主机然后应答,然后响应再通过链接发回来,然后解析之后对正文进行解释,浏览器再进行渲染我们就看到结果了。
2、https+加密
3、一边跟面试官沟通一边谈论细节(tcp、ip、mac帧)
当你在浏览器地址栏输入一个URL后回车,将会发生的事情?-CSDN博客
二、ICMP协议
ICMP是在IP层之上,传输层之下的一个网络层协议
一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因.
2.1 ICMP功能
ICMP正是提供这种功能的协议; ICMP主要功能包括:
1、确认IP包是否成功到达目标地址.
2、通知在发送过程中IP包被丢弃的原因.
3、ICMP也是基于IP协议之上工作的. 但是它并不是传输层的功能, 因此人们仍然把它归结为网络层协议;
4、ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6;
2.2 ICMP的报文格式

ICMP大概分为两类报文: 一类是通知出错原因 一类是用于诊断查询

2.3 关于ping命令
其实ping命令底层就是采用icmp(一般都是网络管理员需要掌握的)
相当于是由用户在上层驱动,原始套接字可以绕过TCP直接到达网络层封装icmp报头,后面的过程都是由OS完成的!!带icmp的报文只会达到对方的ip层,并不会向上交付!!


注意, 此处 ping 的是域名, 而不是url! 一个域名可以通过DNS解析成IP地址.
ping命令不光能验证网络的连通性, 同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期).
ping命令会先发送一个 ICMP Echo Request给对端;
对端接收到之后, 会返回一个ICMP Echo Reply;

问题1:有些面试官可能会问: telnet是23端口, ssh是22端口, 那么ping是什么端口?
------>这是一个陷阱,ping命令基于ICMP,是在网络层,而端口号是传输层的内容,在ICMP中根本就不关心端口号这样的信息!!
2.4 traceroute命令
也是基于ICMP协议实现, 能够打印出可执行程序主机, 一直到目标主机之前经历多少路由器.

原理:发第一个报文的时候TTL计数器会设为1,只要中间的路由器将报文丢了,那么就会反向发回来一个icmp里面包含该路由器的信息,然后打印出来,接着设置为2......以此类推 直到打印出目标主机之间的所有路由器!
三、NAT技术
3.1 NAT技术背景
之前我们讨论了, IPv4协议中, IP地址数量不充足的问题
NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能;
1、NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法:
2、很多学校, 家庭, 公司内部采用每个终端设置私有IP, 而在路由器或必要的服务器上设置公网IP;
3、公网IP要求唯一, 但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的;
(NAT技术可以让运营商构建出无数的子网从缓解IP不足的情况)
3.2 NAT IP转化过程
因为私有IP不能出现在公网中,所以我们其实在每一次报文被路由器转发的时候,目标IP不会变,但是源IP会被一直替换成WAN口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 发送数据时就会生成表中的映射关系;
3.3 NAPT
那么问题来了, 如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
------>这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系

因为两侧都是唯一的,所以互为键值!(可以理解成有两张哈希表),这就是NAT转化表!!
这个过程中决定了必须先从内网访问外网,把NAT表建立好,否则外网无法访问你的内网,这也是你为什么玩抖音、qq的时候都需要登录,登录后才能把整个NAT链路打通,才能方便服务器将功数据给你返回来!!!
这种关联关系也是由NAT路由器自动维护的. 例如在TCP的情况下, 建立连接时, 就会生成这个表项; 在断开连接后, 就会删除这个表项
问题1:如果NAT路由器跑太多进程,很多IP和端口都需要路由器路由,那会不会崩掉??
------>一般来说家用路由器和企业级路由器的配置是不一样的,就算是运营商路由器扛不住了,运营商会去重新组网!!你能想到的问题人家作为网络设计这样也一定会想得到!
问题2:如果我想访问同一子网内的另一台主机可以直接通信吗?
------>是不能直接通信的!!必须得双方先登录,打通NAT转化表,然后我发的消息会先转到目标服务器,然后再给你转回来,必须要经过这个网络!!

问题3:如果是不同局域网内的主机通信嗯??我们并不会经过同一个NAT路由器
------>所以我们可以在目标主机部署一个客户端,然后有一个公共服务端(其实是一个反向代理服务器),再通信之前目标主机先和服务端建立TCP长链接,维护好他的NAT转换,然后当我把数据交给服务器,由服务器通过TCP链接转过去!!这种技术我们叫做内网穿透(frp4 frps是服务端 frpc是客户端 关于frp可以去github或者gitee去找)
未来只要目标主机24小时不断电,维持着长连接,那么我们只要能找到服务器,就能通过内网穿透找到目标主机!!此时服务器并不提供服务,只是帮我们做消息转发!!

3.4 NAT技术的缺陷
由于NAT依赖这个转换表, 所以有诸多限制:
1、无法从NAT外部向内部服务器建立连接;
2、转换表的生成和销毁都需要额外开销;(查表效率很高,因为哈希)
3、通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开;
就有点像陶瓷瓶得盖陶瓷盖,这使得运营商在建立内网的时候,内部能有多大的NAT转换他是会做严格评估的,并且一个子网内的主机也不能过多,否则容易发生数据碰撞的问题!!
四、代理服务器
代理服务器是一种应用比较广的技术.
1、翻墙: 广域网中的代理.
2、负载均衡: 局域网中的代理.
4.1 正向代理
如果我们使用的是数据流量,那么我们会直接通过运营商
而如果我们使用的是校园网,就会先经过一个学校建立的代理服务器!!
想要上网,就需要登录校园网,那就需要认证,而认证通过就会给你分配IP地址!!
为什么要有学校服务器呢???
------>为了组建校园网,不光是为了上网,还得对学生账号做管理!!比如可以收费,也可以拦截一些非法请求,因为是多对一,所以是一种正向代理(一般是请求的转发)!!
4.2 反向代理
比方说公司有一个服务器机房,但是如果我们把机房所有主机的IP都暴露出去,那么根据不同用户的使用习惯可能就会出现有的机器访问多有的机器访问少,这件就是负载不均衡!!因此肯定不能把所有的机房IP都暴露出去,解决方案就是搞一套配置更高的机器来做代理服务器,把他的IP暴露给客户,这样客户要访问就必须经过代理服务器,他并不处理任何业务!!只做请求的转发,比如轮询、随机分配到后端的机器上!!

反向代理一般是企业用来做负载均衡的(往往只是做一个缓存 内网穿透也是)!!
其他例子:
花王尿不湿是一个很经典的尿不湿品牌, 产自日本.
我自己去日本买尿不湿比较不方便, 但是可以让我在日本工作的表姐去超市买了快递给我. 此时超市看到的买家是我表姐, 我的表姐就是 "正向代理";
后来找我表姐买尿不湿的人太多了, 我表姐觉得天天去超市太麻烦, 干脆去超市买了一大批尿不湿屯在家里, 如果有人 来找她代购, 就直接把屯在家里的货发出去, 而不必再去超市. 此时我表姐就是 "反向代理"
4.3 借助代理绕过反爬虫
因为我们的服务器一般来说都必须通过运营商,但是如果我们想访问一些外部的网站,那么运营商就会拦截你不让你访问,可是如果此时有一个特殊的代理服务器,他可以不需要经过运营商,那么我们就可以通过他访问到外网。
一般来说,我们会用一个http报文,然后包裹着一个加密的http请求,当经过运营商的时候,他发现这个ip没什么异常就正常推送给代理服务器,然后代理服务器再解开报头,然后拿到真正的https请求在发送给目标服务器,目标服务器将加密后的响应返回给目标服务器,然后目标服务器再封装一个http报头返回给主机,主机解开之后再拿到真正的https响应再进行解析!!

常规情况下, http默认携带的是非其他http的其他数据,这说明我们不仅仅可以传https协议报文,也可以是其他协议!!比如说socks5
4.4 NAT和代理服务器的区别
路由器往往都具备NAT设备的功能, 通过NAT设备进行中转, 完成子网设备和其他子网设备的通信过程.
代理服务器看起来和NAT设备有一点像. 客户端像代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后, 代理服务器又把结果回传给客户端.
问题1:那么NAT和代理服务器的区别有哪些呢?
------>
1、从应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题. 代理服务器则是更贴近具体应用, 比 如通过代理服务器进行翻墙, 另外像迅游这样的加速器, 也是使用代理服务器.
2、从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换. 代理服务器往往工作在应用层.
3、从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以 跨网.
局域网的出口,也可以是家用路由器,也可以是运营商路由器
4、从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署 在服务器上.
五、网络总结
5.1 数据链路层
数据链路层的作用: 两个设备(同一种数据链路节点)之间进行传递数据
以太网是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑 结构, 访问控制方式, 传输速率等;
以太网帧格式
理解mac地址
理解arp协议
理解MTU
5.2 网络层
网络层的作用: 在复杂的网络环境中确定一个合适的路径.
理解IP地址, 理解IP地址和MAC地址的区别.
理解IP协议格式.
了解网段划分方法 理解如何解决IP数目不足的问题, 掌握网段划分的两种方案. 理解私有IP和公网IP
理解网络层的IP地址路由过程. 理解一个数据包如何跨越网段到达最终目的地.
理解IP数据包分包的原因.
了解ICMP协议.
了解NAT设备的工作原理.
5.3 传输层
传输层的作用: 负责数据能够从发送端传输接收端.
理解端口号的概念.
认识UDP协议, 了解UDP协议的特点.
认识TCP协议, 理解TCP协议的可靠性. 理解TCP协议的状态转化.
掌握TCP的连接管理, 确认应答, 超时重传, 滑动窗口, 流量控制, 拥塞控制, 延迟应答, 捎带应答特性.
理解TCP面向字节流, 理解粘包问题和解决方案.
能够基于UDP实现可靠传输.
理解MTU对UDP/TCP的影响.
5.4 应用层
应用层的作用: 满足我们日常需求的网络程序, 都是在应用层
能够根据自己的需求, 设计应用层协议.
了解HTTP协议.
理解DNS的原理和工作流程.
