> 作者:დ旧言~
> 座右铭:松树千年终是朽,槿花一日自为荣。

> 目标:了解在网络层下的IP协议。

> 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安!

> 专栏选自:网络

> 望小伙伴们点赞👍收藏✨加关注哟💕💕

​​

 一、前言

前面我们已经学习了网络的基础知识,对网络的基本框架已有认识,算是初步认识到网络了,如果上期我们的学习网络是步入基础知识,那么这次学习的板块就是基础知识的实践,我们今天的板块是学习网络重要之一,学习完这个板块对虚幻的网络就不再迷茫!!!

 二主体

学习【网络】网络层——IP协议咱们按照下面的图解:

2.1 TCP和IP的关系

联系:

  • TCP提供了数据包跨网络发送的策略,比如超时重传,确认应答,流量控制,拥塞控制,滑动窗口,捎带应答,延时应答等等,这些都是数据包在网络发送时,如果出现了不可靠的问题,数据包应该怎么处理?这些都是由TCP来控制。
  • IP层提供了数据包跨网络发送的能力,比如IP层会通过报头中的目的IP来查路由表,确定数据包的下一跳位置,IP层只负责将数据包交付到下一跳,至于传输过程中出现了什么问题,这是TCP层提供策略来进行解决的,IP层不关心,也不会做什么。

总结:

TCP提供数据跨网络传输的策略,而IP提供数据跨网络传输的能力,两者合在一起就一定能够保证数据包可靠的跨网络从主机A发送到主机B,这也就是为什么很多人叫TCP/IP协议的原因,因为这两个协议可以可靠的保证数据包跨网络送到目标主机,而这正就是网络通信的本质。

2.2 IP协议报文

图解:

解析:

  • 4 位版本号(version):指定 IP 协议的版本,对于 IPv4 来说,就是 4。
  • 4 位首部长度(header length):表示IP报头的长度,以4字节为单位。
  • 8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要; 对于ftp这样的程序,最大吞吐量比较重要。
  • 16位总长度(total length): IP报文(IP报头+有效载荷) 的总长度,用于将各个IP报文进行分离。
  • 16位标识(id):唯一的标识主机发送的报文。如果 IP 报文在数据链路层被分片了,那么每一个片里面的这个 id 都是相同的。
  • 3位标志字段:第一位保留,表示暂时没有规定该字段的意义。第二位表示禁止分片,表示如果报文长度超过MTU,IP模块就会丢弃该报文。第三位表示“更多分片”,如果报文没有进行分片,则该字段设置为0,如果报文进行了分片,则除了最后一个分片报文设置为0以外,其余分片报文均设置为1。
  • 13位片偏移(framegament offset):分片相对于原始数据开始处的偏移,表示当前分片在原数据中的偏移位置,实际偏移的字节数是这个值× 8得到的。因此除了最后一个报文之外,其他报文的长度必须是8的整数倍,否则报文就不连续了。
  • 8位生存时间(Time To Live, TTL):数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL -= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环。
  • 8位协议:表示上层协议的类型。
  • 16位头部校验和:使用CRC进行校验,来鉴别数据报首部是否损坏,但不检验数据部分。
  • 32位源IP地址和32位目的IP地址:表示发送端和接收端所对应的IP地址。
  • 选项字段:不定长,最多40字节。

IP报头在内核当中本质上就是一个位段类型,给数据封装IP报头时,实际上就是用该位段类型定义一个变量,然后填充IP报头当中的各个属性字段,最后将这个IP报头拷贝到数据的首部,至此便完成了IP报头的封装。

IP协议如何将报头和有效载荷分离:

IP 报文是由固定的 20 字节的报头、选项字段和数据组成的。当收到一个 IP 报文时,先读取 IP 报文的前 20 个字节,再根据 4 位首部长度来判断该报文是否有选项字段。如果有,则继续读取选项字段。读取完选项字段,这样就完成解包,即报头与有效载荷分离。

IP协议如何将有效载荷交付给上一层哪一个协议:

在IP报头当中有一个字段叫做8位协议,该字段表示的就是上层协议的类型,IP就是根据该字段判定应该将分离出来的有效载荷交付给上层的哪一个协议的,该字段是发送方的IP层从上层传输层获取到数据后填充的,比如是上层TCP交给IP层的数据,那么该数据在封装IP报头时的8位协议填充的就是TCP对应的编号。

