【计算机网络】网络层协议 -- IP协议_ip包中通过什么指明上层协议(1)

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

如果IP层要传送的数据超过1500字节,那么就需要先在IP层对该数据进行分片,然后将分片后的数据交给下次MAC帧进行发送。
在这里插入图片描述
如果发送数据时在IP层进行了分片,那么当这些分片数据到达对端主机的IP层后就需要先进行组装,然后再组装好的数据交付给上层传输层。
在这里插入图片描述

  • 数据的分片不是经常要做的,实际在网络通信过程中不分片才是常态,因为数据分片会存在一些潜在的问题,比如分片可能会增加丢包的概率。
  • 数据的分片和组装发生在IP层,不仅源端主机可能会对数据进行分片,数据在路由过程中的路由器也可能对数据进行分片。因为不同网络的MTU是不一样的,如果传输路径上的某个网络的MTU比源端网络的MTU小,那么路由器就可能对IP数据报进行再次分片。
  • 分片数据的组装只会发生在目的端的IP层
  • 在分片的数据中,每一个分片在IP层都会被添加对应的IP报头,而传输层添加的报头只会出现在第一个分片中,因此网络中传输的数据包可能没有传输层的报头

为什么不建议进行分片?

虽然传输层并不关心IP层的分片问题,但分片对于传输层也是有影响的。

  • 如果一个数据在网络传输过程中没有经过分片,那么只要接收端收到了这一个报文,我们就可以认为该数据被对方可靠地收到了。
  • 而如果一个数据在网络传输过程中进行了分片,那么只有当接收端收到了全部的分片报文并将其成功组装起来,这时我们才认为该数据被对方可靠地收到了。但如果众多的分片报文当中有一个报文出现了丢包,就会导致接收端无法将报文成功组装起来,这时接收端会将收到的分片报文全部丢弃,此时传输层TCP会因为收不到对方应答而进行超时重传。
  • 假设在网络传输时丢包的概率是万分之一,如果将数据拆分为一百分进行发送,那么此时丢包的概率就上升到了百分之一。因为只要有一个分片报文丢包了也就等同了这个报文整体丢失了,因此分片会增加传输层重传数据的概率

也就是说,只要分片报文中某一个出现了丢包,就要对整体进行重传,因此数据在发送时不建议进行分片。

如何尽可能避免分片?

实际数据分片的根本原因在于传输层一次向下交付的数据太多了,导致IP无法直接将整体数据交付给MAC帧,如果传输层控制好一层交付的数据不要太大,那么也就不会出现数据分片的情况。

  • 因此TCP作为传输控制协议,它需要控制一次向下交付的数据不超过某一阈值,这个阈值就叫做MSS(Maximum Segment Size,最大报文段长度)。
  • 通信双方在建立TCP连接时,除了需要协商自身窗口大小等概念之外,还会协商后续通信时每一个报文段所能承载的最大报文段MSS

5. 网段划分

IP地址的构成

IP地址由网络号和主机号两部分构成:

  • 网络号:保证相互连接的两个网段具有不同的标识。
  • 主机号:同一网段内,主机之间具有相同的网络号,但是主机号是不同的。

IPv4总共有32位,可以在IP地址的后面加上一个 / ,并在 / 后面加上一个数字,这就表示从头到第几位是属于网络标识。

例如,下图中路由器连接了两个网段。对于网络标识来说,同一网段内主机的网络标识是相同的,不同网段内主机的网络标识是不同的。而对于主机标识来说,同一网段内的主机标识是不同的,而不同网段的主机标识是可以相同的。

在这里插入图片描述

DHCP协议

实际手动管理IP地址是一个非常麻烦的事情,当子网中新增主机时需要给其分配一个IP地址,当子网中有主机断开网络时又要将其IP地址进行回收。

  • 因此对于IP地址的分配和回收一般不会手动进行,而是采用DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)技术。
  • DHCP通常被用于大型的局域网环境中,其主要作用就是集中地址管理、分配IP地址,使网络中的主机获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的利用率。
  • DHCP是一个基于UDP的应用层协议,一般的路由器都带有DHCP功能,因此路由器也可以看作一个DHCP服务器。

当我们连接WiFi时需要输入密码,本质就是因为路由器需要验证你的账号和密码,如果验证通过,那么路由器就会给你分配一个IP地址,然后你就可以基于这个IP地址进行上网了。

