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

ip-协议

文章目录

  • 1. 网络层
  • 2. `ip`协议
    • 2.1 `ip`协议格式
    • 2.2 网段划分
      • 基本概念
      • 网段划分的两种方式
      • 为什么要网段划分?
      • 特殊的IP地址
      • IP地址数量不足
    • 2.3 私有IP与公网IP
    • 2.4 路由
  • 3. IP的分片与组装
      • 为什么要分片与组装?
      • 如何分片?
      • 如何组装?

1. 网络层

IP地址是一个32位的整数,再细致一点,它是由若干位网络号 + 主机号构成,IP = 网络号 + 主机号

一台主机发出的报文,经过多重路由,为什么就能到达指定的主机?这是因为报文中填写了目的IP地址,有了IP地址,报文就能到达目的地址

这表明IP真正的意义在于提供了一种"能力":将报文跨网络送至另一台主机的能力

所谓具有某种能力,指的是有很大概率做成某件事,但不一定百分百做成,也就是不一定"可靠",我们需要的是不仅仅具有将报文跨网络送至另一台主机的能力,还要"可靠"的送至,谁提供可靠呢?---- tcp协议

因此,tcp协议提供报文传输的策略,ip协议提供报文传输的能力、具体的执行,两者合作,我们的主机就具有将报文可靠的跨网络送至另一台主机的能力

2. ip协议

2.1 ip协议格式

在这里插入图片描述

  1. 如何将报头与有效载荷分离?

    tcp类似,ip协议的报头也有4位首部长度,每1bit位代表4字节,可表示范围[0, 60]字节;减去固定的20字节,就是选项,剩余的就是数据

  2. 如何分用?

    封装时,网络层知道上层是tcp/udp向下交付的,在8位协议字段中填入,解包时读取,就得知应该交给上层哪个协议了

其他字段:

  • 4位版本:通常是ipv4或者ipv6
  • 8位服务类型(TOS):从最小延迟、最大吞吐量、最高可靠性、最小成本中选取一个,报文传输时会根据要求选择不同的路线,一般telnet/ssh选择最小延迟,ftp选择最大吞吐量
  • 16位总长度:ip协议不仅有4位首部长度,还有自身的总长度字段
  • 8位生存时间(TTL):网络是一个相当复杂的结构,难免有时会出现漏洞,报文在传输时可以会路由循环,每当报文经过一个路由,TTL–,如果路由器收到TTL为0的报文,就直接丢弃

我们通常用源端口、目的端口、源IP、目的IP、协议号这样的五元组,来标识一个网络通信

2.2 网段划分

基本概念

IP地址是一种有用且有限的资源,不同国家、组织、地区拿到IP地址后,就需要对它进行合理的划分;因此,我们所见的IP地址都是被精心设计过的

IP地址 = 网络号 + 主机号,处在同一网络的IP主机,它们IP地址的网络号一定相同

路由器是一种设备,通常跨两个网络,也就意味着它最少有两张网卡,也就有两个IP地址

它不仅仅能对报文进行路由,还能构建子网,给每台连接到自身子网中的主机动态分配IP地址(DHCP技术)

网段划分的两种方式

第一种是将IP地址分为5类

在这里插入图片描述

不同类别的网段容纳主机数不同,A类容纳的主机数过多,导致大部分可能没有使用,被浪费了

大部分人都申请B类,随着互联网的发展,IP地址又逐渐够用了,因此,这种网段划分的方式不常用了

第二种是CIDR方案

引入子网掩码,是一个32位的整数,通常前面若干bit位全1,代表网络号,后面全0~全1代表主机号

将IP地址 & 子网掩码 = 网络号

在这里插入图片描述

为什么要网段划分?

在学校中,我们的学号也是被划分过的,比如前几位代表院号,后几位代表学号,接下来以一种简化的模型来帮助理解

在这里插入图片描述

其中,正方形代表每个院的负责人,它们之间一定处在一个群,且互相知道对方的院号

此时你走在路上,捡到一张学生证,上面的学号是0100 0011,你非常热心,想要归还这张卡给本人,无奈整个学校人太多,总不可能找人一一匹对

于是,你将学号与你们的院号进行按位与,得到0100 0000,由此你能知道,该学生一定不是你们院的,具体是哪个院的,你也不知道,你只能把学生证给你们院的负责人

负责人一定知道每个院的负责人是谁,也知道每个院的院号,根据按位与的结果,判断学生一定是计院的,于是就交给计院的负责人,计院的负责人在它们的计院群通知,于是,学生证也就物归原主了