32位源IP地址和32位目的IP地址:

  • 数据在网络传输过程中会遇到一个一个的路由器,这些路由器会帮助网络当中的数据进行路由转发,使得网络当中的数据慢慢趋近于目标主机,路由器在帮助数据进行路由转发时,会提取出该数据的IP报头当中的目的IP地址,并以此作为数据路由转发的重要依据。
  • 当接收方收到了发送端发送过来的数据是,接收方可能也想要给发送方发送数据,因此发送端在发送数据时,除了需要知名该数据的目的IP地址,还需要指明该数据的源IP地址,也就是发送端的IP地址,即使接收端收到数据后没有数据项要发送给发送端,但至少接收端需要向发送端发送一个响应报文,表明发送端发送的数据已经被接收端可靠的收到了,因此发送出去的数据除了需要指明该数据的目的IP地址,还需要指明该数据的源IP地址。
  • 这里我们需要注意的是,发送数据时我们不需要指明发送方的源IP地址和源端口号,因为传输层和网络层都是在操作系统内核当中实现的,数据在进行封装时,系统会自行填充上对应的源IP地址和源端口号。

2.3 IP地址的划分

2.3.1 旧版IP地址的划分

划分:

IP地址是由两部分组成的:目标网络+目标主机

任何主机都是在一个子网里面的,子网里面有多台主机。我们要跨网络发送给这个主机,我们就要先将消息发到该主机处于的子网,子网再将这个消息转发给主机。

为什么要进行网段划分:

其实就是为了方便互联网能够快速定位一台主机,因为每次确认主机时,排查的效率高,一次能够排除多个子网,这也是为什么IP要分为目标网络和目标主机的原因。

分类划分:

A 类地址:

  • 范围:1.0.0.0 到 126.0.0.0
  • 网络号:第一个字节(8位)用于网络标识,剩下的 24 位用于主机。
  • 最大主机数:约 16,777,214(2^24 - 2,减去两个保留地址:全0和全1)。
  • 适用场景:A 类地址通常分配给大型组织或互联网服务提供商,因为它们允许大量主机。

B 类地址:

  • 范围:128.0.0.0 到 191.255.0.0
  • 网络号:前两个字节(16位)用于网络标识,剩下的 16 位用于主机。
  • 最大主机数:约 65,534(2^16 - 2)。
  • 适用场景:B 类地址通常分配给中等规模的组织或网络。

C 类地址:

  • 范围:192.0.0.0 到 223.255.255.0
  • 网络号:前三个字节(24位)用于网络标识,剩下的 8 位用于主机。
  • 最大主机数:约 254(2^8 - 2)。
  • 适用场景:C 类地址通常分配给小型组织或私人网络。

D 类地址:

  • 范围:224.0.0.0 到 239.255.255.255
  • 特点:D 类地址用于多播(Multicast),不分配给单独的主机或网络。
  • 适用场景:用于一次向多个目标发送数据包,例如视频流或音频流。

E 类地址:

  • 范围:240.0.0.0 到 255.255.255.255
  • 特点:E 类地址是实验性地址,不常用,保留用于特定用途。
  • 适用场景:用于实验、研究或未来网络发展。

2.3.2 新版IP地址的划分

CIDR 它允许将IP地址按需分配给网络,而不受固定类别的限制。CIDR 地址由两部分组成:网络前缀和子网掩码:

  1. 网络前缀标识了网络的唯一标识符。
  2. 子网掩码指示了网络地址中哪部分是网络前缀,哪部分是主机地址。

CIDR中的关键概念包括:

  • 前缀表示法:CIDR使用前缀表示法来表示IP地址范围。这个前缀表示法包括IP地址,后面跟着一个斜线和一个数字,表示子网掩码的长度。例如,192.168.1.0/24表示一个具有24位子网掩码的子网,它包括192.168.1.0到192.168.1.255的所有IP地址。
  • 聚合:CIDR允许多个连续的IP地址范围被聚合成一个更大的范围。这有助于减小路由表的大小,提高路由效率。
  • 无类别路由:CIDR不再依赖于A、B、C类地址的划分,而是根据需要分配地址范围,这样可以更好地满足不同组织的需求。
  • 节省地址空间:CIDR允许更灵活地分配IP地址,减少了地址空间的浪费,因为每个组织只分配所需的地址范围。

IP地址本身就具有特殊用途:

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

2.4 私有IP和公网IP


2.4.1 IP地址不足

不足:

  • 给全世界的入网设备各分配一个ip地址的话,是不够的。
  • ip地址也不是按照入网主机来分的,而是按照入网主机上面的网卡来分的,每个网卡都至少要有一个ip地址,一般情况下一张网卡都只配有一个ip地址,但如果你想给网卡配置多个ip地址这也是可以的,比如你想让这块网卡与多个子网(网段)进行通信。
  • 市面现在主流的笔记本计算机,都会配有两张网卡集成在主板上,一张是有线网卡,一张是无线网卡,所以如果真要是给每个入网设备都分配一个全球唯一的ip地址,那绝对是远远不够的!

2.4.2 私有IP

