IP 基础知识“全家桶”,45 张图一套带走
The following article is from 小林coding Author 小林coding
前言
首先是前菜 「 IP 基本认识 」
其次是主菜 「IP 地址的基础知识」
最后是点心 「IP 协议相关技术」
为啥要比喻成菜?因为小林是菜狗(押韵不?)
正文
前菜 —— IP 基本认识
网络层与数据链路层有什么关系呢?
主菜 —— IP 地址的基础知识
32
位正整数来表示,IP 地址在计算机是以二进制的方式处理的。4
组,每组以「.
」隔开,再将每组转换成十进制。可能有的小伙伴提出了疑问,现在不仅电脑配了 IP, 手机、IPad 等电子设备都配了 IP 呀,照理来说肯定会超过 43 亿啦,那是怎么能够支持这么多 IP 的呢?
NAT
,使得可连接计算机数超过 43 亿台。NAT
技术后续会进一步讨论和说明。IP 地址的分类
什么是 A、B、C 类地址?
A、B、C 分类地址最大主机个数是如何计算的呢?
主机号全为 1 指定某个网络下的所有主机,用于广播
主机号全为 0 指定某个网络
广播地址用于什么?
172.20.0.0/16
用二进制表示如下:172.20.255.255
。在本网络内广播的叫做本地广播。例如网络地址为 192.168.0.0/24 的情况下,广播地址是 192.168.0.255 。因为这个广播地址的 IP 包会被路由器屏蔽,所以不会到达 192.168.0.0/24 以外的其他链路上。
在不同网络之间的广播叫做直接广播。例如网络地址为 192.168.0.0/24 的主机向 192.168.1.255/24 的目标地址发送 IP 包。收到这个包的路由器,将数据转发给192.168.1.0/24,从而使得所有 192.168.1.1~192.168.1.254 的主机都能收到这个包(由于直接广播有一定的安全问题,多数情况下会在路由器上设置为不转发)。
什么是 D、E 类地址?
多播地址用于什么?
1110
就表示是多播地址,而剩下的 28 位是多播的组编号。224.0.0.0 ~ 224.0.0.255 为预留的组播地址,只能局域网中,路由器是不会进行转发的
224.0.1.0 ~ 238.255.255.255 为用户可用的组播地址,可以用于 Internet 上
239.0.0.0 ~ 239.255.255.255 为本地管理组播地址,可供内部网在内部使用,仅在特定的本地范围内有效
IP 分类的优点
IP 分类的缺点
C 类地址能包含的最大主机数量实在太少了,只有 254 个,估计一个网吧都不够用。
而 B 类地址能包含的最大主机数量又太多了,6 万多台机器放在一个网络下面,一般的企业基本达不到这个规模,闲着的地址就是浪费。
CIDR
无分类地址解决。无分类地址 CIDR
CIDR
。怎么划分网络号和主机号的呢?
a.b.c.d/x
,其中 /x
表示前 x 位属于网络号, x 的范围是 0 ~ 32
,这就使得 IP 地址更加具有灵活性。/24
表示前 24 位是网络号,剩余的 8 位是主机号。为什么要分离网络号和主机号?
怎么进行子网划分?
未做子网划分的 ip 地址:网络地址+主机地址
做子网划分后的 ip 地址:网络地址+(子网网络地址+子网主机地址)
公有 IP 地址与私有 IP 地址
公有 IP 地址由谁管理呢?
ICANN
组织管理,中文叫「互联网名称与数字地址分配机构」。ARIN 北美地区
LACNIC 拉丁美洲和一些加勒比群岛
RIPE NCC 欧洲、中东和中亚
AfriNIC 非洲地区
APNIC 亚太地区
IP 地址与路由控制
主机 A 要发送一个 IP 包,其源地址是
10.1.1.30
和目标地址是10.1.2.10
,由于没有在主机 A 的路由表找到与目标地址10.1.2.10
的网络地址,于是把包被转发到默认路由(路由器1
)路由器
1
收到 IP 包后,也在路由器1
的路由表匹配与目标地址相同的网络地址记录,发现匹配到了,于是就把 IP 数据包转发到了10.1.0.2
这台路由器2
路由器
2
收到后,同样对比自身的路由表,发现匹配到了,于是把 IP 包从路由器2
的10.1.2.1
这个接口出去,最终经过交换机把 IP 数据包转发到了目标主机
环回地址是不会流向网络
localhost
的主机名。IP 分片与重组
MTU
都是不相同的,如 FDDI 数据链路 MTU 4352、以太网的 MTU 是 1500 字节等。1500
字节。MSS
也就是在 TCP 层进行分片不由 IP 层分片,那么对于 UDP 我们尽量不要发送一个大于 MTU
的数据报文。IPv6 基本认识
128
位的,这可分配的地址数量是大的惊人,说个段子 IPv6 可以保证地球上的每粒沙子都能被分配到一个 IP 地址。IPv6 的亮点
IPv6 可自动配置,即使没有 DHCP 服务器也可以实现自动分配IP地址,真是便捷到即插即用啊。
IPv6 包头包首部长度采用固定的值
40
字节,去掉了包头校验和,简化了首部结构,减轻了路由器负荷,大大提高了传输的性能。IPv6 有应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能,大大提升了安全性。
… (由你发现更多的亮点)
IPv6 地址的标识方法
IPv6 地址的结构
单播地址,用于一对一的通信
组播地址,用于一对多的通信
任播地址,用于通信最近的节点,最近的节点是由路由协议决定
没有广播地址
IPv6 单播地址类型
在同一链路单播通信,不经过路由器,可以使用链路本地单播地址,IPv4 没有此类型
在内网里单播通信,可以使用唯一本地地址,相当于 IPv4 的私有 IP
在互联网通信,可以使用全局单播地址,相当于 IPv4 的公有 IP
IPv4 首部与 IPv6 首部
取消了首部校验和字段。 因为在数据链路层和传输层都会校验,因此 IPv6 直接取消了 IP 的校验。
取消了分片/重新组装相关字段。 分片与重组是耗时的过程,IPv6 不允许在中间路由器进行分片与重组,这种操作只能在源与目标主机,这将大大提高了路由器转发的速度。
取消选项字段。 选项字段不再是标准 IP 首部的一部分了,但它并没有消失,而是可能出现在 IPv6 首部中的「下一个首部」指出的位置上。删除该选项字段是的 IPv6 的首部成为固定长度的
40
字节。
点心 —— IP 协议相关技术
DNS 域名解析
ARP 与 RARP 协议
DHCP 动态获取 IP 地址
NAT 网络地址转换
ICMP 互联网控制报文协议
IGMP 因特网组管理协
DNS
域名的层级关系
www.server.com
,这里的句点代表了不同层次之间的界限。根 DNS 服务器
顶级域 DNS 服务器(com)
权威 DNS 服务器(server.com)
域名解析的工作流程
hosts
,如果还是没有,就会 DNS 服务器进行查询,查询的过程如下:客户端首先会发出一个 DNS 请求,问 www.server.com 的 IP 是啥,并发给本地 DNS 服务器(也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址)。
本地域名服务器收到客户端的请求后,如果缓存里的表格能找到 www.server.com,则它直接返回 IP 地址。如果没有,本地 DNS 会去问它的根域名服务器:“老大, 能告诉我 www.server.com 的 IP 地址吗?” 根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
根 DNS 收到来自本地 DNS 的请求后,发现后置是 .com,说:“www.server.com 这个域名归 .com 区域管理”,我给你 .com 顶级域名服务器地址给你,你去问问它吧。”
本地 DNS 收到顶级域名服务器的地址后,发起请求问“老二, 你能告诉我 www.server.com 的 IP 地址吗?”
顶级域名服务器说:“我给你负责 www.server.com 区域的权威 DNS 服务器的地址,你去问它应该能问到”。
本地 DNS 于是转向问权威 DNS 服务器:“老三,www.server.com对应的IP是啥呀?” server.com 的权威 DNS 服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。
权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS。
本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。
ARP
那么 ARP 又是如何知道对方 MAC 地址的呢?
主机会通过广播发送 ARP 请求,这个包中包含了想要知道的 MAC 地址的主机 IP 地址。
当同个链路中的所有设备收到 ARP 请求时,会去拆开 ARP 请求包里的内容,如果 ARP 请求包中的目标 IP 地址与自己的 IP 地址一致,那么这个设备就将自己的 MAC 地址塞入 ARP 响应包返回给主机。
RARP 协议你知道是什么吗?
RARP
服务器,在这个服务器上注册设备的 MAC 地址及其 IP 地址。然后再将这个设备接入到网络,接着:该设备会发送一条「我的 MAC 地址是XXXX,请告诉我,我的IP地址应该是什么」的请求信息。
RARP 服务器接到这个消息后返回「MAC地址为 XXXX 的设备,IP地址为 XXXX」的信息给这个设备。
DHCP
客户端首先发起 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 NACK 报文,客户端就要停止使用租约的 IP 地址。
咦,用的是广播,那如果 DHCP 服务器和客户端不是在同一个局域网内,路由器又不会转发广播包,那不是每个网络都要配一个 DHCP 服务器?
DHCP 客户端会向 DHCP 中继代理发送 DHCP 请求包,而 DHCP 中继代理在收到这个广播包以后,再以单播的形式发给 DHCP 服务器。
服务器端收到该包以后再向 DHCP 中继代理返回应答,并由 DHCP 中继代理将此包转发给 DHCP 客户端 。
NAT
那不是 N 个 私有 IP 地址,你就要 N 个公有 IP 地址?这怎么就缓解了 IPv4 地址耗尽的问题?这不瞎扯吗?
NAT 那么牛逼,难道就没缺点了吗?
外部无法主动与 NAT 内部服务器建立连接,因为 NAPT 转换表没有转换记录。
转换表的生产与转换操作都会产生性能开销。
通信过程中,如果 NAT 路由器重启了,所有的 TCP 连接都将被重置。
如何解决 NAT 潜在的问题呢?
ICMP
ICMP 功能都有啥?
ICMP
主要的功能包括:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。IP
通信中如果某个 IP
包因为某种原因未能达到目标地址,那么这个具体的原因将由 ICMP 负责通知。A
向主机 B
发送了数据包,由于某种原因,途中的路由器 2
未能发现主机 B
的存在,这时,路由器 2
就会向主机 A
发送一个 ICMP
目标不可达数据包,说明发往主机 B
的包未能成功。IP
进行发送 。2
返回的 ICMP 包会按照往常的路由控制先经过路由器 1
再转发给主机 A
。收到该 ICMP 包的主机 A
则分解 ICMP 的首部和数据域以后得知具体发生问题的原因。ICMP 类型
一类是用于诊断的查询消息,也就是「查询报文类型」
另一类是通知出错原因的错误消息,也就是「差错报文类型」
IGMP
IGMP
协议了。IGMP 报文向路由器申请加入和退出组播组,默认情况下路由器是不会转发组播包到连接中的主机,除非主机通过 IGMP 加入到组播组,主机申请加入到组播组时,路由器就会记录 IGMP 路由器表,路由器后续就会转发该组播地址的数据包了。
IGMP 报文采用 IP 封装,IP 头部的协议号为 2,而且 TTL 字段值通常 为 1,因为 IGMP 是工作在主机与连接的路由器之间。
IGMP 工作机制
IGMPv2
作为例子,说说常规查询与响应和离开组播组这两个工作机制。路由器会周期性发送目的地址为
224.0.0.1
(表示同一网段内所有主机和路由器) IGMP 常规查询报文;主机1 和 主机 3 收到这个查询,随后会启动「报告延迟计时器」,计时器的时间是随机的,通常是 0~10 秒,计时器超时后主机就会发送 IGMP 成员关系报告报文(源 IP 地址为自己主机的 IP 地址,目的 IP 地址为组播地址)。如果在定时器超时之前,收到同一个组内的其他主机发送的成员关系报告报文,则自己不再发送,这样可以减少网络中多余的 IGMP 报文数量;
路由器收到主机的成员关系报告报文后,就会在 IGMP 路由表中加入该组播组,后续网络中一旦该组播地址的数据到达路由器,它会把数据包转发出去;
主机 1 要离开组 224.1.1.1,发送 IGMPv2 离组报文,报文的目的地址是 224.0.0.2(表示发向网段内的所有路由器);
路由器收到该报文后,以 1 秒为间隔连续发送 IGMP 特定组查询报文(共计发送 2 个),以便确认该网络是否还有 224.1.1.1 组的其他成员;
主机 3 仍然是组 224.1.1.1 的成员,因此它立即响应这个特定组查询。路由器知道该网络中仍然存在该组播组的成员,于是继续向该网络转发 224.1.1.1 的组播数据包;
主机 1 要离开组播组 224.1.1.1,发送 IGMP 离组报文;
路由器收到该报文后,以 1 秒为间隔连续发送 IGMP 特定组查询报文(共计发送 2 个)。此时在该网段内,组 224.1.1.1 已经没有其他成员了,因此没有主机响应这个查询;
一定时间后,路由器认为该网段中已经没有 224.1.1.1 组播组成员了,将不会再向这个网段转发该组播地址的数据包;