当前位置: 首页 > article >正文

【计算机网络_网络层】IP协议

文章目录

  • 1. IP的基本概念
    • 1.1 什么是IP协议
    • 1.2 为什么要有IP协议
  • 2. IP的协议格式
  • 3. 网段划分(重要)
    • 3.1 为什么要进行网段划分
    • 3.2 网段划分的规则
      • 3.2.1 古老的划分方案
      • 3.2.2 现代的划分方案
  • 4. 特殊的IP地址
  • 5. 解决IP地址的数量限制问题
  • 6. 私有IP和公网IP
  • 7. 路由及路由表
    • 7.1 数据的路由
    • 7.2 路由表

1. IP的基本概念

1.1 什么是IP协议

IP协议(Internet Protocol)网际互联协议,是属于网络协议栈中的网络层协议

1.2 为什么要有IP协议

在上一节中,我们了解到TCP协议,TCP是用来控制数据在网络传输中的可靠性和传输效率的,因此叫做“传输控制协议”,但是实际上TCP协议并没有发送数据的能力,真正有发送数据的能力的是传输层之下的网络层和数据链路层(IP协议和MAC帧协议)

但是有能力就代表一定能做到么?

答案是否定的,有这个能力只能够表示IP有很大概率能完成这件事情,不代表一定能完成,所以需要在传输层TCP协议控制其稳定高效的将数据跨网络从A主机传输到B主机上。

在刚开始接触网络的时候,我们就已经说了,网络分层的作用是用来解耦,每一层都有每一层需要做的事情,那么对于网络层,需要完成的任务就是**把数据从一台主机交付给另一台主机,也就是数据的路由**

img

虽然在我们日常生活中使用网络的时候,大多数的场景下是连接无线网络(WI-FI),但是实际上在网络通信中,所有的网络都是通过网线进行连接的,只是在我们使用端会进行无线信号转化。还会有一些情况用的是网线连接的,大家肯定看过水晶头

IP的数据路由方式是按照IP地址在一堆路由器中选择下一个路由器,在网络环境中跳来跳去,最终跳到了目的主机

2. IP的协议格式

img

1. 4位版本

在日常使用中经常能看到IP的版本有两种:IPv4和IPv6,这个符号就是用来标识的(IPv4和IPv6不兼容)

2. 4位首部长度

提到协议就一定要考虑如何进行解包和分用,4位首部长度就是用来确定协议报头的长度的,和TCP协议相同,这个4位首部长度的单位是4字节

3. 8位服务类型

3位优先权字段(已经弃用), 4位TOS字段,和1位保留字段(必须置为0)。 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个。 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要。

4. 16位总长度(字节数)

整个IP报文的总长度

5. 16位标识

唯一标识主机发送的报文. 如果IP报文大于数据链路层的最大传输单元,导致IP层进行分片, 那么每一个片里面的这个id都是相同的。

6. 3位标志和13位片偏移

3位标志字段: 第一位保留(保留的意思是暂未使用,备用)。第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为0, 其他是1,分片的该位为1说明该分片还不是整体报文的最后一片。

对于禁止分片标志位,如果置1表示禁止分片。该报文经过路上路由器时,若该路由器的最大MTU小于该报文的有效载荷,由于禁止分片标志位置1,路上路由器无法对其进行分片,该报文将会被丢弃。传输层将会超时重传该报文,并选择一条可以满足数据传输的路由通路。(找到较大吞吐量的路)。那么所有的路由器的最大MTU全部设置为1500字节不就好了?其实最大MTU较小的路由器更适合小容量的有效载荷通过,速度较快。

13位分片偏移(framegament offffset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了)。

7. 8位生存时间(TTL)

报文在网络中“跳来跳去”的话,有可能会出现找不到对应的目的IP的情况,在这种情况下就需要记录一条报文的生存时间(跳数),当跳数累计到一定程度的时候,就认为这个报文无效,然后途中路由器就不会再路由这条报文,直接丢弃

