【网络】DNS | ICMP | NAT | 代理服务器

🐱作者:一只大喵咪1201
🐱专栏:《网络》
🔥格言:你只管努力,剩下的交给时间!
图

前面几篇文章虽然讲介绍了整个网络通信的协议栈,我们也知道了完整的网络通信过程,但是还有几个坑没填,以及一些重要的协议和技术没有讲解。

DNS | ICMP | NAT | 代理服务器

  • 😽DNS
  • 😽ICMP协议
  • 😽NAT技术
  • 😽代理服务器
  • 😽总结

😽DNS

  • DNS是一整套从域名映射到IP地址的系统,也就是域名解析服务。
  • DNS服务的默认端口号是53。

本喵在讲解网络通信的时候,都是说的IP地址,但是我们生活中访问一些网站时都用的域名,如www.baidu.com访问的就是百度的服务器。

在整个网络通信的协议栈中我们也并没有看到和域名有关的任何东西,因为网络通信的实现就是通过IP地址,并不是域名,域名也需要转换成IP地址,然后再进行通信。

对于使用网络的人来说,IP地址并不方便记忆,因为它是数字性的东西,所以将域名和IP地址映射起来,形成一一对应的关系,在是使用的时候直接使用域名字符串就行。

图
最初,在每个人的主机上都存在一个hosts文件文件,该文件中存放的就是域名和IP地址的映射关系,如上图所示,主机名host-a对应着IP地址172.20.2.1

这个hosts文件是由互联网中心(SRI-NIC)来管理的:

  • 如果一个新计算机要接入网络,或者某个计算机IP变更,都需要到信息中心申请变更hosts文件。
  • 其他计算机也需要定期下载更新新版本的hosts文件才能正确上网。

每当我们访问一个服务器输入域名的时候,浏览器都会自动去本地的hosts文件中查找对应的IP地址,然后再进行绑定创建套接字等发起网络请求。
图
如上图所示,查看/etc/hosts路径的文件,可以看到hosts文件中的内容,红色框中的是IP地址,绿色框中是与之映射的域名,也就是字符串。


但是这样的方式太麻烦了,需要定期去更新hosts文件,增加时还要修改再提交申请等等,所以就产生了DNS系统。

  • DNS:一个组织的系统管理机构,维护系统内的每个主机的IP和域名的对应关系,该机构就像CA机构一样,具有权威性。
  • 如果新计算机接入网络,需要将这个信息注册到数据库中。
  • 用户输入域名的时候,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址,返回给用户。

域名简介:

既然有了一个权威性的机构来提供域名解析服务,所以域名也有命名规则,以www.baidu.com为例:

  • com: 一级域名,表示这是一个企业域名,同级的还有 net(网络提供商), org(非盈利组织) 等。
  • baidu:二级域名,一般是公司名或者组织的名称。
  • www:只是一种习惯用法,不写都可以,直接使用baidu.com也可以访问百度的服务器。

域名解析过程:

在Linux机器上使用yum -y install bind-utils指令可以安装一个dig工具,可以看到域名解析的过程。
图
如上图,是解析域名www.baidu.com的过程。

  • 第一个绿色框中的内容是dig工具的版本号等信息。
  • 第二个绿色框是域名解析的结果,NOERROR表示解析成功。
  • 第三个绿色框是要解析的域名。
  • 第四个绿色框是解析后的结果,在解析时,先将www.baidu.com解析成了www.a.shifen.com,然后再将www.a.shifen.com解析成了两个IP地址。
  • 最后一个绿色框是解析后的结构统计,包括解析时长,DNS服务器的IP地址等信息。

图
如上图所示,在浏览器中输入解析出来的IP地址112.80.248.76,也可以直接访问到百度的首页,和输入域名www.baidu.com结果一样,区别在于:

  • 使用IP地址访问时,浏览器自动采用HTTP协议。
  • 使用域名访问时,浏览器自动采用HTTPS协议。

😽ICMP协议

图
如上图所示,主机A向主机B发送数据,数据经过多次局域网转发后到了路由器2,路由器2为了获取主机B的MAC地址,发送ARP请求,但是发送了多次都没有收到主机B的ARP应答。

