1.DHCP
当我们的电脑接上一条网线后就自动拥有了一个IP,但这个IP是怎么获得的呢?
这就需要DHCP 动态获取 IP 地址,省去了配 IP 信息繁琐的过程。
DHCP动态获取IP的过程有以下四个步骤:
- 客户端首先发起 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服务器【我方已经选择某个DHCP服务器】。
- 最后,被选择的服务端用 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+不同的端口号
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】
实际上ping是基于ICMP协议工作的,ping一个IP就是向这个IP主机发送一个IP数据报文,这个IP数据报文由【IP头+ICMP报文】组成。
ICMP 包头的类型字段,大致可以分为两大类:
- 一类是用于诊断的查询消息,也就是「查询报文类型」,查询报文类型有两种:0和8,8是回送请求(用于我方ping对方时发送的类型),0是回送应答(被ping方向我方答应的类型,表示ping成功)
- 另一类是通知出错原因的错误消息,也就是「差错报文类型」,差错报文类型有4种:
- 目标不可达消息 —— 类型 为
3
- 原点抑制消息 —— 类型
4
- 重定向消息 —— 类型
5
- 超时消息 —— 类型
11
其中类型为目标不可达消息的代码又有以下几种:
- 网络不可达代码为
0
:表示按照ping的IP去找,但是压根就不存在这个IP - 主机不可达代码为
1
:表示找到这个IP了,但是这个IP下路由表没有这个主机的信息或者主机没有连接网络或开机 - 协议不可达代码为
2
:表示找到这个主机,但是对方不支持或者禁止ping方使用的协议 - 端口不可达代码为
3
:表示当以上都符合后发现,对端主机没有进程监听 ping指定的端口 - 需要进行分片但设置了不分片位代码为
4
:假设ping时设置了禁止分片标志位, - 根据这个标志位,途中的路由器遇到超过 MTU 大小的数据包时,不会进行分片,而是直接抛弃。随后,通过一个 ICMP 的不可达消息类型,代码为 4 的报文,告知发送端主机。
回送应答IP 包中有一个字段叫做
TTL
(Time To Live
,生存周期),它的值随着每经过一次路由器就会减 1,直到减到 0 时该 IP 包会被丢弃。此时,路由器将会发送一个 ICMP 超时消息给发送端主机,并通知该包已被丢弃。
设置 IP 包生存周期的主要目的,是为了在路由控制遇到问题发生循环状况时,避免 IP 包无休止地在网络上被转发。