先找目标网络,再找目标主机

当IP要将数据跨网络从一台主机发送到另一台主机时,其实不是直接将数据发送到了目标主机,而是先将数据发送到目标主机所在的网络,然后再将数据发送到目标主机。

也就是说,数据在路由时的第一目的是找到目标网络,然后再在目标网络中去找到目标主机!

数据路由时之所以一开始不以寻到目标主机为目的,是因为这样做效率太低了。

  • 找主机的本质目的是排除的过程,如果一开始就以找目标主机为目的,那么在查找的过程中一次只能排除一个主机。
  • 而如果一开始先以找目标网络为目的,那么在查找过程中就能一次排除大量和目标主机不在同一网络的主机,这样就大大提高效率了。

为了提高数据路由的效率,我们对网络进行了网段划分。

网段划分

过去曾经提出过一种划分网络号和主机号的方案,把所有IP地址的种类分为五类。
在这里插入图片描述
因此,各类IP地址的取值范围如下:

  • A类:0.0.0.0到127.255.255.255
  • B类:128.0.0.0到191.255.255.255
  • C类:192.0.0.0到223.255.255.255
  • D类:224.0.0.0到239.255.255.255
  • E类:240.0.0.0到247.255.255.255

判断一个IP地址属于哪一类时,可以从高到低位遍历,看第几位出现0,从而得知其属于哪一类。

子网划分

但随着网络的飞速发展,这种划分方案的局限性也很快显现出来了。

  • 在一些学习、公司、实验室等组织中,它们大多使用的是B类地址,B类地址的主机号占16个比特位,因此理论上一个B类网络当中允许有65536台主机。
  • 但实际网络架设中,一般不会存在一个局域网中有这么多主机的情况,也就意味着大量的IP地址实际都被浪费掉了。

为了避免这种情况,于是又提出了新的划分方案,称为CIDR。

  • 在原有的五类网络的基础上继续进行子网划分,这也就意味着需要借用主机号当中的若干位来充当网络号,此时为了区分IP地址中的网络号和主机号,于是引入了子网掩码的概念。
  • 每一个子网都有自己的子网掩码,子网掩码实际就是一个32位的正整数,通常用一串 0 来结尾。
  • 将IP地址与当前网络的子网掩码进行“按位与”操作,就能够得到当前网络所在的网络号。

此时一个网络就被更细粒度地划分为一个个更小的子网,通过进行不断的子网划分,子网中IP地址对应的主机号就越来越短,因此子网当中可用IP地址的个数也就越来越少,这也就避免了IP地址被大量浪费的情况。

  • 比如在某一子网中将IP地址的前24位作为网络号,那么该网络对应的子网掩码的32个比特位中的前24位就为1,剩下的8个比特位为0,将其用点分十进制表示就是255.255.255.0。
  • 假设该子网当中有一台主机对应的IP地址是192.168.128.10,那么将这个IP地址与该网络当中的子网掩码进行按位与操作得到的就是192.168.128.0,这就是子网对应的网络号了。
  • 实际在用于子网掩码与子网当中主机的IP地址进行“按位与”操作时,本质就是保留了主机IP地址中前24个比特位的原貌,将剩下的8个比特位的值清0了而已,也就是将主机号清0了,所以按位与之后的结果就是该网络对应的网络号。

需要注意的是,子网划分并不是只能进行一次,我们可以在划分出来的子网的基础上进行子网划分。

因此一个数据在路由的时候,随着数据不断路由进入更小的子网,其网络号的位数是在不断变化的,准确来说其网络号的位数是在不断增加的,这也就意味着IP地址当中的主机号的位数在不断减少。最终当数据由到达目标主机所在网络时,就可以在该网络当中找到对应的目标主机并将数据交给该主机,此时该数据的路由也结束了。

6. 特殊的IP地址

并不是所有的IP地址都可以作为主机的IP地址,有些IP地址是具有特殊用途的。

  • 将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网。
  • 将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包。
  • 127.*的IP地址用于本地环回测试,通常是127.0.0.1。

也就是说,IP地址中主机号全为0的是当前局域网的网络号,主机号全为1的代表的是广播地址,这两个IP地址都是不能作为主机的IP地址的。因此在某个局域网中最多能存在的主机个数是2主机号位数 -2。

本地环回原理

本地环回会将数据贯穿网络协议栈,但最终不会将数发送到网络当中,相当于本地环回时不会将数据写到网卡上面。

