计网基础-IP基础

loading 2023年02月01日 53次浏览

1. 引入

IP 在 TCP/IP 参考模型中处于第三层,也就是网络层。

网络层的主要作用是:实现主机与主机之间的通信,也叫点对点通信。

网络层与数据链路层有什么关系呢?

MAC 的作用是实现「直连」的两个设备之间通信,而 IP 则负责在「没有直连」的两个网络之间进行通信传输。

因此也能看出来,源IP地址和目标IP地址在传输过程中是不会变化的(前提:没有使用 NAT 网络),只有源 MAC 地址和目标 MAC 一直在变化。(这句话在别的博客里好像写过了)

2. IP地址

很多内容当时课内都学过,这里就快速带过复习一下。

在 TCP/IP 网络通信时,为了保证能正常通信,每个设备都需要配置正确的 IP 地址,否则无法实现正常的通信。

IPv4 地址由 32 位正整数来表示,IP 地址在计算机是以二进制的方式处理的。

实际上,IP 地址并不是根据主机台数来配置的,而是以网卡。像服务器、路由器等设备都是有 2 个以上的网卡,也就是它们会有 2 个以上的 IP 地址。

2.1 分类

IP地址有5种分类:

ABC类地址是我们平常用的地址:

最大主机数是2^主机号位数-2 因为要去除主机号全0和全1的情况

主机号全为 1 指定某个网络下的所有主机,用于广播
主机号全为 0 指定某个网络

D类地址常用于IP多播,E类地址暂时用于预留以后使用。

多播用于将包发送给特定组内的所有主机。

2.1.1 CIDR 无分类地址

传统的IP分类有着许多缺点,

  • 同一网络下没有地址层次:一个公司里用了 B 类地址,但是可能需要根据生产环境、测试环境、开发环境来划分地址层次,而这种 IP 分类是没有地址层次划分的功能
  • C类包含地址太少,B类包含地址太多等。

因此引入无分类地址CIDR,这种方式不再有分类地址的概念,32 比特的 IP 地址被划分为两部分,前面是网络号,后面是主机号

表示形式 a.b.c.d/x,其中 /x 表示前 x 位属于网络号, x 的范围是 0 ~ 32,这就使得 IP 地址更加具有灵活性。

比如 10.100.122.2/24,这种地址表示形式就是 CIDR,/24 表示前 24 位是网络号,剩余的 8 位是主机号。

还有另一种划分网络号与主机号形式,那就是子网掩码,掩码的意思就是掩盖掉主机号,剩余的就是网络号。

将子网掩码和 IP 地址按位计算 AND,就可得到网络号。

为什么要分离网络号和主机号?

因为两台计算机要通讯,首先要判断是否处于同一个广播域内,即网络地址是否相同。如果网络地址相同,表明接受方在本网络上,那么可以把数据包直接发送到目标主机。

路由器寻址工作中,也就是通过这样的方式来找到对应的网络号的,进而把数据包转发给对应的网络内。

怎么进行子网划分?

在上面我们知道可以通过子网掩码划分出网络号和主机号,那实际上子网掩码还有一个作用,那就是划分子网

子网划分实际上是将主机地址分为两个部分:子网网络地址和子网主机地址

假设对 C 类地址进行子网划分,网络地址 192.168.1.0,使用子网掩码 255.255.255.192 对其进行子网划分。

C 类地址中前 24 位是网络号,最后 8 位是主机号,根据子网掩码可知从 8 位主机号中借用 2 位作为子网号。

由于子网网络地址被划分成 2 位,那么子网地址就有 4 个,分别是 00、01、10、11

2.2 路由跳转

比较好理解,如图:

  1. 主机 A 要发送一个 IP 包,其源地址是 10.1.1.30 和目标地址是 10.1.2.10,由于没有在主机 A 的路由表找到与目标地址 10.1.2.10 相同的网络地址,于是包被转发到默认路由(路由器 1 )
  2. 路由器 1 收到 IP 包后,也在路由器 1 的路由表匹配与目标地址相同的网络地址记录,发现匹配到了,于是就把 IP 数据包转发到了 10.1.0.2 这台路由器 2
  3. 路由器 2 收到后,同样对比自身的路由表,发现匹配到了,于是把 IP 包从路由器 2 的 10.1.2.1 这个接口出去,最终经过交换机把 IP 数据包转发到了目标主机

