IP
基本认识
IP 在 TCP/IP 参考模型中处于第三层,也就是⽹络层。
⽹络层的主要作⽤是:实现主机与主机之间的通信,也叫点对点(end to end)通信。
IP的作用就是在复杂的网络环境中将数据包发送给最终的目的主机。
MAC 的作⽤则是实现「直连」的两个设备之间通信,⽽ IP 则负责在「没有直连」的两个⽹络之间进⾏通信输。
源IP地址和⽬标IP地址在传输过程中是不会变化的,只有源 MAC 地址和⽬标MAC ⼀直在变化。
IP地址
IP 地址(IPv4 地址)由 32 位正整数来表示,IP 地址在计算机是以⼆进制的⽅式处理的。
⽽⼈类为了⽅便记忆采⽤了点分⼗进制的标记⽅式,也就是将 32 位 IP 地址以每 8 位为组,共分为 4 组,以「 . 」隔开,再将每组转换成⼗进制。
实际上,IP 地址并不是根据主机台数来配置的,⽽是以⽹卡。像服务器、路由器等设备都是有 2 个以上的⽹卡,也就是它们会有 2 个以上的 IP 地址。
IP 地址的分类
有两个 IP 是特殊的,分别是主机号全为 1 和 全为 0 地址。
-
主机号全为 1 指定某个⽹络下的所有主机,⽤于⼴播吗,⼴播地址⽤于在同⼀个链路中相互连接的主机之间发送数据包。
(在本⽹络内⼴播的叫做本地⼴播。在不同⽹络之间的⼴播叫做直接⼴播。)
-
主机号全为 0 指定某个⽹络
多播⽤于将包发送给特定组内的所有主机。
IP 分类的优点&缺点
分类地址的优点就是简单明了、选路(基于⽹络地址)简单。
-
同⼀⽹络下没有地址层次,缺少地址的灵活性。
-
不能很好的与现实⽹络匹配。
这两个缺点,都可以在 CIDR ⽆分类地址解决。
这种⽅式不再有分类地址的概念,32 ⽐特的 IP 地址被划分为两部分,前⾯是⽹络号,后⾯是主机号
形式 a.b.c.d/x ,其中 /x 表示前 x 位属于⽹络号, x 的范围是 0 ~ 32 ,这就使得 IP 地址更加具有灵活性。
还有另⼀种划分⽹络号与主机号形式,那就是⼦⽹掩码,掩码的意思就是掩盖掉主机号,剩余的就是⽹络号。
将⼦⽹掩码和 IP 地址按位计算 AND,就可得到⽹络号。
为什么要分离⽹络号和主机号?
因为两台计算机要通讯,⾸先要判断是否处于同⼀个⼴播域内,即⽹络地址是否相同。
如果⽹络地址相同,表明接受⽅在本⽹络上,那么可以把数据包直接发送到⽬标主机。
路由器寻址⼯作中,也就是通过这样的⽅式来找到对应的⽹络号的,进⽽把数据包转发给对应的⽹络内。
怎么进⾏⼦⽹划分?
在上⾯我们知道可以通过⼦⽹掩码划分出⽹络号和主机号,那实际上⼦⽹掩码还有⼀个作⽤,那就是划分⼦⽹。
⼦⽹划分实际上是将主机地址分为两个部分:⼦⽹⽹络地址和⼦⽹主机地址。
- 未做⼦⽹划分的 ip 地址:⽹络地址+主机地址
- 做⼦⽹划分后的 ip 地址:⽹络地址+(⼦⽹⽹络地址+⼦⽹主机地址)
公有 IP 地址与私有 IP 地址
公有 IP 地址由谁管理呢?
IANA 是 ICANN 的其中⼀个机构,它负责分配互联⽹ IP 地址,是按州的⽅式层层分配。
IP 地址与路由控制
IP地址的⽹络地址这⼀部分是⽤于进⾏路由控制。
在发送 IP 包时,⾸先要确定 IP 包⾸部中的⽬标地址,再从路由控制表中找到与该地址具有相同⽹络地址的录,
根据该记录将 IP 包转发给相应的下⼀个路由器。
如果路由控制表中存在多条相同⽹络地址的记录,就选择相同位数最多的⽹络地址,也就是最⻓匹配。
环回地址是不会流向⽹络
环回地址是在同⼀台计算机上的程序之间进⾏⽹络通信时所使⽤的⼀个默认地址。
计算机使⽤⼀个特殊的 IP 地址 127.0.0.1 作为环回地址。
与该地址具有相同意义的是⼀个叫做 localhost 的主机名。使⽤这个 IP 或主机名时,数据包不会流向⽹络。
IP 分⽚与重组
每种数据链路的最⼤传输单元 MTU 都是不相同的,
如 FDDI 数据链路 MTU 4352、以太⽹的 MTU 是 1500 字节等。
其中,我们最常⻅数据链路是以太⽹,它的 MTU 是 1500 字节。
那么当 IP 数据包⼤⼩⼤于 MTU 时, IP 数据包就会被分⽚。
经过分⽚之后的 IP 数据报在被重组的时候,只能由⽬标主机进⾏,路由器是不会进⾏重组的。
在分⽚传输中,⼀旦某个分⽚丢失,则会造成整个 IP 数据报作废,
所以 TCP 引⼊了 MSS 也就是在 TCP 层进⾏分⽚不由 IP 层分⽚,
那么对于 UDP 我们尽量不要发送⼀个⼤于 MTU 的数据报⽂。
IPv6 基本认识
IPv6 的地址是 128 位的,这可分配的地址数量是⼤的惊⼈,
说个段⼦ IPv6 可以保证地球上的每粒沙⼦都能被分配到⼀个 IP 地址。
IPv6 的亮点
-
IPv6 可⾃动配置,即使没有 DHCP 服务器也可以实现⾃动分配IP地址,真是便捷到即插即⽤啊。
-
IPv6 包头包⾸部⻓度采⽤固定的值 40 字节,
去掉了包头校验和,简化了⾸部结构,减轻了路由器负荷,⼤⼤提⾼了传输的性能。
-
IPv6 有应对伪造 IP 地址的⽹络安全功能以及防⽌线路窃听的功能,⼤⼤提升了安全性。
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
DNS 中的域名都是⽤句点来分隔的,⽐如 www.server.com ,这⾥的句点代表了不同层次之间的界限。
在域名中,越靠右的位置表示其层级越⾼。
详细看:https://www.cnblogs.com/zwtblog/p/15267809.html#dns-域名解析
ARP
地址解析协议,即ARP(Address Resolution Protocol)
详细看 :https://www.cnblogs.com/zwtblog/p/15267809.html#如何获取对⽅的-mac-地址呢?
RARP 协议
ARP 协议是已知 IP 地址求 MAC 地址,那 RARP 协议正好相反,它是已知 MAC 地址求 IP 地址。
通常这需要架设⼀台 RARP 服务器,在这个服务器上注册设备的 MAC 地址及其 IP 地址。
然后再将这个设备接⼊到⽹络:
DHCP
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)
我们的电脑通常都是通过 DHCP 动态获取 IP 地址,⼤⼤省去了配 IP 信息繁琐的过程。
DHCP 客户端进程监听的是 68 端⼝号,DHCP 服务端进程监听的是 67 端⼝号。
DHCP 交互中,全程都是使⽤ UDP ⼴播通信。
如果 DHCP 服务器和客户端不是在同⼀个局域⽹内,路由器⼜不会转发⼴播包
DHCP 中继代理
有了 DHCP 中继代理以后,对不同⽹段的 IP 地址分配也可以由⼀个 DHCP 服务器统⼀进⾏管理。
NAT
IPv4 的地址是⾮常紧缺的,在前⾯我们也提到可以通过⽆分类地址来减缓 IPv4 地址耗尽的速度,
但是互联⽹的⽤户增速是⾮常惊⼈的,所以 IPv4 地址依然有被耗尽的危险。
于是,提出了⼀种⽹络地址转换 NAT 的⽅法,再次缓解了 IPv4 地址耗尽的问题。
简单的来说 NAT 就是同个公司、家庭、教室内的主机对外部通信时,把私有 IP 地址转换成公有 IP 地址。
普通的 NAT 转换没什么意义。
由于绝⼤多数的⽹络应⽤都是使⽤传输层协议 TCP 或 UDP 来传输数据的。
因此,可以把 IP 地址 + 端⼝号⼀起进⾏转换。
这样,就⽤⼀个全球 IP 地址就可以了,这种转换技术就叫⽹络地址与端⼝转换 NAPT。
两个私有 IP 地址都转换 IP 地址为公有地址 120.229.175.121,但是以不同的端⼝号作为区分。
⽣成⼀个 NAPT 路由器的转换表,就可以正确地转换地址跟端⼝的组合,
令客户端 A、B 能同时与服务器之间进⾏通信。这种转换表在 NAT 路由器上⾃动⽣成。
例如,在 TCP 的情况下,
建⽴ TCP 连接⾸次握⼿时的 SYN 包⼀经发出,就会⽣成这个表。
⽽后⼜随着收到关闭连接时发出 FIN 包的确认应答从表中被删除。
缺点
由于 NAT/NAPT 都依赖于⾃⼰的转换表,因此会有以下的问题:
- 外部⽆法主动与 NAT 内部服务器建⽴连接,因为 NAPT 转换表没有转换记录。
- 转换表的⽣成与转换操作都会产⽣性能开销。
- 通信过程中,如果 NAT 路由器重启了,所有的 TCP 连接都将被重置。
如何解决 NAT 潜在的问题
第⼀种就是改⽤ IPv6
IPv6 可⽤范围⾮常⼤,以⾄于每台设备都可以配置⼀个公有 IP 地址,就不搞那么多花⾥胡哨的地址转换了。
第⼆种 NAT 穿透技术
客户端主动从 NAT 设备获取公有 IP 地址,然后⾃⼰建⽴端⼝映射条⽬,然后⽤这个条⽬对外通信,就不需要 NAT 设备来进⾏转换了。
ICMP
ICMP 全称是 Internet Control Message Protocol,也就是互联⽹控制报⽂协议。
ICMP 主要的功能包括:确认 IP 包是否成功送达⽬标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。
ICMP 类型
- ⼀类是⽤于诊断的查询消息,也就是「查询报⽂类型」
- 另⼀类是通知出错原因的错误消息,也就是「差错报⽂类型」
IGMP
IGMP协议(Internet Group Management Protocol)
组播地址,也就是 D 类地址,既然是组播,那就说明是只有⼀组的主机能收到数据包,
不在⼀组的主机不能收到数组包,怎么管理是否是在⼀组呢?那么,就需要 IGMP 协议了。
IGMP 是因特⽹组管理协议,⼯作在主机(组播成员)和最后⼀跳路由之间
IGMP ⼯作机制
IGMP 分为了三个版本分别是,IGMPv1、IGMPv2、IGMPv3。
IGMPv2 作为例⼦:说说常规查询与响应和离开组播组这两个⼯作机制。
PING
IP协议的助⼿-ICMP 协议
ping-查询报⽂类型的使⽤
最简单的,同⼀个局域⽹⾥⾯的情况
traceroute-差错报⽂类型的使⽤
traceroute 作⽤一
traceroute 的第⼀个作⽤就是故意设置特殊的 TTL,来追踪去往⽬的地时沿途经过的路由器。
traceroute 的参数指向某个⽬的 IP 地址:traceroute 192.168.1.100
如何⼯作
它的原理就是利⽤ IP 包的⽣存期限 从 1 开始按照顺序递增的同时发送 UDP 包,强制接收 ICMP 超时消息的⼀种⽅法。
⽐如,将 TTL 设置 为 1 ,则遇到第⼀个路由器,就牺牲了,接着返回 ICMP 差错报⽂⽹络包,类型是时间超时。
接下来将 TTL 设置为 2 ,第⼀个路由器过了,遇到第⼆个路由器也牺牲了,也同时返回了 ICMP 差错报⽂数据包,如此往复,直到到达⽬的主机。
这样的过程,traceroute 就可以拿到了所有的路由器 IP。
当然有的路由器根本就不会返回这个 ICMP,所以对于有的公⽹地址,是看不到中间经过的路由的。
送⽅如何知道发出的 UDP 包是否到达了⽬的主机呢?
traceroute 在发送 UDP 包时,会填⼊⼀个不可能的端⼝号值作为 UDP ⽬标端⼝号(⼤于 3000 )。
当⽬的主机,收到 UDP 包后,会返回 ICMP 差错报⽂消息,但这个差错报⽂消息的类型是「端⼝不可达」。
所以,当差错报⽂类型是端⼝不可达时,说明发送⽅发出的 UDP 包到达了⽬的主机。
traceroute 作⽤⼆
traceroute 还有⼀个作⽤是故意设置不分⽚,从⽽确定路径的 MTU。
这样做的⽬的是为了路径MTU发现。
因为有的时候我们并不知道路由器的 MTU ⼤⼩,以太⽹的数据链路上的 MTU 通常是 1500 字节,但是⾮以外⽹的 MTU 值就不⼀样了,所以我们要知道 MTU 的⼤⼩,从⽽控制发送的包⼤⼩。