在整个过程中,每个院就是一台路由器,学生证就是要发送的报文

如果没有对每个院进行合理的划分,我就需要找遍学校里的所有人,才能将学生证物归原主;有了划分之后,只要进行一次按位与操作,就能排除其他所有院,只剩一个院,大大提高了查找的效率

因此,网段划分的真正意义:网段划分后,未来就能提高报文查找到目标主机的效率

特殊的IP地址

  • 主机地址全为0,表示网络号,代表整个局域网
  • 主机地址全为1,表示广播地址,用于向同一局域网内的所有主机发送报文

IP地址数量不足

随着互联网的发展,目前IP地址的数量早已严重不够用了,虽然使用子网掩码的划分方案(CIDR)缓解了IP地址不足的现状,但并没有提高IP地址的数量上限,不过也出现了解决方案

  1. 动态IP地址分配(DHCP):路由器能为接入到自身构建子网的主机动态分配IP地址,也就是说不同时间段接入同一局域网的主机IP地址可能相同
  2. NAT技术
  3. ipv6

2.3 私有IP与公网IP

想要上网,得先有网,也就是得先组建网络,而组建网络离不开各种网络基础设施的建设:将光纤入户、站台建设等等,所有的这些我们貌似不需要做,我们好像只需要买台路由器就有网络了,这是因为这些工作已经有人帮我们做了

早在几十年前,我们国家政府就开始网络基础设施的建设了,也就有了三大运营商,它们帮我们做好了建好了基础设施;基础设施做好了,家家户户才能上网,各种互联网公司才有了生存的土壤

根据RFC 1918的规定,组建局域网的IP地址只能是这3种:

  1. 10.*(前8位是网络号)
  2. 172.16.* ~ 172.31.*(前12位是网络号)
  3. 192.168.*(前16位是网络号)

其余的IP地址都是公网IP地址

  • 私有IP地址不能出现在公网中
  • 不同私网(子网/局域网/内网)中,私有IP地址可以重复
  • 虽然存在公网,但我们都必须先接入到指定的私网中
  • 我们每个人都处于私网中

网络世界 = 私网 + 公网

在这里插入图片描述

每台路由器能构建子网,路由器本身通常是该子网中第一个主机,因此它有一个LAN口IP地址;同时,路由器又在其他路由器构建的子网中,在该子网中,它是一台主机,因此它也有一个WAN口IP地址

假设报文由私网上的一台主机发出,主机一定知道自身的网络号,发现目的地址不是自己处在的网络,将报文交给家用路由器,由于私有IP地址不能出现在公网中,因此会将源IP地址替换为家用路由器的WAN口IP地址

家用路由器查自身路由表,发现没有与之对应的网络号,交给运营商路由器,同时将源IP地址替换为运营商路由器的WAN口IP地址

运营商路由器处于公网中,能直接发送报文到目标主机

在这里插入图片描述

上述过程中,源IP地址的替换称为NAT转换,只在进出私网时才会做转换

直接与公网相连的路由器也称为出入口路由器

可以看到,报文都是交给运营商进行转发的,这也是为什么我们手机欠费就没网络的原因,运营商能直接将你的报文丢弃,不做NAT转换和转发

私网我们很好理解,但对于公网,上面只是简单带过,究竟什么是公网呢?下面以一种简化的模型举例

在这里插入图片描述

在上述模型中,国家之间的网络、省份之间的网络、市之间的网络、市内各种公司之间的网络就是公网

2.4 路由

在这里插入图片描述

每个工作在网络层的设备都有一张路由表,每台主机也不例外,这是云服务器上的路由表

当报文转交给路由器时,路由器会根据路由表来查询报文应该往哪走

上述例子中,一共有3个条目,从下往上看,将报文中的目的IP地址与条目中的genmask做&运算,如果与destination相同,则交给gateway地址的主机

其中flags如果有G,则表示下一跳的地址是某个路由器的地址(gateway),如果没有G,则表示目的地址与本机接口相连,直接向Iface的接口发送报文即可

如果都匹对完了,还是没有,则进行缺省路由,将报文送至上层路由器

3. IP的分片与组装

ip协议的报头字段中,我们还剩三个字段没讲,它们主要用来进行IP的分片和组装

在这里插入图片描述

为什么要分片与组装?

在这里插入图片描述

