计算机网络自学笔记:IP数据报格式与编址

本篇文章最重要的知识点是子网的概念,同一个子网内的主机可以直接通信,不同子网的主机通信需要通过路由器转发。因此即使是接在同一个交换机上的两台主机,如果属于不同子网(IP 地址表示子网部分不同),它们也将无法直接通信。因为发送主机会根据子网地址判断接收主机和它不在同一个子网,会默认交付到它自己的网关(默认设置,网络就这么设计的),而不是将数据通过交换机直接转发给目标主机。

目前有两个版本的 IP 在使用。IPv4,IPv6。

因特网的网络层有三个主要的部分。第一个组件是 IP 部分。第二个主要组件是选路部分,它决定数据报从源到目的地所流经的路径。选路协议计算在网络中用于转发分组的转发表。最后一个部分是 ICMP,报告数据报中的差错和对某些网络层信息请求进行响应。

一: 数据报格式

1.1数据报

网络层分组被称为数据报。IPv4 数据报中的关键字段如下:

·版本号:这 4 比特规定了数据报的 IP 协议版本。通过查看版本号,路由器可确定如何解释数据报的剩余部分。

·首部长度:因为一个 IPv4 数据报可包含一些可选项,故需要用这 4 比特来确定 IP 数据报中的数据部分实际从哪里开始。

·服务类型:服务类型比特用来区分不同类型的数据报。例如,将实时数据报与非实时数据报之间的区分。

·数据报长度:IP 数据报的总长度(首部加上数据),以字节计。因为该字段长为 16 比 特,所以 IP 数据报的理论最大长度为 65 535 字节。然而,数据报长度一般都是 1500 字节(以太网帧可承载不超过 1500 字节的数据)。

·标识 ID、标志 Fragflag、片偏移 Offset:该三个字段与 IP 分片有关。

·寿命:每当数据报经过一台路由器时,寿命(Time-To-Live, TTL)字段的值减 1。若 TTL字段减为 0,则该数据报必须丢弃。

·协议:该字段在一个 IP 数据报到达其最终目的地时,字段值指明了 IP 数据报的数据部分应交给哪个传输层协议。例如,值为 6 表明数据部分要交给 TCP,而值为 17 表明数据要交给 UDP。 注意,数据报中的协议号所起的作用类似于传输层报文段中端口号字段所起的作用。

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

注意,在 IP 层只对 IP 首部进行了检验,而 TCP 校验和是对整个报文段进行的。

·源和目的 IP 地址。

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

·数据(有效载荷)。

大多数 IP 数据报不包含可选项,所以一般的 IP 数据报都有 20 字节的首部。

一个无选项字段、长度为 1500 的 IP 数据报若承载一个 TCP 报文段,则每个(无分片的)数据报共承载 40 字节首部(20 字节 IP 首部加上 20 字节 TCP 首部)以及长度为 1460 的应用层消息。

1.2:数据报分片

井不是所有的链路层协议都能承载相同长度的网络层分组。有的协议能承载大分组,而有的协议只能承载小分组。例如,以太网帧可承载不超过 1500 字节的数据,而某些广域网链路的帧可承载不超过 576 字节的数据。

一个链路层帧能承载的最大数据量叫做最大传输单元 MTU。

假设有一个互连几条链路的路由器,且每条链路运行具有不同 MTU 的链路层协议。假定你从某条链路收到一个 IP 数据报,通过检查转发表决定出链路,但该出链路的 MTU 比该 IP数据报的长度小。

如何将这个过大的 IP 数据报封装成链路层帧呢?

解决该问题的方法是将 IP 数据报中的数据分片成两个或更多个较小的数据报,用单独的链路层帧封装这些较小的 IP 数据报,然后向输出链路上发送这些帧。这些较小的数据报叫做分片。

在其到达目的地传输层以前需要被重新组装。数据报的重新组装工作在端系统中,而不是在途径的路由器中。

因此,一个具有长度较大的数据报流经具有较小 MTU 的链路时需要分片,分片的重组中在目的端系统中进行。

例子,一个 4000 字节的数据报(20 字节 IP 首部加上 3980 字节 IP 有效载荷)到达一台路由器,被转发到一条 MTU 为 1500 字节的链路上。这就意味着初始数据报中的 3980 字节数据必须被分成 3 个独立的片(每个片也是一个 IP 数据报)。假定初始数据报附加上的标识号为 777。三个片的特点如表所示。