此时路由器2会返回一个Destination Unreachable结果给主机A,主机A收到以后就知道了数据传送错误的原因。

这种返回错误的功能之前IP协议是没有的,如果发送不成功,传输层就会触发超时重传再次发送。这种方式对于使用者来说是没有问题的,但是对于网络管理员来说不够。

他们需要知道错误的原因从而进行修复,让网络通信正常,此时ICMP协议就派上了用场。

  • ICMP协议是一个网络层协议,它能确认IP数据包是否成功到达目标地址。
  • 如果没有发送成功,通知发送端IP数据包被丢弃的原因。
  • ICMP协议也是基于IP协议工作的,它并不是传输层的功能,所以我们把它归结为网络层协议。

ICMP只能搭配IPv4使用,如果是IPv6的情况,需要使用ICMPv6协议。

协议格式(了解):

图
关于协议格式,本喵不会详细讲解,有个了解就可以,ICMP报文大致分为两类,一类是通知出错原因,一类是用于诊断查询。

图

如上图表所示便是ICMP常见代码和代码所代表的内容。

ping命令:

我们在验证一个机器的网络是否连接成功时,通常都会使用ping

图
如上图就是本喵在对www.baidu.com使用ping命令,可以在Linux上进行,也可以在Windows上进行。

  • 此处ping的是一个域名,而不是url(服务器web文件路径),域名可以通过DNS解析成IP地址。
  • ping命令不仅能验证网络的连通性,而且也会统计响应的时间和TTL(IP协议中的生存时间,也就是跳数)。
  • ping命令会先发送一个IMCP的Echo Request给对端,对端接收到之后会返回一个IMCP的Echo Reply

ping命令是通过ICMP协议实现的,是网络层的协议,所以没有端口号,它绕过了应用层和传输层,直接从网络层开始。

图
如上图所示,traceroute 域名指令可以查询当前主机当目标主机之前经历了多少路由器,这也是基于ICMP协议实现的。

😽NAT技术

前面本喵在讲解IP协议数据发送的时候的时候,数据从局域网发送到公网服务器的过程中,每经过一个入口路由器,就会将IP报头中的目的IP地址替换成当前路由器的WAN口IP。

  • NAT能够将私有IP对外通信时转为公网IP,也就是一种将私有IP和公网IP相互转化的技术方法。

图
如上图所示,此时局域网的客户端A向公网中的服务器发送数据,客户端A将数据在网络层的时候封装IP报头,其中目的IP地址是服务器的公网IP地址163.221.120.9,源IP地址是自己的私有IP地址10.0.0.10,数据最后以MAC帧的形式发送到NAT路由器。

  • NAT路由器的内网LAN口IP地址是10.0.0.1,公网WAN口IP地址是202.244.174.37

数据帧被路由器进行解包分用交给自己的网络层后,将IP报头中的源IP地址换成了WAN口IP地址,然后再封装成数据帧发送给公网中的服务器。

当目标IP地址的服务器响应时,同样也需要封装IP报头,其中目的IP就填路由器的WAN口IP,路由器拿到这个响应后,再将IP报头中的目的IP改成客户端A的IP地址10.0.0.10,再发送给客户端A。


问题来了,如果局域网中有多台客户端主机都访问这同一个服务器,甚至每台主机上有多个进程在访问这个服务器,请求数据包都可以通过NAT路由器发送给服务器,服务器也可以将响应返回给路由器。

  • 但是,路由器收到数据包后,所有数据的IP报头中的目的IP地址都是WAN口IP,路由器如何判断这个数据是给局域网中的哪个主机呢?又是该给主机上的哪个进程呢?

NAPT:

这个时候NAT就来解决问题了,采用的是IP + port的方式建立一个转换表。

图
如上图所示,局域网中的每台客户端的IP地址都是唯一的,一台客户端上每个进程的端口号又是唯一的,所以将IP地址和端口号组合成IP:port也是唯一的。

所有客户端,所有进程访问的都是同一台服务器的同一个服务进程,所以它们的目的IP和端口都是相同的。

  • 源IP:源port目的IP:目的port组合在一起形成一个四元组,这个四元组在局域网中也是唯一的。