概念:

  • 私有IP地址是在互联网上不被路由的IP地址,专门为组织内部网络(如企业内部、学校等)设计。这意味着这些地址只能在局域网(LAN)内部使用,不能直接用于互联网通信。然而,通过网络地址转换(NAT),它们可以用于互联网通信。
  • 局域网是不直接连接到公网上的,所以理论上局域网使用任意的ip地址都可以,但RFC1918规定了组建局域网时只能使用的ip地址,我们将这些ip地址称为私有ip,之前我们说ip地址具有唯一性,指的是公网ip具有唯一性,内网ip是可以重复的,这正好能解决ip地址不足的问题,因为大量的局域网主机都使用的是重复的内网ip地址。

内网ip地址可划分为三类:

  1. 10.* :也是10.0.0.0 - 10.255.255.255 (10.0.0.0/8),/8表示网络部分占据了前8位,剩下的24位用于主机部分。前8位为固定网络号用法,共1677,7216个地址,后面的24个比特位,可以通过子网掩码来划分出具体的网络号位数和主机号位数(公司内网的ip该类地址比较常见)
  2. 172.16. *到172.31. *:也是172.16.0.0 - 172.31.255.255 (172.16.0.0/12)。/12表示网络部分占据了前12位,剩下的20位用于主机部分。同样的,前12位为固定网络号用法,共104,8576个地址,后面的16个比特位,可以通过子网掩码来划分出具体的网络号位数和主机号位数(公司内网和学校中,该类ip地址比较常见)
  3. 192.168. *:也是192.168.0.0 - 192.168.255.255 (192.168.0.0/16)。/16表示网络部分占据了前16位,剩下的16位用于主机部分。同样的,前16位为固定网络号用法,共65536个地址,后面的16个比特位,可以通过子网掩码来划分出具体的网络号位数和主机号位数(家庭中的ip地址一般这类比较常见)

将局域网中的ip地址设为私有IP地址范围之外的地址,会有什么后果:

  • 如果在局域网内使用了一个已经在互联网上被分配的公共IP地址,那么局域网设备将无法访问该公共IP地址对应的互联网服务。
  • 如果局域网需要通过网络地址转换(NAT)与互联网通信,使用公共IP地址范围可能会导致NAT功能出现问题。
  • 使用公共IP地址范围可能会违反互联网服务提供商(ISP)的使用条款,甚至可能触犯相关法律。

2.4.3 公网IP

公网IP(Public IP):

  • 公网IP地址是可以在全球互联网上访问的IP地址,它们是唯一的,用于标识设备或服务器在互联网上的位置。
  • 当您通过互联网与外部资源通信时,通常使用公网IP地址。
  • 公网IP地址通常由互联网服务提供商(ISP)分配给您的路由器或服务器。
  • 每个互联网连接都需要至少一个公网IP地址,以便在全球互联网上进行通信。

2.5 理解运营商在上网中的作用

作用:

运营商通常是指提供移动通信、互联网、有线电视等通信服务的公司或组织。这些公司负责搭建和维护通信基础设施,例如移动电话网络、互联网网络和有线电视网络,使人们能够进行语音通话、数据传输和观看电视节目。

一个家庭想要能够上网,都需要做哪些准备工作:

  • 首先肯定是有运营商,在你家附近有网络覆盖。
  • 你这个家庭联系运营商进行光纤入户。
  • 工作人员上门安装调制解调器(就是我们平常所说的 “猫儿”)和 无线路由器。
  • 工作人员给你开户,配置路由器账号、密码(这套账号密码是运营商认证你们的账号密码)。
  • 配置你自己的账号、密码(这套账号密码是你登录路由器连接网络所需要使用的,账号通常可直接设置为你的手机号)。这套账号密码是用来认证连接的成员的。
  • 正常上网,正常按月按年交费。

2.6 路由器

路由过程:

是指在计算机网络中,数据包从源设备发送到目标设备的过程,其中涉及到多个网络设备(如路由器和交换机)的协作工作,以确保数据包能够正确地从源地址到目标地址进行传输。路由的过程,就是这样一跳一跳(Hop by Hop) “问路” 的过程。所谓 “一跳” 就是数据链路层中的一个区间,具体在以太网中指从源 MAC 地址到目的 MAC 地址之间的帧传输区间。

IP数据包的传输过程中会遇到很多路由器,当 IP 数据包到达路由器时,路由器会先查看目的 IP。然后路由器才会决定这个数据包是能直接发送给目标主机还是需要发送给下一个路由器,如此反复,一直达到目标 IP 所在的局域。

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

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

2.6.1 路由表查询的具体过程