对于传输层,它将数据交给网络层,要求网络层将数据送至对方主机,网络层的确有这个能力,但数据链路层具有MTU的限制,那只好由网络层自己将报文进行分片,到达对方主机再进行组装

需要注意的是,报文被分片后,如果在传输过程中丢失了任意一个分片,则认为整个报文丢失,对方的网络层收到分片后不会将剩余的向上交付,而是等待tcp超时重传,IP再进行分片

那么问题来了,一个报文分成多片发送,丢包概率高,还是作为一个整体发送,丢包概率高?答案肯定是前者,也就是说分片后,报文的丢包概率更高;因此,IP分片不应该称为主流做法,应当避免分片

这时,网络层就对传输层说了,如果你给我交付的数据过大,我必须得进行分片,这样会导致丢包概率变大,从而你就要超时重传,对双方都是不利的;传输层听完后,细想好像确实如此,于是制定了策略,控制一个报文的大小

,该策略是什么呢?滑动窗口,在很多场景下,我们看到tcp滑动窗口内的数据都是被分成一块一块的,为什么不合并起来,一并发送呢?原因就是为了减少IP的分片

上面解释了三个问题:为什么要分片?为什么不想分片?如何做到不分片?

如何分片?

在这里插入图片描述

  • 16位标识:标识IP报文的唯一性,如果报文被分片了,则该报文的每片16位标识都相同

  • 3位标志:

    第一位保留(保留的意思是当前不用,但不代表之后不会用)

    第二位为1表示禁止分片,此时如果报文超过MTU,IP层就会直接丢弃该报文、

    第三位表示更多分片,如果报文进行了分片,则最后一片该位为0,其他片该位为1

  • 13位偏移量:

    如果每分片,为0

    如果分片了,则为当前分片的有效载荷在整个报文有效载荷中的偏移量,必须为8的倍数

IP报文的总长度可能16位的,最大可能2^16字节,此时用13位偏移量来表示后面分片的偏移量,是存不下的,因此,13位偏移量真实存的值是偏移量 >> 3,这也是为什么偏移量必须是8的倍数

如果报文长度超过MTU,IP进行分片,每个分片最多1500字节,这里拿总的报文长度为3000字节举例

在这里插入图片描述

如何组装?

  1. 如何判断收到的报文是否分片?

    假设报文时分片的,则

    在这里插入图片描述

    于是,如果 (更多分片为0 && 片偏移量为0) ----> 没有分片的报文

    更多分片为1 || 片偏移量不为0 ----> 分片报文的其中一片

  2. 如何判断分片的报文收全了?

    将报文按片偏移量升序排序,下个分片中的片偏移量 = 当前报文的片偏移量 + 有效载荷的长度,逐次检查,直到确认有更多分片为0的分片

  3. 确认收全后,将每个分片中的报头去掉,只留下一个报头,逐次组装起来,交付给上层

在这里插入图片描述


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

相关文章:

  • html + css 淘宝网实战
  • Jensen-Shannon Divergence:定义、性质与应用
  • Linux服务器centos7安装mysql
  • 论文解读——掌纹生成网络 RPG-Palm升级版PCE-Palm
  • 118.【C语言】数据结构之排序(堆排序和冒泡排序)
  • 05.HTTPS的实现原理-HTTPS的握手流程(TLS1.2)
  • OpenAI 12天发布会:AI革命的里程碑@附35页PDF文件下载
  • C语言练习-if语句
  • 【JavaEE】网络(6)
  • vulnhub靶场【shuriken】之node
  • 如何永久解决Apache Struts文件上传漏洞
  • Matrix-Breakout 2 Morpheus(找到第一个flag)
  • Linux下比ack更快的ag搜索命令详解
  • 基于QT(C++)+MySQL实现的旅行模拟器
  • Idea 添加tomcat 并发布到tomcat
  • ubuntu22.04安装PPOCRLabel
  • 踏踏实实练SQLday1-2 lead/lag使用(股票波峰波谷)
  • cesium通过经纬度获取3dtiles 得feature信息
  • Eclipse 修改项目栏字体大小
  • ADB 上传文件并使用脚本监控上传百分比
  • USB Hub 检测设备
  • Android APP 集成本地大模型 LLM
  • datax ubuntu安装
  • 华为 AI Agent:企业内部管理的智能变革引擎(11/30)
  • E-commerce .net+React(一)——项目初始化
  • Mac上Stable Diffusion的环境搭建(还算比较简单)