一个四元组其实就是IP报头中的一部分,当数据传送到NAT路由器以后,路由器会维护一份转换表,如上图所示。

转换表中,将局域网四元组的源IP地址替换成WAN口IP,四元组中的端口号也替换成一个唯一的数字,此时就形成了一个新的四元组,该四元组在公网中是唯一的,然后和旧的四元组形成一个映射关系。

  • 这个映射关系是互为键值的。

路由器也是一个主机,客户端A的数据包和客户端B的数据包,它们的四元组不同,路由器就好像是创建了两个“进程”来转发这两个数据包,并且将这两个数据包的源IP地址替换,端口号替换。

由于是路由器的不同“进程”在转发数据包,所以每一对映射关系中,路由器的四元组中的端口号都是不同的,和操作系统分配端口号是一个规则。

当服务器响应多个数据包给NAT路由器的时候,虽然目的IP地址都是WAN口IP,但是端口号不同。

路由器再根据不同端口号的公网四元组找到对应的局域网四元组,将数据发给相应客户端的相应进程。

  • NAT路由器中的映射关系转换表是由路由器自动维护的。
  • 假设使用TCP协议,当连接建立时,路由器中就会生成这对通信双方的映射表项,断开连接后就会删除这个表项。

路由器通常情况下都带有NAT功能,否则无法完成内网和公网的IP地址转换问题。

NAT技术的缺陷:

由于NAT技术非常依赖映射转换表,所以就有诸多限制:

  • 服务器无法从公网主动给内网中的客户端发数据,因为路由器中没有映射关系,映射关系是在客户端给服务端发送数据时建立的。
  • 转换表的生成和销毁都需要一定的开销,会增大路由器的负担。
  • 通信过程中,一旦NAT设备异常,所有的TCP连接就会出现异常。

😽代理服务器

假设你想买一些韩国的化妆品,但是你去韩国不方便,正好有个同学在韩国留学,此时你就可以让他帮你去实体店买,然后再给你。这个过程中,你同学扮演的就是正向代理的角色。

由于这个化妆品很好,所以你周围有很多人都让你同学帮代购,你同学觉得不停的去买比较麻烦,所以就在他国内的家里屯了一堆化妆品,有人让他代购的时候,他就将家里的化妆品给它,此时你同学扮演的就是反向代理的角色。


图
假设现在你的学校里办活动需要自己买一些东西,你和你的同学们一起从淘宝买,此时你们使用的都是校园网,淘宝为了满足大量客户的访问,所以它的服务器不止一台,而是一个服务器机群。

你和同学在访问淘宝服务器时,其实并不是你的客户端在直接访问,而是你将自己的请求交给学校的正向代理服务器,然后正向代理服务器代替你去请求淘宝。

当多个请求发送给淘宝服务器时,并不是直接发给了机群中的某台服务器,这样会导致服务器扛不住压力而奔溃。所以这些请求都是交给了淘宝的反向代理服务器。

反向代理服务器通过一些均衡策略,让这些大量的请求去访问不同的服务器,将请求压力分摊给每一台服务器,保证它的正常服务。

  • 比如Nginx就是专门用来做负载均衡,以及支持大量线程并发访问的服务器。
  • 这也就是为什么我们在访问淘宝时,并不需要区分具体哪个服务器,只需要访问淘宝即可。
  • 因为我们访问的实际上是淘宝的反向代理服务器。

上面过程中,学校的代理服务器离我们近,它是正向代理服务器,淘宝的代理服务器离我们远,它是反向代理服务器。


图
如上图所示,假设你用学校的校园网去看《战狼2》电影,你从客户端向腾讯视频发起请求,你的请求会被学校的代理服务器拦截下来,然后由代理服务器替你向腾讯视频发起请求。

腾讯视频收到代理服务器的请求后,将对应的电影资源响应给代理服务器,代理服务器收到响应后再将这个响应转发给你,并且将这个电影的响应缓存到代理服务器中。