除了最后一片外所有初始有效载荷数据的数量应当是 8 字节的倍数,并且偏移值应当被规定以 8 字节块为单位(片偏移的表示范围比数据报长度字段小了 8 倍,所以以 8 字节为单位)。

分片是有开销的。首先,它使路由器和端系统更为复杂,即必须将数据报分成适当大小的片并且需要重新组装。其次,分片可能引发致命的 DoS 攻击,例如 Jolt 攻击就是一个典型的例子,其中攻击者向目标主机发送小片的流,这些片的偏移标志都不是 0 ,当目标主机试图根据这些不正确分组重建数据报时,就可能会崩溃。

二: IP 编址

主机与物理链路之间的边界叫做接口。路由器与它的任意一条链路之间的边界也叫做接口。

因为路由器的任务是在不同的网络间转发数据报,所以一台路由器有多个接口,每个接口有一条链路。

IP 要求每台主机和路由器接口都拥有自己的 IP 地址。因此,一个 IP 地址在技术上是与一个接口相关联的,而不是与拥有该接口的主机或路由器相关联的。

每个 IP 地址长度为 32 比特(等于 4 字节),因此总共有 2^32个可能的 IP 地址。这些地址一般按点分十进制记法的方式书写,即地址中的每个字节用十进制形式书写,各字节间以句号(点)隔开。

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

一个接口的 IP 地址由其连接的子网来决定。

下图给出了一个 IP 编址与接口的例子。在该图中,一台路由器(有 3 个接口)用于互连7台主机。

图中左上侧部分的 3 台主机以及它们连接的路由器接口都有一个形如 223.1.1.x/24 的 IP 地址。这就是说,在它们的 IP 地址中,最左侧的 24 比特是相同的。用 IP 的术语来说,互连这 3 台主机的接口与路由器的一个接口的网络形成一个子网。

IP 编址为这个子网分配一个地址,其中的/24 记法有时称为子网掩码,它表明 32 比特中的最左侧 24 位特定义了子网地址。因此子网 223.1.1.1/24 是由 3 台主机接口和 1 个路由器接口(223.1.1.4)组成的。

一个子网的 IP 定义并不局限干连接多台主机到一台路由器接口的以太网段。路由器端口之间的点对点链路也可以构成子网。

对于一般由路由器和主机组成的互连系统,可以使用下列方法定义系统中的子网:

物理上相连,包括通过交换机相连或者点对点链路相连;

子网地址相同,也就是 IP 地址中表示子网的地址相同。

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

对于子网寻址 a.b.c.d/x,32 比特的 IP 地址被划分为两部分,其中 x 指示了在地址的第一部分中的比特数。地址的高位 x 比特构成了 IP 地址的网络部分,并且经常被称为该地址的前缀 (或网络前缀)。

一个单位通常被分配一块连续的地址,即具有相同前缀的一段地址。当单位外部的路由器转发一个数据报,且该数据报的目的地址在单位内部时,仅需要考虑该地址前面的 x 比特。 这大大减少了这些路由器中的转发表的长度,因为形式为 a.b.c.d/x 单一项足以将数据报转发到单位内的任何目的地。

一个地址的剩余 32-x 比特可认为是用于区分单位(子网)内部主机的,这个子网所有设备具有相同的网络前缀。

在采用 CIDR 之前,IP 地址的网络部分被限制长度为 8、16 或 24 比特,因为具有 8、16 或 24 比特子网地址的网络分别被称为 A、B 和 C 类网络,所以这种编址方案称为分类编址。

一个 C 类(/24 )子网仅能容纳多达 256-2=254 台主机(其中的主机部分全 0 地址用于表示子网,全 1 地址用于广播),这对于许多单位来说太小了。然而,一个 B 类(/16)子网可支持多达 65 534 台主机,又太大了。在分类编址方法下,导致了 B 类地址空间的迅速损耗以及所分配地址空间的低利用率。

另一种类型的地址,即广播地址 255.255.255.255。当一台主机发出一个目的地址为 255, 255 .255 .255 的数据报时,该报文会被交付给同一个子网中的所有主机。

提出问题:主机或子网最初是如何得到其 IP 地址的?

•获取一块地址

为了获取一块 IP 地址用于一个单位的子网,网络管理员首先与 ISP 联系,ISP 会从他拥有的地址块中取出一些地址给客户。ICANN 负责全球范围内的 IP 地址分配。

•获取主机地址:动态主机配置协议

一个单位一旦获得了一块地址,它就可为该单位内的主机与路由器接口分配独立的 IP 地址。 对于路由器接口地址,通常是由系统管理员手工配置的 IP。

