DNS
我们在上网的时候,通常使用的方式是域名,而不是IP地址,因为域名方便人类记忆。
那么实现这一技术的就是DNS域名解析器,DNS可以将域名网址自动转换为具体的IP地址。
域名的层级关系
DNS中的域名都是用句点来分隔的,比如www.server.com,这里的句点代表了不同层次之间的界限。
在域名中,越靠右的位置表示其层级越高
根域(.)是在对顶层(通常省略表示),下一层就是com顶级域,再下面是server.com。所以域名的层级关系类似一个树状结构:
- 根DNS服务器
- 顶级DNS服务器(com)
- 权威DNS服务器(server.com)
根域的DNS服务器信息保存在互联网中所有的DNS服务器中。这样一来,任何DNS服务器就都可以找到并访问根域DNS服务器了。
因此,客户端只要能够找到任意一台DNS服务器,就可以通过它找到根域DNS服务器,然后再一路顺藤摸瓜找到位于下层的某台目标DNS服务器。
域名解析的工作流程
浏览器先看一下自己的缓存里有没有,如果没有就找操作系统的缓存要,还没有就检查本机域名解析文件hosts,如果还是没有就会向DNS服务器进行查询,查询的过程如下:
- 客户端首先会发出一个DNS请求,问www.server.com的IP是啥,并发送给DNS服务器(也就是客户端的TCP/IP设置中填写的DNS服务器地址)
- 本地域名服务器收到客户端的请求后,如果缓存里的表格能找到www.server.com,则它直接返回IP地址。如果没有,本地DNS会去问他的根域名服务器,根域名服务器是最高层次的,它不直接用于域名解析,但是能指明一条路。
- 根DNS收到来自本地DNS的请求后,发现后置是.com,于是返回.com顶级域名服务器地址
- 本地DNS收到顶级域名服务器地址后,发起请求询问:www.server.com的ip地址。
- 顶级域名服务器返回:www.server.com的权威DNS服务器的地址
- 本地DNS于是转向问权威DNS服务器:www.server.com的IP地址
- 权威DNS服务器查询后将对应的IP地址X.X.X.X告诉本地DNS
- 本地DNS再将IP地址返回客户端,客户端与目标建立连接
ARP
在传输一个IP数据报的时候,确定了源IP地址与目标IP地址后,就会通过主机[路由表]确定IP数据包下一跳。然而网络层的下一层是数据链路层,所以我们还得知道[下一跳]的MAC地址。
ARP如何确定对方MAC地址?
ARP是借助ARP请求与ARP响应两种类型的包确定MAC地址的。
- 主机会通过广播发送ARP请求,这个包中包含了想要知道的MAC地址和主机IP地址。
- 当同一个链路中的所有设备收到ARP请求时,会去拆开ARP请求包里的内容,如果ARP请求包中的目标IP地址与自己的IP地址一致,那么这个设备就将自己的MAC地址塞入ARP响应包返回给主机
操作系统通常会把第一次通过ARP获取的MAC地址缓存起来,以便下次直接从缓存中找到对应的IP地址的MAC地址。
不过,MAC地址的缓存是有一定的期限的,超过这个期限,缓存的内容将会被清除。
RARP协议
ARP协议是已知IP地址求MAC地址,那RARP协议正好相反,它是已知MAC地址求IP地址。例如将打印机服务器等小型嵌入式设备接入到网络时就经常会用到。
这通常需要架设一台RARP服务器,在这个服务器上注册设备的MAC地及其 IP地址。然后再将这个设备接入网络,接着:
- 该设备会发送一条[我的MAC地址是xxxx,我的IP地址应该是什么?]的请求信息。
- RARP服务器接到这个消息后返回[MAC地址为xxxx的设备,IP地址为yyyy]的信息给这个设备。
最后设备就根据从RARP服务器所收到的应答信息设置自己的IP地址。
DHCP
DHCP在我们生活中很常见,我们的电脑通常都是通过DHCP动态获取IP地址,大大省去了配IP信息的繁琐过程。
我们的电脑通常经过四个步骤获取IP:
PS: DHCP客户端进程监听的是68端口号,DHCP服务器进程监听的是67端口号。
4个步骤:
- 客户端首先发起DHCP发现报文(DHCP DISCOVER)的IP数据报,由于客户端没有IP地址,也不知道DHCP服务器的地址,所以使用的是UDP广播通信,其使用的广播目的地址是255.255.255.255(端口67)并且使用0.0.0.0(端口68)作为源IP地址。DHCP客户端将该IP数据报传递给链路层,链路层然后将帧广播到所有的网络中设备。
- DHCP服务器收到DHCP发现报文,用DHCP提供报文(DHCP OFFER)向客户端做出响应。该报文仍然使用IP广播255.255.255.255,该报文信息携带服务器提供可租约的IP地址、子网掩码、默认网关、DNS服务器以及IP地址租用期。
- 客户端收到一个或多个服务器的DHCP提供报文后,从中选择一个服务器,并向选中的服务器发送DHCP请求报文(DHCP REQUEST)进行响应,回显配置的参数。
- 最后,服务端用DHCP ACK报文对DHCP请求报文进行响应,应答所要求的参数。
一旦客户端收到DHCP ACK 后,交互便完成了,并且客户端能够在组用期内使用DHCP服务器分配的IP地址。
如果租约的DHCP IP地址快到期后,客户端会向服务器发送DHCP请求报文;
- 服务器如果同意继续租用,则用DHCP ACK报文进行应答,客户端就会延长租期。
- 服务器 如果不同意继续租用,则用DHCP NACK 报文,客户端就要停止使用租约的IP地址。
可以发现,DHCP交互中,全程都是使用UDP广播通信。
用的是广播,那如果DHCP服务器和客户端不是在同一个局域网内,路由器又不会转发广播包,那不是每个网络都要配一个DHCP服务器?
所以,为了解决这一问题,就出现了DHCP中继代理。有了DHCP中继代理后,对不同网段的IP地址分配也可以由一个DHCP服务器统一进行管理。
- DHCP客户端向DHCP中继代理发送DHCP请求包,而DHCP中继代理在收到这个广播包以后,再以单播的形式发给DHCP服务器。
- 服务器端收到该包后再向DHCP中继代理返回应答,并由DHCP中继代理将次包广播给DHCP客户端。
因此,DHCP服务器即使不在同一个链路上也可以实现统一分配和管理IP地址。
NAT
为什么需要NAT协议
IPV4随着用户的增多压力不断增大,但是每一个路由器的IP地址下面都有很多的私有地址,外部消息只需要找到这个路由器,这个路由器把消息找到真正目的主机传递给它即可。每一个路由器都可以分配很多私有地址,并且不同路由器的私有地址可以重复,通过这种地址转换,能够大大增加地址的容量。
简单的来说 NAT 就是同个公司、家庭、教室内的主机对外部通信时,把私有 IP 地址转换成公有 IP 地址。
如果按照上述说法,那么N个私有IP地址,就要有N个公有IP地址,并不能缓解IPv4地址耗尽的问题。
普通的NAT转换没什么意义
由于绝大多数的网络应用都是使用传输层协议TCP和UDP来传输数据的。因此,可以把IP地址+端口号一起进行转换。
这样,就用一个全球IP地址就可以了,这种转换技术就叫网络地址和端口转换NAPT。
对于有Internet访问需求而内部又使用私有地址的网络,就要在组织的出口位置部署NAT网关,在报文离开私网进入Internet时,将源IP替换为公网地址,通常是出口设备的接口地址。一个对外的访问请求在到达目标以后,表现为由本组织出口设备发起,因此被请求的服务端可将响应由Internet发回出口网关。出口网关再将目的地址替换为私网的源主机地址,发回内部。这样一次由私网主机向公网服务端的请求和响应就在通信两端均无感知的情况下完成了。依据这种模型,数量庞大的内网主机就不再需要公有IP地址了。NAT的转换示意图如下所示:
图中有两个客户端192.168.1.10 和 192.168.1.11 同时与服务器 183.232.231.172进行通信,并且这两个客户端的本地端口都是1025.
此时,两个私有IP地址都转换IP地址为公有地址120.229.175.121,但是以不同的端口号作为区分。(把一个路由下的私有IP请求转换为该路由的请求,用不同的端口号来区分私有IP地址网络的主机,最终表现为该路由向服务器请求数据,接收到数据后,该路由通过端口号将数据发送给此路由下的主机)
于是生成一个NAPT路由器的转换表,就可以正确地转换地址和端口的组合,令客户端A、B能同时与服务器之间进行通信
缺点
由于NAT/NAPT都依赖于自己的转换表,因此会有以下问题:
- 外部无法主动与NAT内部服务器建立连接,因为NAPT转换表没有转换记录。
- 转换表的生成与转换操作都会产生性能开销
- 通信过程中,如果NAT路由器重启了,所有的TCP连接都将被重置。
如何解决NAT潜在问题
1. 改用IPv6
IPv6可用范围非常大,以至于每台设备都可以配置一个公有IP地址,就不需要这些地址转换了
2. NAT穿透技术
NAT穿透技术能够让网络应用程序主动发现自己位于NAT设备之后,主动获取NAT设备的公有IP,并为自己建立端口映射条目。然后就用这个条目对外通信,就不需要NAT设备来进行转换了。
ICMP
ICMP的全称是Internet Control Message Protocol ,也就是互联网控制报文协议。
ICMP功能
ICMP主要的功能包括:确认IP包是否成功送达目标地址、报告发送过程中IP包被废弃点的原因和改善网络设置等。
在IP通信中,如果某个IP包因为某种原因未能到达目标地址,那么这个具体的原因将由ICMP负责通知。
ICMP的这种通知消息会使用IP进行发送。
因此,从路由器 2 返回的ICMP包会按照往常的路由控制先经过路由器 1 再转发给主机 A 。收到该ICMP包的主机 A 则分解ICMP的首部和数据域后得知发生问题的具体原因。
ICMP类型
ICMP大致可以分为两类:
- 一类是用于诊断的查询消息,也就是查询报文类型
- 另一类是通知出错原因的错误消息,也就是差错报文类型