本地环回的目的就是将数据自定向下贯穿协议栈,进行一次数据封装的过程,然后再自底向上贯穿协议栈,进行一次数据解包的过程,通常用于测试本地的网络功能是否正常。

本地环回的基本原理:

  • 当数据到大IP层需要继续向下交付时,如果是环回程序,那么IP输出函数会将数据放入到IP输入队列中,然后由IP输入函数读取上去。
  • 而IP输入函数将数据读取上去的本应该是数据链路层向上交付的数据,因此该数据后续就会被当做从网络中读取的数据来看待,各层协议会一次对该数据进行解包和分用。
  • 如果不是本地环回的话,那么接下来就会判断该数据对应的目的IP地址是否为广播多多播地址,或者目的IP地址是否与本主机的IP地址相同,如果是则也会将数据放入到IP读入队列当中,等待IP读入函数读取。

7. IP地址的数量限制

IP地址数量不足的问题

我们知道,IP地址(IPv4)是一个4字节32位的正整数,因此一共有232个IP地址,也就是将近43亿个IP地址。但TCP/IP协议规定,每个主机都需要有一个IP地址。

  • 现在全世界人品已经有70多亿了,就算有一半的人没有智能手机,算下来也有30亿台只能手机需要IP地址。
  • 随着科技的发展,我们使用的电脑、智能手表、智能冰箱、智能洗衣机等设备如果入网也是需要IP地址的。
  • 另外,IP地址并不是按照主机台数太进行配置的,因此一个主机可能需要多个IP地址,更别谈还有很多组网的路由设备也需要IP地址,以及一些特殊的IP地址不能使用的问题。

所以43亿个IP地址其实是不够用的,因此才提出来CIDR的方案对已经划分好的五类ID地址进行子网划分,其目的就是减少IP地址的浪费。

CIDR虽然在一定程度上缓解了IP地址不够用的问题,因为CIDR提高了IP地址的利用率,减少了浪费,但IP地址绝对上限并没有增加。

如何解决IP地址不足的问题?

  1. 动态分配IP地址:只给接入网络的设备分配IP地址,因此同一个MAC地址的设备,每次接入互联网时,得到的IP地址不一定是相同的,避免了IP地址强绑定于某一台设备的情况。
  2. NAT技术:能够让不同局域网当中同时存在两个相同的IP地址,NAT技术不仅能够解决IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
  3. IPv6:IPv6使用16字节128位来表示一个IP地址,能够大大缓解IP地址不足的问题。但IPv6并不是IPv4的简单升级版,它们是不相干的两种协议,彼此并不兼容,因此目前IPv6还没有普及。

8. 私网IP地址和公网IP地址

如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连接到Internet上,理论上使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址。

  • 10.*,前8位是网络号,共有16777216个地址。
  • 172.16.* 到 172.32.*,前12位是网络号,共1048576个地址。
  • 192.168.*,前16位是网络号,共65536个地址。

包含在这个范围中的,都称为私网IP,其余的为公网IP(或全局IP)。

我们连接云服务器时,使用的地址就是服务器的公网IP地址。

我们可以通过ifconfig命令查看我们这台机器的私网IP,其中网络接口lo(loop)代表的是本地环回,而eth0代表的是我们这台机器的网络接口。
在这里插入图片描述

我们为什么要给运营商交钱?

我们享受的是互联网公司为我们提供的服务,为什么要向运营商交钱呢?

  • 实际网络通信的基础设施都是运营商搭建的,我们访问服务器的数据并不是直接发送到了对应的服务器,而是需要经过运营商建设的各种基站以及各种路由器,最终数据才能到达对应的服务器。
  • 因为运营商为我们提供了通信的基础设施,所以我们交网费实际就相当于购买入网许可一样。
  • 没有运营商提供的这些基础设施,就不会诞生所有的互联网公司,因为互联网公司是运营在网络基础设施之上的。

也就是说,用户上网的数据首先必须经过运营商的相关网络设备,然后才能发送到互联网公司对应的服务器。因此所谓的网段划分、子网划分等工作实际都是运营商做的。

数据是如何发送到服务器的?

路由器是连接两个或多个网络的硬件设备,在路由器上有两种网络接口,分别是LAN口和WAN口。