8. 8位协议

我们知道网络层的上层协议是传输层,有UDP和TCP协议,为了区分上层协议是什么,使用8位协议号来标识

9. 16位首部检验和

校验不通过,直接将报文丢弃,TCP有超时重传机制会补发给IP。

10. 32位源IP地址

表示一条报文的最初的发送地址

11. 32位目的IP地址

表示一条报文的目的地址

3. 网段划分(重要)

IP地址 = 网络号 + 主机号

网络号:保证相互连接的两个网段具有不同的标识; (就好像学校里不同的学院有不同的编号)

主机号:在同一网段内,会存在多个不同的主机,通过主机号来标识同一网段的不同主机

3.1 为什么要进行网段划分

互联网中存在非常庞大数量的主机,其中一台主机想要将数据发送到另外一台指定主机,用于查找的消耗非常大,为了方便快速的定位到一台主机,所以将子网进行了划分,然后每次在查找主机的时候按照网段进行划分即可

img

  • 不同网段之间的数据传输依靠路由器,所以如果想要把数据在网络中传输,路由器这种设备应该隶属于两个网段,路由器也是一台主机,它在多个网段都有一个当前网段的IP地址。通常情况下,路由器的子网IP地址是网段标识.1(LAN口),同时路由器也有WAN口表示上层子网的标识
  • 手动管理子网的IP太复杂了,所以一般来说,在一个子网内路由器充当IP的管理者
  • 有一种技术叫做DHCP,能够自动给加入当前子网的设备分配一个不同于当前子网段主机号的IP,一般路由器都带有DHCP功能,所以路由器也可以看作是DHCP服务器

3.2 网段划分的规则

3.2.1 古老的划分方案

把IP地址分为5类

img

  • 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

这种划分方案其实非常的不合理,很少有子网能够使用A类地址,一个子网内很少出现224 个主机,但是B类地址的设计分类就很适合使用,所以大家都想使用B类地址,导致IP地址不够用,所以提出了第二种划分方案

3.2.2 现代的划分方案

提出的新方案叫做CIDR(Classless Interdomain Routing),引入一个**子网掩码(subnet mask)**来区分网络号和主机号

子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾;

将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;

网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;

img

4. 特殊的IP地址

  • 在一个网段内,如果主机号为0,所对应的就是这个网段IP的网络号

  • 在一个网段内,如果主机号对应的每个二进制位都是1,所对应的就是这个网段的广播地址,用于给同一个链路中相互连接的所有主机发送数据包;

  • 127.*表示的IP地址用于本机环回(loop back)测试,通常是127.0.0.1

5. 解决IP地址的数量限制问题

我们知道,一个IP地址的大小是4个字节,也就死活32个位,最终的IP地址个数最多也就42亿左右,这其中还存在一部分特殊IP地址,所以最终能够用在网络间通信的IP地址就更少了。但是TCP/IP协议规定,每一个参与网络通信的主机都应该有一个IP地址

使用CIDR技术只能够提高IP的利用率,没有办法增加IP地址个数,所以IP地址不够用的问题还是没有解决,但是现在有一些技术能够解决这个问题

  • 动态分配IP地址:只给接入网络的设备分配IP地址,所以每次入网的时候,同一个MAC地址的设备的IP地址不一样
  • NAT技术(后面再详细介绍)
  • IPv6协议:和IPv4是两个协议,并不兼容,采用128位表示一个IP地址,但是目前IPV6还没有普及

6. 私有IP和公网IP

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

1、10.*,前8位是网络号,共16,777,216个地址 (企业级路由器使用)
2、172.16.*到172.31.*,前12位是网络号,共1,048,576个地址 (企业级路由器使用)
3、192.168.*,前16位是网络号,共65,536个地址(家用路由器使用)

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

路由器的作用

1、数据包转发

2、DHCP功能、组建子网(如配置无线网络。注:局域网是内网IP)

