在我们访问某个网站的时候,使用的都不是IP地址,而是使用由符号和字母构成的一段字符串。例如www.csdn.net。并且我们在TCP/IP通信的时候,也是使用的是域名,而非繁琐难记的点分十进制IP地址。但是按照前面的协议格式所描述的数据报中,并没有域名这一说,使用的都是IP地址,那么是如何通过域名来获取IP地址呢?这便是借助到了DNS技术。
DNS:域名系统,用于存储IP地址与域名的映射关系,并且提供域名解析,通过域名来获取服务器IP地址的服务。
域名:服务器地址的别名,便于我们记忆,最终通过域名访问服务器的时候还是通过解析获取IP地址来访问服务器的。
- DNS是应用层协议
- DNS底层使用UDP进行解析
- 浏览器会缓存DNS结果
上面提到了有一个叫做hosts的文件记录了域名以及ip地址的映射关系,而存储这些映射关系的则是域名服务器。
首先产生的是根域名服务器,根域名服务器是最高级域名服务器,但是为了分摊访问压力进行容灾处理全世界一共有13台根域名服务器,分布在世界各地。
紧接着则是顶级域名服务器,这些服务器大多以所属的国家和所属组织的命名。例如代表中国的cn,代表政府的gov等。例如**.com/.org/.gov/.edu/.cn/.net等。
在紧接着,就是二级域名服务器,这类服务器往往是某一企业或者服务商所管理。例如.csdn.net/.qq.com/.baidu.com**等等
这些服务器还能再继续往下授权,可以授权出三级域名服务器,如百度知道的域名:zhidao.baidu.com。
例如百度知道
通常情况下,当我们要访问某个域名时,会按照域名服务器的等级一层一层向下查询。
上面说了那么多,当我们具体输入一个域名的时候,是如何解析的呢?
递归查询:逐层深入,从根域名服务器查找,如果没有,则继续从根域名服务器向顶级服务器开始一级一级向下查找
找到则返回,找不到则逐级向下查找。
迭代查找:逐个访问各级域名服务器
首先查找根域名服务器,如果没有则继续由本地域名服务器服务器向顶级域名服务器发起查找,其此类推
ICMP协议是一个 网络层协议 。
一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因,所以此时就需要用到ICMP来进行网络诊断。
ICMP的消息一般分为两类:一类是通知出错原因,一类是用于诊断查询。
- 确认IP包是否成功到达目标地址.
- 通知在发送过程中IP包被丢弃的原因.
- ICMP也是基于IP协议工作的. 但是它并不是传输层的功能,因此人们仍然把它归结为网络层协议;
- ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6;
通常我们想测试网络连通性时所使用的ping命令,就是基于ICMP协议。
- 注意, 此处 ping 的是域名, 而不是url! 一个域名可以通过DNS解析成IP地址.
- ping命令不光能验证网络的连通性, 同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期).
- ping命令会先发送一个 ICMP Echo Request给对端;
- 对端接收到之后, 会返回一个ICMP Echo Reply;
而网上常见的一个问题,ping命令属于什么端口?这个问题其实就是一个陷阱,因为ping基于ICMP协议,而ICMP又处于网络层,网络层并不关注端口号这一信息,端口号是属于传输层的内容。
NAT即网络地址转换技术。在前面IP协议那一章节曾经说过,我们通常使用的192.168.x.x都是私网地址,这些地址只能让我们私网中进行通信,无法与公网的IP地址进行通信。所以此时就需要用到NAT技术。
如果要与外部通信,就需要使用NAT技术,将私网IP转换成一个统一的公网IP(防止与外部地址冲突,主要用于节省IP地址),与外界通信。
从下面的图可以看到,NAT服务通常部署在网关设备上,工作在网络层(进行替换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 发送数据时就会生成表中的映射关系;
还有个问题,如果私网中有多个主机同时访问同一个外网的服务器,并且服务器返回的数据中,目的的IP地址都是相同的,因为都是通过NAT映射的同一个公网IP。那么此时,NAT路由器如何判定要把数据转发给哪一个数据呢?
这时就又引入了NAPT技术,使用IP地址加端口号来解决这个问题。
从下图看,发送时,通过NAPT技术,将不同主机的发送端口号进行处理,使得发送的时候的时候虽然用的是同一个IP地址,但是端口号不同,并且将这些映射关系存于转换表中,等数据发送回来时,在转发给对应的主机。
这种关联关系也是由NAT路由器自动维护的. 例如在TCP的情况下, 建立连接时, 就会生成这个表项; 在断开连接后, 就会删除这个表项
因为NAT的转换完全依赖这个转换表,所以有着很多限制。
- 无法从NAT外部向内部服务器建立连接;
- 装换表的生成和销毁都需要额外开销;
- 通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开
想必这个词大家一定非常熟悉,在我们访问一些国外的网站时,或者玩游戏的时候,通常都会使用加速器和代理服务,使网络更加流畅,那么他是如何做到的呢?
其实代理服务器就是个人网络与互联网服务商之间的中间代理机构。
打个比方,比如我们直接访问服务器,就相当于我们直接去生产厂家买东西,此时可能因为路途遥远,或者手续繁琐导致时间会很长。而通过代理服务器请求服务,就相当于我们在代销商这里买东西,他把货从遥远的地方进过来,手续他也处理好了,我们只需要付钱拿货就行。
例如我们访问一些国外的网站时,直接访问是不行的,而通过代理服务器请求服务,让他来获取数据,再讲数据转发给我们,此时我们就也能获取到了这个网站的数据的数据。
当使用代理服务器访问同一个目标服务器的人多了之后,为了提高效率,不用每次都去转发来获取数据,代理服务器可能会提前将目标服务器的内容缓存下来,有人访问时直接将缓存的数据发送回去,这就是反向代理的技术,而前面所说的转发的那种是正向代理。
需要注意的是,这里的代理服务与NAT服务是完全不同的东西,虽然看上去很像。
代理服务是一个应用层服务,可以部署在任意设备上,工作在应用层,我们个人向代理服务器发起请求,然后他再去访问目标服务器。
而NAT服务是一个网络层服务,部署在网关设备上,工作在网络层,我们请求的是目标服务器
- 从应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题. 代理服务器则是更贴近具体应用, 比 如通过代理服务器进行外网访问, 另外像迅游这样的加速器, 也是使用代理服务器.
- 从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换. 代理服务器往往工作在应用层.
- 从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以 跨网
- 从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署 在服务器上
如果每到一个新地方,每连接一台新设备,都需要设置一次IP地址,这无疑是一件非常麻烦的事情。
所以为了实现自动设置IP地址,统一管理IP地址分配,就产生了DHCP
当主机连接到网关设备时,就会广播DHCP请求,获取到网关的IP地址,以及DHCP服务自动分配给自己的IP地址,生成自己的路由表。