了解DHCP、NAT、ICMP

1.DHCP

当我们的电脑接上一条网线后就自动拥有了一个IP,但这个IP是怎么获得的呢?

这就需要DHCP 动态获取 IP 地址,省去了配 IP 信息繁琐的过程。

DHCP动态获取IP的过程有以下四个步骤:

  1. 客户端首先发起 DHCP 发现报文(DHCP DISCOVER) 的 IP 数据报,由于客户端没有 IP 地址,也不知道 DHCP 服务器的地址,所以使用的是 UDP 广播通信,其使用的广播目的地址是 255.255.255.255(端口 67) 并且使用 0.0.0.0(端口 68) 作为源 IP 地址。DHCP 客户端将该 IP 数据报传递给链路层,链路层然后将帧广播到所有的网络中设备。
  2. DHCP 服务器收到 DHCP 发现报文时,用 DHCP 提供报文(DHCP OFFER) 向客户端做出响应。该报文仍然使用 IP 广播地址 255.255.255.255,该报文信息携带服务器提供可租约的 IP 地址、子网掩码、默认网关、DNS 服务器以及 IP 地址租用期
  3. 客户端收到一个或多个服务器的 DHCP 提供报文后,从中选择一个服务器,并向选中的服务器发送 DHCP 请求报文(DHCP REQUEST进行响应,回显配置的参数。告知所有DHCP服务器【我方已经选择某个DHCP服务器】
  4. 最后,被选择的服务端用 DHCP ACK 报文对 DHCP 请求报文进行响应,应答所要求的参数。

一旦客户端收到 DHCP ACK 后,交互便完成了,并且客户端能够在租用期内使用 DHCP 服务器分配的 IP 地址。

如果租约的 DHCP IP 地址快期后,客户端会向服务器发送 DHCP 请求报文:

  • 服务器如果同意继续租用,则用 DHCP ACK 报文进行应答,客户端就会延长租期。
  • 服务器如果不同意继续租用,则用 DHCP NACK 报文,客户端就要停止使用租约的 IP 地址。

如果 DHCP 服务器和客户端不是在同一个局域网内,路由器又不会转发广播包,那不是每个局域网都要配一个 DHCP 服务器?

是的,每个局域网都会配置一个DHCP服务器,但这种服务器称为DHCP 中继代理

  • DHCP 客户端会向 DHCP 中继代理发送 DHCP 请求包,而 DHCP 中继代理在收到这个广播包以后,再以单播的形式发给 DHCP 服务器。
  • 服务器端收到该包以后再向 DHCP 中继代理返回应答,并由 DHCP 中继代理将此包广播给 DHCP 客户端 。

2.NAT

一个局域网里的主机都被分配了各自的私网IP,但私网IP要怎么和公网IP联系呢?

于是,提出了一种网络地址转换 NAT 的方法,NAT 就是同个公司、家庭、教室内的主机对外部通信时,把私有 IP 地址转换成公有 IP 地址。

可是这样的话,同局域网下的两台主机都想与同一个服务器通信,两台主机对外的IP都是公有IP,该怎么区分呢?

解决办法就是大伙还是都用同一个公网IP,但是后面接上各自的不同端口号。NAT路由器生成有一张转换表,由NAT路由器帮忙转换成公网IP+不同的端口号

image-20230325185750748

3.ICMP

ICMP 全称是 Internet Control Message Protocol,也就是互联网控制报文协议

确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。

假设主机A向主机B发送一个数据包的途中需要经历两个路由器,如果数据包被路由器2发往主机B时,主机B由于某些原因无法接收(比如说主机B关机了),路由器2尝试多次无果后,会向主机A发送一个ICMP目标不可达数据包,说明发往主机B数据包未能成功。

4.Ping的工作原理

平时我们为了确认自己主机是否能够连接外部网络,会主动ping一个ip地址,比如 【ping www.baidu.com】

image-20230325194814175

实际上ping是基于ICMP协议工作的,ping一个IP就是向这个IP主机发送一个IP数据报文,这个IP数据报文由【IP头+ICMP报文】组成。

ICMP 包头的类型字段,大致可以分为两大类:

  • 一类是用于诊断的查询消息,也就是「查询报文类型」,查询报文类型有两种:0和8,8是回送请求(用于我方ping对方时发送的类型),0是回送应答(被ping方向我方答应的类型,表示ping成功)
  • 另一类是通知出错原因的错误消息,也就是「差错报文类型」,差错报文类型有4种:
  • 目标不可达消息 —— 类型 为 3
  • 原点抑制消息 —— 类型 4
  • 重定向消息 —— 类型 5
  • 超时消息 —— 类型 11

image-20230325200054257

其中类型为目标不可达消息的代码又有以下几种:

  • 网络不可达代码为 0:表示按照ping的IP去找,但是压根就不存在这个IP
  • 主机不可达代码为 1:表示找到这个IP了,但是这个IP下路由表没有这个主机的信息或者主机没有连接网络或开机
  • 协议不可达代码为 2:表示找到这个主机,但是对方不支持或者禁止ping方使用的协议
  • 端口不可达代码为 3:表示当以上都符合后发现,对端主机没有进程监听 ping指定的端口
  • 需要进行分片但设置了不分片位代码为 4:假设ping时设置了禁止分片标志位,
  • 根据这个标志位,途中的路由器遇到超过 MTU 大小的数据包时,不会进行分片,而是直接抛弃。随后,通过一个 ICMP 的不可达消息类型,代码为 4 的报文,告知发送端主机。

回送应答IP 包中有一个字段叫做 TTLTime To Live,生存周期),它的值随着每经过一次路由器就会减 1,直到减到 0 时该 IP 包会被丢弃。

此时,路由器将会发送一个 ICMP 超时消息给发送端主机,并通知该包已被丢弃。

设置 IP 包生存周期的主要目的,是为了在路由控制遇到问题发生循环状况时,避免 IP 包无休止地在网络上被转发。


 上一篇
Java集合的底层逻辑 Java集合的底层逻辑
1.集合的体系Java集合总的分为两种:单列集合(Collection)和双列集合(Map),继承关系如下: 2.Collection接口1. List接口:1.1 ArrayList类ArrayList维护了一个Object类型的数组
2023-03-29
下一篇 
HTTPS之加密 HTTPS之加密
HTTP 与 HTTPSHTTP 与 HTTPS 有哪些区别? HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS
2023-03-24
  目录