计算机网络第4章-IPv4

news/2025/3/14 23:40:54/

IPv4数据报格式

IPv4数据报格式如下图所示

其中,有如下的关键字段需要特别注意:

版本(号):

版本字段共4比特,规定了数据报的IP协议版本。通过查看版本号吗,路由器能确定如何解释IP数据报的剩余部分。不同的IP版本使用不同的数据报格式。

首部长度:

因为一个IPv4数据报可包含一些可变数量的选项(这些选项包括在IPv4数据报首部中。)

故需要这4比特来确定IP数据报中载荷实际开始的地方(也就是数据开始的地方,从第几个自己开

始是数据)。大多数的IP数据报中不包含选项,故一般的IP数据报具有20字节的首部。

服务类型:

服务类型(TOS)比特包含在IPv4首部中,以便使不同的IP数据报能够相互区别开来(TCP/UDP)。

数据报长度:

这是IP数据报的总长度(首部加上数据),以字节计算。该字段长为16比特,故IP数据报的最大理论长度为65535(2的16次方-1)。

然而,数据报很少有超过1500字节的。

标识、标志、片偏移:

这三个字段与IP分片有,但是IPv6不允许分片。

寿命(TTL):

该字段用来确定一个数据报在网络中存在的时间,每当一个路由器处理一次该数据报,TLL就减

一,当TTL等于0时,数据报就会被丢弃。

协议:

该字段通常仅当一个IP数据报到达目的地的时候才会有用,该字段指示了IP数据报的数据部分应当

交给哪一个运输层协议。

例如,值为96交给TCP,值为17交给UDP。

首部检验和:

首部检验和用于帮助路由器检测收到的IP数据报中的比特错误。

源和目的IP地址:

当某源生成一个数据报时,它在源IP字段中插入它的IP地址,在目的IP地址字段中插入最终目的地

的地址。

选项:

选项字段允许IP首部被扩展。

数据(有效载荷):

传输的数据。

IPv4数据报分片

数据报分片的由来

在后面,我们将会知道链路层协议承载的网路层分组的长度是不一样的,我们把一个链路层帧能承

载的最大数据量叫作最大传送单元(MTU)。

因此,我们需要对IP数据报进行合理的切片,以便数据报在任何链路层上都能被运输。

数据报切片的具体过程

现在我们假设,一个端系统接收到了很多个小的切片。

端系统该怎么将这些切片合理的分组并且拼接到一起呢?

IP数据报的标识字段,用来确定那些数据报切片是同一个原始数据报的。

发送主机发送的每一个数据报都会有一个标识,标识是依次加1的。

当某路由器需要对一个数据报切片时,形成的每一个小的数据报都具有相同的源地址和目的地址,

并且具有相同的一个标识,因此标识相同的小数据报就是一个源数据报的。

IP数据报的标志字段,用来确定某个小的数据报切片是某个源数据报切片后生成众多小小数据报的

最后一个。

例如某个数据报被分成了N片,则前面的N-1片的标志比特都是1,而最后一个片的标志比特是0,

用来表示该片是最后一片。

IP数据报的片偏移字段用来确定某个数据报切成的片中,有没有一些片丢失。

IPv4编址

主机与路由器连入网络的方法

一台主机通常只有一条链路连接到网络,当主机中的IP想发送一个数据报时,它就在该链路上发

送。

主机与物理链路之间的边界叫作:“接口”(interface)

一台路由器有多条链路,因此路由器有多个接口,路由器与它的任意一条链路之间的边界也叫作接口。

IP要求每台主机和路由器接口拥有自己的IP地址。

因此,从技术上讲,一个IP地址与一个接口相关联,而不是与包括该接口的主机或路由器相关联。

IPv4的具体编址原理

每个IP地址长度为4字节,因此共有2的三十二次方个可能的ip地址(40亿个)。

这些地址通常按所谓点分十进制记法书写。

即地址中的每个字节用它的十进制形式书写,各字节间以句点隔开。

例如:IP地址:193.32.216.9,

其中,193是该地址的第一个8比特的十进制等价数,32是该地址的第二个8比特的十进制等价数。

因此,193.32.216.9的二进制记法是:

“11000001 00100000 11011000 00001001”

在全球因特网的每台主机和路由器上的每个接口,都必须有一个全球唯一的IP地址(NAT后的接口

除外)。

而一个接口的地址的一部分,需要由其连接的子网来确定。

下面是一个IP编址与接口的例子:

在上图中,这七台主机通过一个路由器进行互联,该路由器有三个接口(223.1.1.4、223.1.2.9、

223.1.3.27)。

其中,最左边的三台主机,它们的IP地址是“223.1.1.xxx”开头的地址。

因此包括最左边的三个主机和一个223.1.1.4的路由器接口通过一个并不包含路由器的网络互联起

来。

在此情况下,该网络可能是由一个以太网LAN互联或者一个无线接入点互联

用IP的术语来说,互联这三个主机接口和一个路由器接口的网络形成一个子网(subnet)。(在某

些地方,子网也被称为IP网络或直接称为网络。)

IP编址为这个子网分配一个地址223.1.1.0./24。

其中的/24记法,有时称为:“子网掩码”(networkmask),指示32比特中的最左侧24比特定义了

子网地址。

因此子网223.1.1.0/24由三个主机接口和一个路由器接口组成,任何其他要连到223.1.1.0/24网络的