你给你的同学推荐了这个电影,你的同学也用腾讯视频看这个电影,当他发起请求后,同样会被代理服务器拦截,然后发现本地有这个电影的缓存资源,就直接将这个资源给他返回了,代理服务器也不再向腾讯视频的服务器发起代理请求了。

这个过程中,你的同学拿到这个电影的资源比你会快很多,因为学校的代理服务器离你们更近。

  • 代替客户端发起请求的,就是正向代理服务器
  • 用来作缓存的一般就是反向代理服务器

实际上,正向代理服务器和反向代理服务器并没有非常明确的界限,就像上面例子中,学校的代理服务器既代替我们发起请求,也缓存了电影资源,它既是一个正向代理服务器也是一个反向代理服务器。

NAT和代理服务器:

代理服务器看起来和NAT设备有一点像,客户端向代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后,代理服务器又把结果回传给客户端。

局域网中的客户端将请求交给NAT设备,NAT设备再将请求通过路由发送给目标服务器,目标服务器再将响应发送给NAT设备,NAT设备再将响应转发给局域网中的客户端。

二者的区别:

  • 从应用上讲,NAT设备是网络基础设备之一,解决的是IP不足的问题。代理服务器则是更贴近具体应用,像迅游这样的加速器,也是通过代理服务器缓存数据来达到加速的目的。
  • 从底层实现上讲,NAT是工作在网络层,直接对IP地址进行替换。代理服务器工作在应用层。
  • 从使用范围上讲,NAT一般在局域网的出口部署。代理服务器可以在局域网,也可以在广域网,也可以跨网。
  • 从部署位置上看,NAT一般集成在防火墙,路由器等硬件设备上,代理服务器则是一个软件程序,需要部署在服务器上。

😽总结

这篇文章填了一些前面的坑,还介绍了网络中常用的技术和协议,是用来完善网络体系才写的,这些内容仅作为了解,并不是重点内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/86761.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【图像去噪】基于混合自适应(EM 自适应)实现自适应图像去噪研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

如何拉取Gitee / GitHub上的Unity项目并成功运行

前言 由于目前大部分人使用的仓库都是Gitee或者是GitHub,包括小编的公司所使用的项目仓库也包括了Gitee;我们需要学习技术栈时都会去百度或者是去GitHub上看看别人的项目观摩学习,可能很多小白在遇到拉取代码时出现各种问题,或者…

Server2016安装SQL server数据库遇到异常解决

首先看几个会出现的异常,下边看解决办法: 第一步: 先修改安装包x86\setup目录下的setupsql.exe,以Xp,SP3兼容模式运行, 这个右键,属性,兼容性,修改就行,类似这样 第二步: 修改c:…

【Rust】Rust学习 第十六章无畏并发

安全且高效的处理并发编程是 Rust 的另一个主要目标。并发编程(Concurrent programming),代表程序的不同部分相互独立的执行,而 并行编程(parallel programming)代表程序不同部分于同时执行,这两…

【优选算法】—— 字符串匹配算法