每个路由器内部都会维护一个路由表,我们可以通过route命令查看云服务器上对应的路由表:

  • Destination代表的是目的网络地址。
  • Gateway代表的是下一跳地址。
  • Genmask代表的是子网掩码。
  • Flags中,U标志表示此条目有效(可以禁用某些条目)G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。
  • Iface代表的是发送接口。

过程:

  • 当IP数据包到达路由器时,路由器就会用该数据的目的IP地址,依次与路由表中的子网掩码 Genmask进行“按位与”操作,然后将结果与子网掩码对应的目的网络地址Destination进行比对,如果匹配则说明该数据包下一跳就应该跳去这个子网,此时就会将该数据包通过对应的发送接口Iface发出。
  • 如果将该数据包的目的IP地址与子网掩码进行“按位与”后,没有找到匹配的目的网络地址,此时路由器就会将这个数据包发送到默认路由,也就是路由表中目标网络地址中的default。可以看到默认路由对应的Flags是UG,实际就是将该数据转给了另一台路由器,让该数据在另一台路由器继续进行路由。
  • 数据包不断经过路由器路由后,最终就能到达目标主机所在的目标网络,此时就不再根据该数据包目的IP地址当中的网络号进行路由了,而是根据目的IP地址当中的主机号进行路由,最终根据该数据包对应的主机号就能将数据发送给目标主机了。

2.6.2 路由表生成算法

路由表可以由网络管理员手动维护(静态路由),也可以通过一些算法自动生成(动态路由)。路由表相关的生成算法:距离向量算法、LS 算法、Dijkstra 算法等。

IP 协议只是依据目的 IP 地址、子网划分、路由表查找与路由算法提供了数据转发的策略,并没有实现设备转发的具体功能。具体的设备转发就是局域网内数据转发的问题,这是由下一层数据链路层来解决的。

2.7 IP协议的分片

概念剖析:

真正在路由器和之间传递的确实是IP报文,但在一个局域网内部,真正传输的是MAC帧,这也就意味着,真正在局域网内传输的是数据帧,也就是说每个局域网内都会按照数据帧的方式传输,到达局域网中的下一跳位置后,下一跳位置的网络层来决定下下一条的位置应该在哪,确定好之后,在下一个网段中继续用数据帧来传输,所以真正在网线上跑的是数据帧,而不是IP报文。

而数据链路层有MAC帧协议,常见的就是以太网协议,以太网有规定,MAC帧的有效载荷不能超过MTU(maximum transmisson unit 最大传输单元)1500字节,IP报文能够决定传输数据的大小吗?并不能,控制传输数据大小的是TCP,TCP是面向字节流的,它可以控制什么时候发送数据,发送的时候发送多少,这也就是为什么滑动窗口中有多个数据段,而不是一个数据段,因为MTU会限制单个数据包的有效载荷不能超过1500字节,所以TCP在通过滑动窗口发送数据段时,都是发送多个数据段,而不是将多个数据段合并成一个大数据段进行发送。

总结:

  • 链路层由于物理特征的缘故,无法一次转发过大的数据 。每个链路层协议有其最大传输单元(MTU),在以太网中通常为1500字节。因此,一次转发的报文大小受到MTU的限制。
  • 分片是在网络层(IP层)进行的 :当IP数据包大小超过某个链路或节点的最大传输单元(MTU)时,路由器或主机会将原始数据报进行分片,使其大小适合于网络上的传输。
  • 分片后的数据包会带有相同的源和目的地址 ,但是会有不同的标识符以及分片偏移字段,以便接收方能够将分片正确地重组成原始的数据报。

分片的缺点:

1、对UDP的影响

  • UDP没有发送缓冲区,应用层要发多少,到了网络层就是多少,这个时候就得老老实实分片。分片会增加丢包的概率,一旦某个分片报文丢了导致无法组装就会将相关的分片报文全部丢弃。(是否相关可以根据16位分片标识来判断)

2、对TCP的影响

  • 因为TCP有缓冲区的存在,想发多少、什么时候发都由TCP决定,TCP可以做到自己控制数据段的长度,然后再传到网络层,此时就无需网络层来分片了。
  • 但TCP每次可以发送的数据长度不是无限大,受制于MTU和对方主机的MSS(Max Segment Size),即最大消息长度。
  • 受制于MTU的意思是,为了不分片,TCP每次最多携带的数据是多少。不同系统的MTU可能有所不同,MTU减去TCP报头和IP报头的大小,就是TCP每次最多可以发送的数据量。
  • 受制于对方主机的MSS的意思是,对方每次最多可以接收多少。双方在发送SYN的时候会在TCP头部写入自己可以支持的MSS值,在得知对方的MSS以后,选取较小的作为最终MSS。MSS的值就是在TCP首部的40字节变长选项中(kind=2);

三、结束语 

       今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

​​ 

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