路由器是连接两个或多个网络的硬件设备,在路由器上有两种网络接口,分别是LAN口和WAN口:

  • LAN口(Local Area Network):表示本地连接网络的端口,主要与家庭网络中的交换机、集线器或PC相连。
  • WAN(Wide Area Network):表示连接广域网的端口,一般指互联网。

我们将LAN口的IP地址叫做LAN口IP,也叫做子网IP,将WAN口的IP叫做WAN口IP,也叫做公网IP。
在这里插入图片描述

  • 不同路由器,子网IP其实都是一样的(通常都是192.168.1.1),子网内的主机IP地址不能重复,但是子网之间的IP地址就可以重复了。
  • 每一个家用路由器,其实又作为运营商路由器子网中的一个节点,这样运营商路由器可能会有很多级,最外层的运营商路由器的WAN口IP就是一个公网IP了。
  • 如果系统我们自己实现的服务器程序,能够在公网上被访问到,就需要把服务部署在一台具有外网IP的服务器上,这样的服务器可以在阿里云或者腾讯云购买。

由于死亡IP不能出现在公网当中,因此子网内主机在和外网进行通信时,路由器会不断将数据包IP首部中的IP地址转换成路由器的WAN口IP,这样逐级替换,最终数据包中的源IP会成为一个公网IP,这种技术被称为NAT技术(Network Address Translation,网络地址转换)。

为什么私网IP不能出现在公网当中?

  • 不同的局域网中的主机的IP地址可能是相同的,所以私网IP无法唯一标识一台主机,因此不能让私网IP出现在公网上,因为IP地址要能唯一标识公网上的一台主机。
  • 但由于IP地址不足的原因,我们不能让主机直接使用公网IP而让主机使用IP,因为私网IP可以重复也就意味着我们可以在不同的局域网中使用相同的IP,缓解的IP的不足问题。
  • 此外,我们不能直接使用公网IP还有一个原因就是,我们的数据包必须要经过经营商的路由器,如果我们发送的数据直接到了公网,那也就意味着我们再也不用交网费了,这是不现实的。

两个局域网中的主机不能不跨公网进行通信

  • 两个局域网中的主机是不能不跨公网进行通信的,因为一个主机要将数据发送给另一台主机的前提是得知另一台主机的IP地址。
  • 即便现在这个主机知道了另一台主机的IP地址,但是有可能这两台主机的IP地址是一样的,因为它们的IP地址都是私网IP地址。
  • 当这一台主机发送数据时将目的IP地址填成和自己相同的IP地址,操作系统就会认为这个数据是要发送给自己的,而不会向外进行发送了。

所以数据如果要从一个局域网发送到另一个局域网,如果不经过公网基本上是不可能的,当我们和别人聊天的时候,也不是直接将数据从一个局域网直接发送到了另一个局域网,而是先将数据通过公网发送到服务器,服务器再通过公网将数据转发到另一个局域网中。

但也存在一些技术能够使数据包在发送过程中不进行公网IP的替换,而将数据正确发送到目标主机,这种技术叫做内网穿透,也叫做NAT穿透。

9. 路由

数据“问路”的过程

数据在路由的过程中,实际就是一跳一跳“问路”的过程,所谓“一跳”就是数据链路层的一个区间,具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间。

IP数据包的传输过程中会遇到很多路由器,这些路由器会帮助数据包进行路由转发,每当数据包遇到一个路由器之后,对应路由器都会查看该数据的目的IP地址,并告知该数据下一跳应该往哪跳。

路由器的查找结果可能有以下三种:

  1. 路由器经过路由表查询后,得知该数据下一跳应该跳到哪一个子网。
  2. 路由器经过路由表查询后,发现没有匹配的子网,此时路由器会将该数据转发给默认路由。
  3. 路由器经过路由表查询后,得知该数据的目标网络就是当前所在的网络,此时路由器就会将该数据转给当前网络中对应的主机。

路由表的查询

每个路由器内部都会维护一个路由表,我们可以通过route命令查看云服务器上的路由表。
在这里插入图片描述

  • Destination:表示的是目的网络地址。
  • Gateway:表示的是下一跳地址。
  • Genmask:表示的是子网掩码。

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

da2f94.png)

  • Destination:表示的是目的网络地址。
  • Gateway:表示的是下一跳地址。
  • Genmask:表示的是子网掩码。

[外链图片转存中…(img-iNubLsvy-1715793222467)]
[外链图片转存中…(img-NQebb3Wq-1715793222467)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值