5.2 DNS
通常在访问某个网站时不直接使用IP地址,而是使用一串字符串,这是DNS技术的支持。DNS可以将那个字符串自动转换为具体的IP地址。
DNS系统可以维护一个用来表示组织内部主机名和IP地址之间对应关系的数据库。
在应用中,当用户输入主机名(域名)时,DNS会自动检索那个注册了主机名和IP地址的数据库,并迅速定位对应的IP地址。(使用ns-lookup 主机名
命令会返回对应的IP地址)。如果主机名和IP地址需要进行变更时,只需要在组织机构内部进行处理即可,没必要再向其他机构申请或报告。
DNS查询
例如kusa.co.jp
域中的计算机想访问网站www.ietf.org
,流程如下:
5.3 ARP
只要确定了 IP 地址,就可以向这个目标地址发送 IP 数据报。然而在底层数据链路层,进行实际通信时有必要了解每个 IP 地址对应的 MAC 地址。
ARP 是一种解决地址问题的协议。以目标IP地址为线索,定位下一个应该接收数据分包的网络设备对应的MAC地址。如果目标主机不再同一个链路上时,可以通过ARP查找下一条路由器的MAC地址。不过ARP只适用于IPv4不能用于IPv6。
ARP工作机制
ARP 借助 ARP 请求与 ARP 响应两种类型的包确定 MAC 地址。
假如主机A向同一链路上的主机B发送IP包,它们互不知道对方的 MAC 地址:
主机为获得主机B的MAC地址,起初要通过广播发送一个 ARP 请求包。包中内含了想要了解其MAC地址的主机IP地址(即ARP请求包中已经包含了主机B的IP地址)。由于广播的包可以被同一链路上的所有主机或路由器接收,因此ARP的请求包会被这同一个链路上的所有主机和路由器进行解析。如果ARP请求包中的目标IP地址与自己的IP地址一致,那么该节点就将自己的MAC地址塞入ARP响应包返回给主机A。
为了防止不必要的网络流量(每发送一个IP数据报都要进行一次ARP请求以确定MAC地址),通常做法是把获取到的MAC地址缓存一段时间,将IP和MAC的映射关系记忆到ARP缓存表中,下一次再向这个IP地址发送数据报时无须重发ARP请求,而直接使用缓存。
IP地址与MAC地址缺一不可
如果仅考虑同一数据链路中的通信,可能会觉得:
- 只要知道接收端的MAC地址就知道数据是发给哪个主机的,不需要知道IP地址
- 只要知道IP地址,即使不做ARP,只要在数据链路上做一个广播就可以发送到目标主机,所以不需要MAC地址
但是考虑发送给其他数据链路中的某台主机,就会发现IP地址和MAC地址缺一不可。
如下图,主机A想发送IP数据报给主机B时,必须要经过路由器C。即使知道了主机B的MAC地址,由于路由器C会隔断两个网络(数据链路),所以无法实现直接从主机A发送数据报给主机B。此时主机A必须先将数据报发送给路由器C的MAC地址C1.
在以太网上发送IP包时,下次要经由那个路由器转发数据报这一信息十分重要。就类似于之前的类比:IP地址相当于行程表,而MAC地址就相当于站与站之间的车票。
RARP
RARP就是将ARP反过来,从MAC地址定位IP地址。用于小型嵌入式设备接入网络。
5.4 ICMP
架构IP网络时需要注意两点:确认网络是否正常工作,以及遇到异常时进行问题诊断。
ICMP主要功能包括:
- 确认IP包是否成功送达目标地址
- 通知在发送过程当中IP包被废弃的具体原因
- 改善网络设置等。
在IP通信中如果某个IP包因为某种原因未到达目标地址,那么该具体原因由ICMP负责通知。
如图,主机A向主机B发送数据包,由于某原因,图中的路由器2未发现主机B的存在。此时,路由器2就会向主机A发送一个ICMP包,用于说明主机B的包未能成功。
ICMP的这种通知消息会使用IP进行发送(在ICMP中,包以明文形式像TCP/UDP一样通过IP进行传输。但是ICMP的功能并非传输层的补充,而应该作为IP的一部分)。因此路由器2返回的ICMP包会先经过路由器1再转发给主机A。
ICMP消息大致分为两类:
- 通知出错原因的错误消息
- 用于诊断的查询消息
这部分看原书
5.5 DHCP
DHCP技术,计算机只要连接到网络就可以进行TCP/IP通信(即插即用),实现了自动设置IP地址、统一管理IP地址分配。
DHCP工作机制
使用DHCP之前,要先架设一台DHCP服务器(很多时候用该网段的路由器充当DHCP服务器)。随后将DHCP要分配的IP地址设置到服务器上。此外,还需要将相应的子网掩码、路由控制信息和DNS服务器地址等设置到服务器上。
从DHCP中获取IP地址流程主要分为两个阶段:
注意,在发送DHCP发现包和DHCP请求包时,DHCP即插即用的IP地址尚未确定。所以DHCP发现包的目标地址为广播地址255.255.255.255
,而源地址则为0.0.0.0
表示未知。
在服务器返回DHCP提供包时,与客户端的通信可以是广播也可以是单播,取决于设定的BROADCAST flag = 0
(单播),BROADCAST flag = 1
(广播)。
在使用单播向客户端通信时,并不是通过ARP来获得IP地址的,而是通过:
这个DHCP报文,客户端会在chaddr中填入自己的MAC地址,而待分配的IP地址由服务器填入yiaddr。此时有了客户端的MAC地址和IP地址,就可以完成IP报文的封装。
DHCP在分配IP地址时有两种方法:
- 由DHCP服务器在特定的IP地址中自动选出一个进行分配
- 针对MAC地址分配一个固定的IP地址
上述两种方法可以并用。
为了检查索要分配的IP地址以及已经分配了的IP地址是否可用,DHCP服务器和客户端要具备以下功能:
- DHCP服务器要在分配IP地址前发送ICMP回送请求包,确认没有返回应答。
- DHCP客户端针对从DHCP那获得的IP地址发送ARP请求包,确认没有返回应答。
DHCP中继代理
在大型网络环境中,将DHCP服务器分散到各个路由器上,不利用管理和运维。所以需要将DHCP统一管理。
可以使用DHCP中继代理来实现。只需要在每个网段设置一个DHCP中继代理(DHCP中继代理多为路由器)。可以设置DHCP服务器的IP地址,从而可以在DHCP服务器上为每个网段注册IP地址的分配范围。
DHCP客户端会向DHCP中继代理发送DHCP请求包,而DHCP中继代理在收到广播包后再以单播的形式发给DHCP服务器。服务器接收到该包后再向DHCP中继代理返回应答,并由DHCP中继代理将此包转发给DHCP客户端(DHCP包中包含发出请求的主机的MAC地址,DHCP中继代理正式利用这个MAC地址将包返回给DHCP客户端)。由此,即使不在同一个链路上也可以实现统一分配和管理IP地址。
5.6 NAT
NAT是用于在本地网络中使用私有地址,在连接互联网时转而使用全局IP地址的技术。除转换IP地址外,还出现了可以转换TCP、UDP端口号的NAPT技术,由此可以实现用一个全局IP地址与多个主机的通信。
NAT工作机制
如上图,10.0.0.10
主机与163.221.120.9
主机进行通信。
利用NAT,图中的NAT路由器将发送的源地址从10.0.0.10
转换为全局的IP地址(202.244.174.37
)再发送数据。
反之当包从地址163.221.120.9
发来时,目标地址(202.244.174.37
)先被转换成私有IP地址10.0.0.10
以后再被转发。
HINT:在TCP或UDP中,由于IP首部中的IP地址还用于校验和的计算,因此当IP地址变化时,也需要相应地将TCP、UDP的首部进行转换。
在NAT(NAPT)路由器内部,有一张自动生成的用来转换地址的表。当10.0.0.10
向163.221.120.9
发送第一个包时生成这张表,并按照表中的映射关系处理。
当私有网络中的多台机器同时都要与外部进行通信时,仅仅转换IP地址,会产生相同的全局IP地址,所以需要连着NAPT(包含端口号一起转换)一块使用:
但是需要注意的是,在TCP、UDP通信时,只有目标地址、源地址、目标端口、源端口以及协议类型五项内容都一致时才认为是同一个连接。
此处生成了一个NAPT路由器的转换表,可以正确地转换地址和端口的组合,令客户端A、B能同时与服务器之间进行通信。
转换表在NAT路由器上自动生成。例如,在TCP情况下,建立TC连接首次握手时的SYN包一经发出就会生成该表,而后随着收到关闭连接时发出的FIN包的确认应答从表中删除。(UDP中两端应用进行通信时的起止时间不一定保持一致,因此在这种情况下生成转换表相对较难)
NAT的潜在问题
由于NAT(NAPT)都依赖于自己的转换表,因此会有以下几点限制:
- 无法从NAT外部向内部服务器建立连接。
- 转换表的生成与转换操作都会产生一定的开销
- 通信过程中一旦NAT遇到异常需重启时,所有TCP连接都将被重置
- 即使备置两台NAT做容灾备份,TCP连接还是会断开。
5.7 IP隧道
在一个网络环境中,处于中间的网络C支持IPv4,那么网络A与网络B之间无法直接进行通信:
IP隧道可以将从网络A发过来的IPv6的包统合为一个数据,再为之追加一个IPv4首部以后转发给网络C。
一般而言,网络层首部(IP)后面紧随着的是传输层首部(TCP或UDP),而这种网络层首部后继续追加网络层首部的通信方法叫做IP隧道。
显式拥塞通知
TCP虽然也能控制网络拥塞,但是它是通过数据报实际损坏情况判断是否发生拥塞。这种方法并不能在数据报损坏之前减少数据包的发送量。
ECN机制就是IP层的一种显式拥塞通知机制。
ECN为实现拥塞通知功能,将IP首部的TOS字段(区分服务)置换为ECN字段,并在TCP首部的保留位中追加CWR标志和ECE标志。
ECN机制概括起来就是在发送包的IP首部中记录路由器是否遇到拥塞,并在返回包的TCP首部中通知是否发生过拥塞。拥塞检查在网络层进行,而拥塞通知则在传输层进行。