在本期的字符串匹配算法中,我将给大家带来常见的两种经典的示例: 1、暴力匹配(BF)算法 2、KMP算法 目录 (一)暴力匹配(BF)算法 1、思想 2、演示 3、代码展示 (二&…

大数据课程K2——Spark的RDD弹性分布式数据集

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Spark的RDD结构; ⚪ 掌握Spark的RDD操作方法; ⚪ 掌握Spark的RDD常用变换方法、常用执行方法; 一、Spark最核心的数据结构——RDD弹性分布式数据集 1. 概述 初学Spark时,把RDD看…

【微服务】spring 条件注解从使用到源码分析详解

目录 一、前言 二、spring 条件注解概述 2.1 条件注解Conditional介绍 2.2 Conditional扩展注解 2.2.1 Conditional扩展注解汇总 三、spring 条件注解案例演示 3.1 ConditionalOnBean 3.2 ConditionalOnMissingBean 3.2.1 使用在类上 3.2.2 使用场景补充 3.3 Condit…

如何使用 Docker Compose 运行 OSS Wordle 克隆

了解如何使用 Docker Compose 在五分钟内运行您自己的流行 Wordle 克隆实例。您将如何部署 Wordle? Wordle在 2021 年底发布后席卷了互联网。对于许多人来说,这仍然是一种早晨的仪式,与一杯咖啡和一天的开始完美搭配。作为一名 DevOps 工程师…

开源TTS+gtx1080+cuda11.7+conda+python3.9吊打百度TTS

一、简介 开源项目,文本提示的生成音频模型 https://github.com/suno-ai/bark Bark是由Suno创建的基于变换器的文本到音频模型。Bark可以生成极为逼真的多语种演讲以及其他音频 - 包括音乐、背景噪音和简单的声音效果。该模型还可以产生非言语沟通,如…

Linux存储学习笔记

相关文章 Linux 存储系列|请描述一下文件的 io 栈? - tcpisopen的文章 - 知乎 https://zhuanlan.zhihu.com/p/478443978 深入学习 Linux 操作系统的存储 IO 堆栈 - KaiwuDB的文章 - 知乎 https://zhuanlan.zhihu.com/p/636720297 linux存储栈概览 - st…

ssm+vue游戏攻略网站源码和论文

ssmvue游戏攻略网站源码和论文052 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 一、主要内容和基本要求 游戏攻略网站分为管理员与用户两种角色。 管理员的功能包括登录,用户管理,游…

Centos7 安装Docker 详细多图版

配置要求 Docker CE(社区免费版) 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求,所以我们在CentOS 7安装Docker。 一、Centos安装Docker 1.1 卸载(可选&#xff0…

Datawhale AI夏令营 - 用户新增预测挑战赛 | 学习笔记

数据分析与可视化 为了拟合出更好的结果就要了解训练数据之间的相互关系,进行数据分析是必不可少的一步 导入必要的库 # 导入库 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns pandas库是一个强大的分析结构化…

研发管理工具大揭秘!6款利器助你高效研发

"研发管理工具有哪些?6款研发管理利器分析Zoho Projects、Trello、Asana、Monday.com、Smartsheet、Jira。" 在如今的科技发展日新月异的时代,研发管理工具的重要性日益凸显。研发管理工具有助于提高研发效率,降低成本,…

无涯教程-PHP - preg_grep()函数

preg_grep() - 语法 array preg_grep ( string $pattern, array $input [, int $flags] ); 返回由与给定模式匹配的输入数组元素组成的数组。 如果将flag设置为PREG_GREP_INVERT,则此函数返回输入数组中与给定模式不匹配的元素。 preg_grep() - 返回值 返回使用…

Docker创建 LNMP 服务+Wordpress 网站平台

文章目录 Docker创建 LNMP 服务Wordpress 网站平台一.环境及准备工作1.项目环境2.服务器环境3.任务需求 二.Linux 系统基础镜像三.docker构建Nginx1.建立工作目录上传安装包2.编写 Dockerfile 脚本3.准备 nginx.conf 配置文件4.生成镜像5.创建自定义网络6.启动镜像容器7.验证 n…

网络安全(大厂)面试题

以下为网络安全各个方向涉及的面试题,星数越多代表问题出现的几率越大,祝各位都能找到满意的工作。 注:本套面试题,已整理成pdf文档,但内容还在持续更新中,因为无论如何都不可能覆盖所有的面试问题&#xf…

海思Hi3861L开发一-环境搭建

一、简介 之前的文章中有详细介绍了HarmonyOS的Hi3861开发,但是该开发是基于HarmonyOS来的。实际在项目开发中,可能不会用到HarmonyOS,用的还是原生的Hi3861。那这次就重新学习Hi3861L。 二、环境搭建 环境:Ubuntu18.04.5 关于Ubuntu的环境搭建,还是参考之前的文章,附上…

mysql------做主从复制,读写分离

1.为什么要做主从复制(主从复制的作用) 做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满…

Java 内置注解

一、内置注解 Java内置注解 也称 Java标准注解,是Java JDK 中自带的注解。Java 中有许多标准注解,以下是一些常见的标准注解: 1. Override:用于表示一个方法是重写父类中的方法。 2. Deprecated:用于标记已经过时的方法…