计算机使用一个特殊的 IP 地址 127.0.0.1 作为环回地址(相当于localhost),使用这个 IP 或主机名时,数据包不会流向网络。

2.3 IPV6

IPv4 的地址是 32 位的,大约可以提供 42 亿个地址,但是早在 2011 年 IPv4 地址就已经被分配完了。

但是 IPv6 的地址是 128 位的,每16位为一组,这可分配的地址数量是大的惊人,有个段子说 IPv6 可以保证地球上的每粒沙子都能被分配到一个 IP 地址。

2.3.1 优点

  • 可自动配置,即使没有 DHCP 服务器也可以实现自动分配IP地址
  • IPv6 包头包首部长度采用固定的值 40 字节,去掉了包头校验和,简化了首部结构,减轻了路由器负荷,大大提高了传输的性能
  • IPv6 有应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能,大大提升了安全性

2.3.2 头部

IPv6 相比 IPv4 的首部改进:

  • 取消了首部校验和字段。 因为在数据链路层和传输层都会校验,因此 IPv6 直接取消了 IP 的校验。
  • 取消了分片/重新组装相关字段。 分片与重组是耗时的过程,IPv6 不允许在中间路由器进行分片与重组,这种操作只能在源与目标主机,这将大大提高了路由器转发的速度。
  • 取消选项字段。 选项字段不再是标准 IP 首部的一部分了,但它并没有消失,而是可能出现在 IPv6 首部中的「下一个首部」指出的位置上。删除该选项字段使的 IPv6 的首部成为固定长度的 40 字节。

3. 用到IP的相关技术

DNS和ARP在这里有讲,他们也是用到IP的。

3.1 DHCP

用于动态获取IP地址的协议,全程使用UDP广播通信

详情待补。

3.2 NAT

网络地址转换 NAT,用于缓解IPv4地址耗尽的问题

简单的来说 NAT 就是同个公司、家庭、教室内的主机对外部通信时,把私有 IP 地址转换成公有 IP 地址。

那不是有N个私有 IP 地址,就要有N个公有 IP 地址?这怎么就缓解了 IPv4 地址耗尽的问题?

确实是,普通的 NAT 转换没什么意义。

由于绝大多数的网络应用都是使用传输层协议 TCP 或 UDP 来传输数据的,因此,可以把 IP 地址 + 端口号一起进行转换。这样,就用一个全球 IP 地址就可以了,这种转换技术就叫网络地址与端口转换 NAPT

图中有两个客户端 192.168.1.10 和 192.168.1.11 同时与服务器 183.232.231.172 进行通信,并且这两个客户端的本地端口都是 1025。

此时,两个私有 IP 地址都转换 IP 地址为公有地址 120.229.175.121,但是以不同的端口号作为区分。

于是,生成一个 NAPT 路由器的转换表,就可以正确地转换地址跟端口的组合,令客户端 A、B 能同时与服务器之间进行通信。

不过有了IPv6,一般就不用那么多花里胡哨的地址转换了。

3.3 ICMP

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

网络包在复杂的网络传输环境里,常常会遇到各种问题。当遇到问题的时候,需要传出消息,报告遇到了什么问题,这样才可以调整传输策略,以此来控制整个局面。

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

ICMP报文封装在IP包内:

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

  • 用于诊断的查询消息,也就是「查询报文类型」
  • 通知出错原因的错误消息,也就是「差错报文类型」

因此,如果正常返回了ICMP回送响应,则代表发送端主机到接收端主机可达

3.4 IGMP

在前面我们知道了组播地址,也就是 D 类地址,既然是组播,那就说明是只有一组的主机能收到数据包,不在一组的主机不能收到数组包,怎么管理是否是在一组呢?那么,就需要 IGMP 协议了。

组播地址一般是用于udp协议,机器发送UDP组播数据时,目标地址填的是组播地址,那么在组播组内的机器都能收到数据包。

IGMP 是因特网组管理协议,工作在主机(组播成员)和最后一跳路由之间

IGMP 报文向路由器申请加入和退出组播组,默认情况下路由器是不会转发组播包到连接中的主机,除非主机通过 IGMP 加入到组播组,主机申请加入到组播组时,路由器就会记录 IGMP 路由器表,路由器后续就会转发组播包到对应的主机了。