对于主机,常使用动态主机配协议来完成 IP 地址的分配。

DHCP 使主机可以自动获取 IP 地址。DHCP 还允许一台主机获取其他信息,如它的子网掩码、第一跳路由器地址(常称为默认网关)与本地 DNS 服务器的地址。

DHCP 是一个客户机/服务器协议。

DHCP 协议是一个 4 个步骤的过程:

DHCP 服务器发现:

客户机在 UDP 分组中向端口 67 发送 DHCP 发现消息。使用广播目的地址并且使用“本 主机”地址

DHCP 服务器提供:

DHCP 服务器收到一个 DHCP 发现消息时,用一个 DHCP 提供消息对客户机做出响应, 仍然使用 IP 广播地址 255.255.255.255。子网中可能有多个 DHCP 服务器,所以该客户机可以选择其中的一个 DHCP 服务器。每个服务器提供消息中含有客户机请求的事务 ID、向客户机推荐的 IP 地址、网络掩码以及 IP 地址租用期

DHCP 请求:新到达的客户机从一个或多个服务器中选择一个,并用一个 DHCP 请求消息对选中的服务器进行响应,回显配置参数。

DHCP 确认:服务器用这个消息对 DHCP 请求消息进行响应,确认所要求的参数。 一旦客户机收到 DHCP ACK 后,交互便完成了,该客户机就能够在租用期内使用 DHCP 分配给它的IP 地址。

•网络地址转换 NAT

在 IP 地址的 A-B-C 三种主要类型里各保留了三个区域作为私有地址,虽然现在使用 CIDR 技术,但这些地址的用途没有改变,它们分别是:

10.0.0.0/24

172.16.0.0/16~172.31.0.0/16

192.168.1.0/24~192.168.255.0/24。

私有地址永远不会被当作公有地址来分配,也就是说这几块地址里面的 IP 地址不会出现在公共的外部网络中。同时外部网络中的路由器也无法处理以私有地址为目的地的数据报。

家庭网络中的编址通常就使用私有的网络地址 192.168.1.0/24。地址 192.168.1.0/24 是保留的 3 部分 IP 地址空间之一。

家用的无线路由在连接 ISP 的网络后,ISP 会分配一个公有的 IP 地址。使用私有 IP 地址的设备如果要上网,需要把私有 IP 转换为公有 IP。

家用的无线路由具有 NAT 功能。从本质上讲,NAT 使能路由器对外界隐藏了家庭网络的细节。

来自广域网的所有数据报到达 NAT 路由器时都有相同的目的 IP 地址(ISP 会分配一个公有的 IP 地址),那么路由器是怎样将一个给定数据报转发给哪个内部主机的呢? NAT 路由器使用了一张 NAT 转换表,并且在表项中包含了端口号和 IP 地址,将私有地址转换为公有地址,这个过程中利用端口号作为转换的索引。

假设一个用户坐在家庭网络主机 192.168.1.10 旁,请求 IP 地址为 128.119.40.186 的 Web 服务器(端口 80 )上的一个 Web 页面。主机 192.168.1.10 为浏览器指派了(任意)源端口号 3345 并将该数据报发送到 LAN 中。

NAT 路由器收到该数据报,为该数据报生成一个新的源端口号 5001,将源 IP 地址改为其广域网一侧接口的 IP 地址 138.76.29.7,且将源端口 3345 更换为新端口号 5001。当生成一个新的源端口号时,NAT 路由器可选择任意一个当前未在 NAT 转换表中使用的源端口号。路由器也在其 NAT 转换表中增加一表项,表现记录了端口 5001 和源地址 192.168.1.10 的对应关系。

Web 服务器并不知道刚到达的包含 HTTP 请求的数据报已被 NAT 路由器进行了改装,它会发回一个响应数据报,其目的地址是 NAT 路由器的 IP 地址,目的端口是 5001。 当该数据报到达 NAT 路由器时,路由器使用目的 IP 地址与目的端口号从 NAT 转换表中检索出家庭网络浏览器使用的正确 IP 地址 192.168.1.10 和目的端口号 3345。然后,路由器改写该数据报的目的 IP 地址与目的端口号,并向家庭网络转发该数据报。

NAT 穿越正越来越多地使用即插即用 UPnP 协议,UPnP 是一种允许主机发现并配置邻近 NAT 的协议。大部分家用路由都支持 UPnP 协议。

下一篇我们将继续学习ICMP和IPV6.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券