3、NAT功能

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

在这里插入图片描述

(这里借用一下大佬dragon的图)

我们只带路由器是连接两个或多个网络的硬件设备,在路由器上有两种网络接口,分别是LAN口和WAN口(上文中提到过):

其中LAN口(Local Area Network)表示连接本地网络的端口,主要与家庭网络中的交换机、集线器或PC相连。WAN口(Wide Area Network)表示连接广域网的端口,一般指互联网。我们将LAN口的IP地址叫做LAN口IP,也叫做子网IP,将WAN口的IP地址叫做WAN口IPO,也叫做外网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的替换,而将数据正确送到目标主机,这种技术叫做内网穿透,也叫做NAT穿透。

7. 路由及路由表

7.1 数据的路由

数据路由的过程:

img

路由的过程, 就是这样一跳一跳(Hop by Hop) “问路” 的过程。

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

IP数据包的传输过程也和问路一样:

  1. 当IP数据包, 到达路由器时, 路由器会先查看目的IP;
  2. 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器。依次反复, 一直到达目标IP地址;(一台主机如果找不到可用的网关,就把数据包发给默认指定的网关,由这个网关来处理数据包。现在主机使用的网关,一般指的是默认网关)
  3. 通过路由表来判定这个数据包应该发送到哪里

7.2 路由表

在Linux下可以使用route指令来查看Linux机器的路由表

image-20240319171932866

  • Destination:目标网络
  • Gateway:下一跳(网关)
  • Genmask:子网掩码
  • Flags:使用状态(U/UG/UGH)
  • Iface:物理接口

若此时有一个目的IP10.0.4.0
1、遍历路由表
2、目的IP & 路由表配置的子网掩码,确定该数据包要去的目标网络
3、将&出来的结果和目标网络(Destination)进行比较
4、在路由器中找到这个目标网络,这个目标网络就是下一跳的目的地。
此时有另一个目的IP202.10.1.2
1、重复上述步骤发现路由表中并没有目标网络
2、那么路由器下一跳的目的地就是该路由器配置的默认网关
3、通过Iface接口发送报文

注:数据报位于不同的路由器中的网络号是不一样的。子网掩码越来越长,说明数据报去往的目标网络越来越具体。


http://www.kler.cn/a/274514.html

相关文章:

  • Spark-Streaming容错语义
  • Unity 3D饼状图效果
  • golang自定义MarshalJSON、UnmarshalJSON 原理和技巧
  • Linux之磁盘管理相关命令
  • 前端和后端解决跨域问题的方法
  • 3D Gaussian Splatting for Real-Time Radiance Field Rendering-简洁版
  • 卸载.Net SDK
  • ClickHouse列式存储基础笔记
  • BUUCTF-Misc10
  • 搭建基于 Snowflake 的 CI/CD 最佳实践!
  • 【Linux】进程排队的理解进程状态的表述僵尸进程和孤儿进程的理解
  • 六种GPU虚拟化:除了直通、全虚拟化 (vGPU)还有谁?
  • Spark 3.5.0 特性速览
  • 安装tensorflow2.4
  • 【Greenhills】MULTI IDE-GHS最新版本Compiler 23.5.4的兼容性问题
  • 英伟达GTC2024大会开幕,发布机器人003计划,引领具身智能新时代
  • JAVA基础—多线程基础
  • 统计咨询|久菜盒子工作室可实现需求
  • 耳机壳UV树脂制作私模定制耳塞需要什么样的设备和技术?
  • HCIA——30奈奎斯特定理、香农定理
  • springboot日志配置文件log4j2.xml
  • Laravel框架项目首页内容修改
  • 如何从零开始拆解uni-app开发的vue项目(一)
  • 数据库只追求性能是不够的!
  • 3D模型优化服务+三维可视化+数字孪生+元宇宙=眸瑞科技
  • 使用甘特图实现高效时间规划