4. ping

ping是一个应用层命令,核心原理是上面的网络层的ICMP报文。

ping数据是从网络层开始传输的(MAC头+IP头+ICMP头+ping数据),而TCP数据是从传输层开始的(MAC头+IP头+TCP头+TCP数据),注意区分。

ping 命令执行的时候,源主机首先会构建一个 ICMP 请求消息数据包

该数据包内包含多个字段,其中最重要的是这三个:

  • 类型,对于回送请求消息而言该字段为 8
  • 序号,主要用于区分连续 ping 的时候发出的多个数据包
  • 发送时间,用于计算往返时间RTT

然后,由 ICMP 协议将这个数据包连同地址 192.168.1.2 一起交给 IP 层。IP 层将以 192.168.1.2 作为目的地址,本机 IP 地址作为源地址,协议字段设置为 1 表示是 ICMP 协议,再加上一些其他控制信息,构建一个 IP 数据包。

接下来。如果ARP缓存中没保存则通过ARP协议查询出MAC地址,由数据链路层构建成一个数据帧,源地址是本机的MAC地址,目的地址是IP层传过来的MAC地址。

主机 B 收到这个数据帧后,先检查它的目的 MAC 地址,并和本机的 MAC 地址对比,如符合,则接收,否则就丢弃。

接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层。同样,IP 层检查后,将有用的信息提取后交给 ICMP 协议。

主机 B 会构建一个 ICMP 回送响应消息数据包,回送响应数据包的类型字段为 0(发送时为8),序号为接收到的请求数据包中的序号,然后再发送出去给主机 A。

image.png

在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则说明目标主机不可达;如果接收到了 ICMP 回送响应消息,则说明目标主机可达。

此时,源主机会检查,用当前时刻减去该数据包最初从源主机上发出的时刻,就是 ICMP 数据包的时间延迟。

断网了,还能ping通127.0.0.1吗?

可以。

我们知道,有网络的情况下,数据最终是通过网卡发送出去的,那么断网的情况下,网卡已经不工作了,为什么还能ping通呢?

从应用层到传输层再到网络层。这段路径跟ping外网的时候是几乎是一样的。到了网络层,系统会根据目的IP,在路由表中获取对应的路由信息,而这其中就包含选择哪个网卡把消息发出。

当发现目标IP是外网IP时,会从"真网卡"发出。

当发现目标IP是回环地址时,就会选择本地网卡。

本地网卡,其实就是个"假网卡",它不像"真网卡"那样有个ring buffer什么的,"假网卡"会把数据推到一个叫链表中。这个链表是所有网卡共享的,上面挂着发给本机的各种消息。消息被发送到这个链表后,会再触发一个软中断。

专门处理软中断的内核线程在收到软中断后就会立马去链表里把消息取出,然后顺着数据链路层、网络层等层层往上传递最后给到应用程序。

ping 回环地址和通过TCP等各种协议发送数据到回环地址都是走这条路径。整条路径从发到收,都没有经过"真网卡"。之所以127.0.0.1叫本地回环地址,可以理解为,消息发出到这个地址上的话,就不会出网络,在本机打个转就又回来了。所以断网后依然能 ping 通 127.0.0.1。

5. 127.0.0.1 localhost 0.0.0.0

这三个东西好像是一样的,都能访问本地服务,那么他们的具体区别在哪呢?

localhost实际上是一个域名,只不过默认会把它解析为 127.0.0.1 ,当然这可以在 /etc/hosts 文件下进行修改。所以默认情况下,使用 localhost 跟使用 127.0.0.1 确实是没区别的。

其次就是 0.0.0.0,执行 ping 0.0.0.0 ,是会失败的,因为它在IPV4中表示的是无效的目标地址。

但它还是很有用处的,三次握手时服务器一般会 listen 一个 IP 和端口,等待客户端的连接。如果此时 listen 的是本机的 0.0.0.0 , 那么它表示本机上的所有IPV4地址。

举个例子。127.0.0.1 和 本机的ip地址(ipconfig里的那个) ,都是本机的IPV4地址,如果监听 0.0.0.0 ,那么用上面两个地址,都能访问到这个服务器。