
IP 在 TCP/IP 参考模型中处于第三层,也就是网络层。
网络层的主要作用是:实现主机与主机之间的通信,也叫点对点(end to end)通信。
网络层与数据链路层有什么关系呢?
IP(网络层)用于实现主机与主机之间的通信
MAC(数据链路层)实现「直连」的两个设备之间通信。
在网络中数据包传输中也是如此,源IP地址和目标IP地址在传输过程中是不会变化的(前提:没有使用 NAT 网络),只有源 MAC 地址和目标 MAC 一直在变化。
在 TCP/IP 网络通信时,为了保证能正常通信,每个设备都需要配置正确的 IP 地址,否则无法实现正常的通信。
IP 地址(IPv4 地址)由 32
位正整数来表示,IP 地址在计算机是以二进制的方式处理的。
而人类为了方便记忆采用了点分十进制的标记方式,也就是将 32 位 IP 地址以每 8 位为组,共分为 4
组,每组以「.
」隔开,再将每组转换成十进制。
理论上32位的IP地址只能够大约43亿计算机连接网络,但是实际中不是这样分配的,实际中是根据网卡分配IP地址。
最早IP 地址分类成了 5 种类型,分别是 A 类、B 类、C 类、D 类、E 类。
每个地址划分为网络号和地址号两部分。
网络号:负责标识该 IP 地址是属于哪个「子网」的;
主机号:负责标识同一「子网」下的不同主机,用来区分设备。
每一类地址的最大主机数是根据主机号位数再减去(主机号)全0和全1的网络地址和广播地址。
广播地址用于在同一个链路中相互连接的主机之间发送数据包。
本地广播(本网络内):网络地址为 192.168.0.0/24 向192.168.0.255/24
直接广播(跨网络):网络地址为 192.168.0.0/24 向192.168.1.255/24
而 D 类和 E 类地址是没有主机号的,所以不可用于主机 IP,D 类常被用于多播,E 类是预留的分类,暂时未使用。
多播用于将包发送给特定组内的所有主机。
由于广播无法穿透路由,若想给其他网段发送同样的包,就可以使用可以穿透路由的多播。
- IP分类后,有利于更快找到网络地址和主机地址。
- 上述ABCDE分类后,在同一网络下不利于继续分类,缺少地址的灵活性,不同类的地址数量不能很好的适应地址需求。
这种方式不再有分类地址的概念,32 比特的 IP 地址被划分为两部分,前面是网络号,后面是主机号。
将子网掩码和 IP 地址按位计算 AND,就可得到网络号。
通过前面的网络号判断计算机是否在一个处于同一个广播域内,即网络地址是否相同。如果网络地址相同,表明接受方在本网络上,那么可以把数据包直接发送到目标主机。
路由器也是经过网络号来匹配转发到对应子网中。
通过子网掩码可以对子网在进行划分,对主机号进行划分使用。比如可以借两位主机号,从而将子网划分为四个段。
往往我们在学校是使用的是私有IP地址,当我们访问网络时,网站那一段看到是一个公网IP地址来访问。
私有 IP 地址通常是内部的 IT 人员管理,公有 IP 地址是由 ICANN
组织管理,中文叫「互联网名称与数字地址分配机构」。
IPV4地址仍在使用的原因
在实际中,我们会将网络分为广域网和局域网来表示更多的主机设备。
- 同一个局域网内的设备对外使用同一个IP,称为公网IP,在局域网内部的设备IP地址通过路由器进行分配。
- 此外,局域网内还能嵌套局域网,从而表示更多的主机设备。
- 根据需要不同的公网IP数量,在选择合适的ABC类IP地址进行划分,常见的使用C类,那么IP地址的开头就是192.168开头。
由此,IPv4地址到现如今还在继续使用。
IP地址的网络地址这一部分是用于进行路由控制,也可以说IP地址具有路由选择的功能。
路由控制表中记录着网络地址与下一步应该发送至路由器的地址。在主机和路由器上都会有各自的路由器控制表。
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 数据包转发到了目标主机环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址。
计算机使用一个特殊的 IP 地址 127.0.0.1 作为环回地址。与该地址具有相同意义的是一个叫做 localhost
的主机名。使用这个 IP 或主机名时,数据包不会流向网络。
每种数据链路的最大传输单元 MTU
都是不相同的,如 FDDI 数据链路 MTU 4352、以太网的 MTU 是 1500 字节等。
每种数据链路的 MTU 之所以不同,是因为每个不同类型的数据链路的使用目的不同。使用目的不同,可承载的 MTU 也就不同。
那么当 IP 数据包大小大于 MTU 时, IP 数据包就会被分片。
经过分片之后的 IP 数据报在被重组的时候,只能由目标主机进行,路由器是不会进行重组的。
假设发送方发送一个 4000 字节的大数据报,若要传输在以太网链路,则需要把数据报分片成 3 个小数据报进行传输,再交由接收方重组成大数据报。
在分片传输中,一旦某个分片丢失,则会造成整个 IP 数据报作废,所以 TCP 引入了 MSS
也就是在 TCP 层进行分片不由 IP 层分片,那么对于 UDP 我们尽量不要发送一个大于 MTU
的数据报文。
IPv4 的地址是 32 位的,大约可以提供 42 亿个地址,但是早在 2011 年 IPv4 地址就已经被分配完了。于是引入了128位的IPv6。
实际中我们还在使用IPv4,引入了广域网和局域网等机制。
由于IPv4 和 IPv6 不能相互兼容,所以不但要我们电脑、手机之类的设备支持,还需要网络运营商对现有的设备进行升级,所以这可能是 IPv6 普及率比较慢的一个原因。
IPv6 不仅仅只是可分配的地址变多了,它还有非常多的亮点。
- IPv6 可自动配置,即使没有 DHCP 服务器也可以实现自动分配IP地址,真是便捷到即插即用啊。
- IPv6 包头包首部长度采用固定的值
40
字节,去掉了包头校验和,简化了首部结构,减轻了路由器负荷,大大提高了传输的性能。- IPv6 有应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能,大大提升了安全性。
IPv4 地址长度共 32 位,是以每 8 位作为一组,并用点分十进制的表示方式。
IPv6 地址长度是 128 位,是以每 16 位作为一组,每组用冒号 「:」 隔开。
如果出现连续的 0 时还可以将这些 0 省略,并用两个冒号 「::」隔开。但是,一个 IP 地址中只允许出现一次两个连续的冒号。
IPv6 相比 IPv4 的首部改进:
40
字节。域名由若干个英文字符串组成(不区分大小写),各字符串之间用点号『.』分隔连接,其中越靠右的表示域名级别越高。域名级别最低的写在最左边。
其中 com 是顶级域名(一级域名),baidu 是二级域名,www 是三级域名。
域名服务器(也称为 DNS 服务器)负责存储域名和 IP 地址的映射关系,当我们需要获取某个域名对应的 IP 地址时,只需要从域名服务器中查询即可。
由于域名非常非常多,如果都存放在一台域名服务器中,那么不仅查询速度慢,服务器压力大,而且难以保证服务的可靠性。因此,DNS 采用了分布式的设计方案,大量的域名服务器之间通过层次
方式组织,分布在全世界范围内。
域名解析流程
整个过程中,请求主机与本地域名服务器之间的交互称为
递归查询
,而本地域名服务器与域名服务器层次结构中相关服务器的交互称为迭代查询
。递归方式:从主机到本地(本区域服务器)去查询,然后去根域名服务器,顶级域名服务器,查到再向上返回。
迭代方式:不断告诉你去哪里查,及时反馈,再去下一个地方查,再反馈。
为了减轻服务器的负担,域名服务器(例如本地区服务器)使用了高速缓存,用来存放最近查询过的域名以及映射信息,这样就不用一级级查找了。
请求主机是如何知道本地域名服务器的 IP 地址的?
当用户插上网线或者连上 WIFI 后,电脑会通过 DHCP 协议分配一个 IP 地址,与此同时,也会获取到本地域名服务器的 IP 地址!
本地域名服务器是如何知道根域名服务器的 IP 地址的?
因特网上一共有 13 个根域名服务器,它们的 IP 地址是固定不变的,因此被集成在了操作系统中,每台电脑都知道!
为了解析出百度域名的 IP 地址,一共发送了 8 份 DNS 报文。用户本来只是想和百度的服务器进行交互,却耗费了大量的时间进行域名解析,如果每次都这样搞,岂不是得慢死?因此就需要有一些提升域名解析速度的方式。
提升冲浪速度
在网络当中光光靠着IP地址的路由选择,是不够的。
在传输一个 IP 数据报的时候,确定了源 IP 地址和目标 IP 地址后,就会通过主机「路由表」确定 IP 数据包下一跳。然而,网络层的下一层是数据链路层,所以我们还要知道「下一跳」的 MAC 地址。
由于主机的路由表中可以找到下一跳的 IP 地址,所以可以通过 ARP 协议,求得下一跳的 MAC 地址。
如何获取MAC 地址
简单地说,ARP 是借助 ARP 请求与 ARP 响应两种类型的包确定 MAC 地址的。
操作系统通常会把第一次通过 ARP 获取的 MAC 地址缓存起来,以便下次直接从缓存中找到对应 IP 地址的 MAC 地址。
不过,MAC 地址的缓存是有一定期限的,超过这个期限,缓存的内容将被清除。
通过假设一个RARP 服务器,在这个服务器上注册设备的 MAC 地址及其 IP 地址。然后再将这个设备接入到网络,接着其他设备向该服务器发送包含自己MAC地址的请求信息,服务器返回对应的IP地址信息。
DHCP 在生活中我们是很常见的了,我们的电脑通常都是通过 DHCP 动态获取 IP 地址,大大省去了配 IP 信息繁琐的过程。
IPv6中不需要经过DHCP分配。
一旦客户端收到 DHCP ACK 后,交互便完成了,并且客户端能够在租用期内使用 DHCP 服务器分配的 IP 地址。
如果租约的 DHCP IP 地址快期后,客户端会向服务器发送 DHCP 请求报文:
DHCP 交互中,全程都是使用 UDP 广播通信。如果 DHCP 服务器和客户端不是在同一个局域网内,路由器又不会转发广播包,那不是每个网络都要配一个 DHCP 服务器?
所以,为了解决这一问题,就出现了 DHCP 中继代理。有了 DHCP 中继代理以后,对不同网段的 IP 地址分配也可以由一个 DHCP 服务器统一进行管理。
因此,DHCP 服务器即使不在同一个链路上也可以实现统一分配和管理IP地址。
网络地址转换,缓解IPv4地址不够用的问题。
简单的来说 NAT 就是同个公司、家庭、教室内的主机对外部通信时,把私有 IP 地址转换成公有 IP 地址。
但是这样的私有IP地址对应一个公有IP地址,是没有意义的。
由于绝大多数的网络应用都是使用传输层协议 TCP 或 UDP 来传输数据的。
因此,可以把 IP 地址 + 端口号一起进行转换。
这样,就用一个全球 IP 地址就可以了,这种转换技术就叫网络地址与端口转换 NAPT。
两个私有 IP 地址都转换 IP 地址为公有地址 120.229.175.121,但是以不同的端口号作为区分。
NAT问题
由于 NAT/NAPT 都依赖于自己的转换表,因此会有以下的问题:
- 外部无法主动与 NAT 内部服务器建立连接,因为 NAPT 转换表没有转换记录。
- 转换表的生成与转换操作都会产生性能开销。
- 通信过程中,如果 NAT 路由器重启了,所有的 TCP 连接都将被重置。
如何解决
- 第一种就是改用 IPv6
IPv6 可用范围非常大,以至于每台设备都可以配置一个公有 IP 地址,就不搞那么多花里胡哨的地址转换了,但是 IPv6 普及速度还需要一些时间。
- 第二种 NAT 穿透技术
NAT 穿越技术拥有这样的功能,它能够让网络应用程序主动发现自己位于 NAT 设备之后,并且会主动获得 NAT 设备的公有 IP,并为自己建立端口映射条目,注意这些都是 NAT设备后的应用程序自动完成的。
也就是说,在 NAT 穿透技术中,NAT设备后的应用程序处于主动地位,它已经明确地知道 NAT 设备要修改它外发的数据包,于是它主动配合 NAT 设备的操作,主动地建立好映射,这样就不像以前由 NAT 设备来建立映射了。
说人话,就是客户端主动从 NAT 设备获取公有 IP 地址,然后自己建立端口映射条目,然后用这个条目对外通信,就不需要 NAT 设备来进行转换了。
ICMP 全称是 Internet Control Message Protocol,也就是互联网控制报文协议。
ICMP 功能都有啥?
ICMP
主要的功能包括:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。在
IP
通信中如果某个IP
包因为某种原因未能达到目标地址,那么这个具体的原因将由 ICMP 负责通知。
ICMP 大致可以分为两大类:
在组播给一组主机发送数据时,用于判断一组主机是否在同一组当中。
问题:
组播地址一开始是如何初始化的?路由器一开始配置了组播地址?
描述这个过程?
描述这个过程?
这里如果主机1离开后,224.1.1.1这个组内没有其他主机了怎么办?