主机都要求其地址具有223.1.1.xxx的形式。

下图是另外两个子网

下面我们更为深入的讨论子网掩码:

对上图而言,我们有几个子网呢?

首先,是三个路由器和主机之间的子网(223.1.1.0/24、223.1.2.0/24、223.1.1.3.0/24)

此外,还有三个路由器和路由器之间的子网:

(223.1.7.0/24、223.1.8.0/24、223.1.9.0/24)

因此,我们有了一个更为精确地系统中的子网定义:

“分开主机和路由器的每个端口,产生几个隔离的网路岛,使用接口端连接这些隔离的网络的端

点。这些隔离的网络中的每一个都叫做一个子网”。

因特网的地址分配策略被称为无类别域间路由选择CIDR)。

CIDR将子网寻址的概念一般化了。当使用子网寻址时,32比特的IP地址被划分为两部分,并且也

具有点分十进制形式a.b.c.d/x,其中x指示了地址的第一部分中的比特数

形式为a.b.c.d/x的地址的x最高比特构成了IP地址的网络部分,并且经常被称为该地址的前缀

(prefix)(或网络前缀)。

一个组织通常被分配一块连续的地址,即具有相同前缀的一段地址。

此外,还有一种特殊类型的IP地址,即IP广播地址:255.255.255.255。

当一台主机发送一个目的地址为255.255.255.255的数据报时,该报文会交付给同一个网络中的所

有主机。

路由器也会有选择地向邻近的子网转发报文。(虽然通常不这样做。)

路由聚合、地址聚合、路由摘要

这是一个ISP将8个组织连接到因特网的例子,它也很好地说明了仔细分配CIDR 化的地址有利于路

由选择的道理。

如下图,假设该ISP (我们称之为Fly- By-Night-ISP) 向外界通告,它应该发送所有地址的前20比特

是200. 23. 16. 0/20类型的数据报。

外界的其他部分不需要知道在地址块200. 23. 16. 0/20内实际上还存在8个其他组织,其中每个组

织有自己的子网°这种使用单个网络前缀通告多个网络的能力通常称为

地址聚合(address aggregation )

也称为路由聚合(route aggregation )

或者路由摘要(routesummarization)


http://www.ppmy.cn/news/1199908.html

相关文章

VMware安装CentOS最小化开发环境导引

目录 一、概要 二、介绍 三、下载 四、安装 4.1 创建虚拟机 4.2 安装CentOS 五、配置网卡 六、配置本地安装源 七、安装软件 7.1 gcc/g 7.2 C的atomic库 7.3 java 7.4 Cmake 7.5 MariaDB客户端(兼容mysql) 八、用户配置文件.bash_profile…

监控易:支持多种协议和设备,适应复杂多变的IT环境

在当今的数字化时代,IT环境越来越复杂多变,各种设备、系统、应用程序需要实时地进行监控和管理,以保证业务的正常运行和高效性能。然而,传统的监控方案往往无法满足这些需求,因为它们通常只支持有限的协议和设备类型&a…

AtCoder Beginner Contest 327 G. Many Good Tuple Problems(带标号二分图计数+有区别小球放入有区别盒子)

题目 一个长为n(n<30)的原始序列x&#xff0c;x[i]可以取值0或1 一个长为m(m<1e9)的点对序列(s,t)&#xff0c; s序列第i项和t的第i项&#xff0c;均可以取值[1,n]&#xff0c; 如果构造好s和t后&#xff0c;对任意都存在01序列x使得&#xff0c; 则称这个序列是合法…

【Linux】:Linux项目自动化构建工具——make/Makefile || Linux第一个小程序——进度条(简单版本)

在本章开始给大家分享一个图片 希望对你有帮助 在这里插入图片描述 &#x1f3c6;前言 在开始本章之前 我们需要回顾一下上节课的函数的动静态库的优缺点 动态库的优点&#xff1a; 比较节省资源&#xff08;这里说的资源不仅仅是磁盘资源 也包括网络资源 内存资源等等&#…

Redis之Java操作连接操作Redis

前言 Java是一种强大的编程语言&#xff0c;而Redis是一个快速且具有高可扩展性的开源键值数据存储系统。使用Java操作Redis可以提高效率和性能&#xff0c;并且能够满足大规模数据存储和处理的需求。在本篇文章中&#xff0c;我们将介绍如何使用Java连接Redis&#xff0c;以及…

每日一题 318. 最大单词长度乘积(中等)

暴力求解没超时&#xff0c;那就这样吧 class Solution:def maxProduct(self, words: List[str]) -> int:ans 0for i in range(len(words)):for j in range(i 1, len(words)):if len(words[i]) * len(words[j]) < ans:continuet 0for k in range(26):ch chr(k ord(…

css-inpu边框

效果图&#xff1a; input {width: 225px;height: 25px;background-color: #1469bd00;border: #aca9a97d solid 1px;color: white;font-size: 15pt;box-sizing: conte-box; }input:focus {border-style: solid;border-color: #03a9f4;box-shadow: 0 0 15px #03a9f4;outline: …

微服务注册中心之安装+实例搭建zookeeper

1.下载安装包并上传到Linux服务器 Apache ZooKeeper 可以使用wget或者curl命令 wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz连接失败也可以本地下载之后上传到服务器 scp /本地/文件的/路径 用户名远程服务器IP或主…