网络层(四)

网络层

我们说过,网络层主要讲的就是ip编址路由选择算法

更准确的说,应该是网际IP协议,网际IP协议主要说明了各个主机和服务器的ip编址规则

了解IP编址前,我们需要知道IP数据报,IP数据报在网络层中传输,我们看一下IP数据报的结构

数据报格式

NdZOYD.png

(1)版本 占4位,指IP协议的版本。通信双方使用的IP协议版本必须一致。广泛使用的IP协议版本号为4(即IPv4)。关于IPv6,还处于草案阶段。

(2)首部长度 占4位,可表示的最大十进制数值是15。请注意,这个字段所表示数的单位是32位字长(1个32位字长是4字节),因此,当IP的首部长度为1111时(即十进制的15),首部长度就达到60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。首部长度限制为60字节的缺点是有时可能不够用。但这样做是希望用户尽量减少开销。最常用的首部长度就是20字节(即首部长度为0101),这时不使用任何选项。

(3)区分服务 占8位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务DS(Differentiated Services)。只有在使用区分服务时,这个字段才起作用。

(4)总长度 总长度指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为2^16-1=65535字节。
在IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元MTU(Maximum Transfer Unit)。当一个数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层的MTU值。

(5)标识(identification) 占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。

(6)标志(flag) 占3位,但只有2位有意义。

  • 标志字段中的最低位记为MF(More Fragment)。MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个。
  • 标志字段中间的一位记为DF(Don’t Fragment),意思是“不能分片”。只有当DF=0时才允许分片。

(7)片偏移 占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,除了最后一个分片,每个分片的长度一定是8字节(64位)的整数倍。

(8)生存时间 占8位,生存时间字段常用的的英文缩写是TTL(Time To Live),表明是数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源。最初的设计是以秒作为TTL的单位。每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一段时间。若数据报在路由器消耗的时间小于1秒,就把TTL值减1。当TTL值为0时,就丢弃这个数据报。后来把TTL字段的功能改为“跳数限制”(但名称不变)。路由器在转发数据报之前就把TTL值减1.若TTL值减少到零,就丢弃这个数据报,不再转发。因此,TTL的单位不再是秒,而是跳数。TTL的意义是指明数据报在网络中至多可经过多少个路由器。显然,数据报在网络上经过的路由器的最大数值是255.若把TTL的初始值设为1,就表示这个数据报只能在本局域网中传送。

(9)协议 占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。

(10)首部检验和 占16位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。不检验数据部分可减少计算的工作量。

(11)源地址 占32位。

(12)目的地址 占32位。

以上信息来自百度百科

数据报分片

当我们的链路的最大传输容量小于数据报的大小时,数据报需要分片,如何实现分片?

  1. 利用片偏移将数据报分片,片偏移以8字节为单位,表示该片(分片后的数据报)的数据是从原数据报的第几个字节开始的
  2. 利用标志表示分片是否结束,如果标志MF=1,表示该片不是最后一片,当MF=0时表示该片是最后一片
  3. 被分片的数据报其源IP地址和目的IP地址这类数据将从原数据报中一样

IPv4

讨论完数据报格式,我们来看一下IP编址,现在广泛使用的是IPv4编址,我们先了解一下IPv4编址

ipv4是32位地址,所以大约有40亿个ip地址,我们现在要考虑的就是如何分配这些地址

为了便于管理,我们更希望将一块地址分配给一个区域,这样寻址的时候会更简单

因此我们引出了子网的概念

为了确定子网,分开主机和路由器的每个接口,从而产生了几个分离的网络岛,端口端接了这些独立的网络的端点,这些独立的网络中的每个都叫做一个子网

比如说给一个子网分配223.1.1.0/24的地址,我们观察一下这个写法,223.1.1就是这个子网里的主机将会拥有的相同前缀,/24表示就是就是子网中的IP地址前24位是相同的,也被称为子网掩码

不太正确的说,子网就是一个许多"接口"具有相同的ip地址前缀的网络

在这里插入图片描述

了解了子网的概念,那我们再来考虑地址分配策略,也就是这个ip地址要怎么分配,我们常有的形式了a.b.c.d/x,这个x就是子网所有的相同前缀的位数,那么剩下的32-x个比特就是由这个组织里的成员所独有的了,结构里的成员也可以再对所分到的ip地址进行再分配形成一个组织

在CIDR被采用之前,IP地址的网络部分(子网掩码)被限制位长度位8,16,24比特,这是一种被称为为分类编址的编址方案,网络部分为8、16、24的网络分别被称为A,B,C类网络,这种编址的缺点在哪,一个C类网络最多只有256-2个地址可以分配,而一个B类网络却有65534个地址,这显然是不合理的,要不就是不够用,要不就是太多浪费了,因此,我们更倾向于一种动态的编址方法

DHCP: 动态主机配置协议

可以想到,其实一个子网并不需要那么多地址,比如说一个图书馆,它虽然能容纳2000人,但是每天最多来的也不到400人,意味着不会由2000人同时需要一个ip地址,那我们没有必要给这个图书馆分配2048个ip地址,只要512个就足够用了,这个动态主机配置协议还有另一个依据就是,现在很多人都是携带便携机到处走的,你要是只给他一个固定的ip地址,那也不太行

这就是DHCP协议要完成的工作,当有一个主机连接到子网时,给他分配一个ip地址,当他离开时,就将该ip地址回收到地址池中

当然,要完成这一工作,显然需要一个DHCP服务器,每一个子网都应该有一个DHCP服务器,如果没有,那就需要一个DHCP中继代理

简单介绍一个DHCP协议的工作原理

  • 首先,一个要连接子网的用户向网络中广播一个DHCP发现报文,广播的方法就是将目的IP地址设为255.255.255.255
  • 附近的子网的DHCP服务器收到该DHCP发现报文,就使用一个DHCP提供报文来响应用户,当然是使用广播的方式
  • 客户的收到DHCP提供报文后,可能会有多个,选择其中一个发送DHCP请求报文
  • DHCP服务器收到请求报文后,发出一个DHCP ACK报文进行相应

网络地址转换

选择我们又要考虑另一个问题了,ip地址不够用怎么办,才40亿个ip地址,全球人口都70亿了,更何况好多人又有电脑又有手机的,这时候就需要网络地址转换了。

其实网络地址转换概念也挺简单的,因为ip地址是唯一的,我们不能有两个相同的ip地址,但是这是全球性的,假如我们将范围限制在一个子网里面,只要我在子网里面,那我用这个ip地址就不会遇到外面相同的ip地址了,不要去外面就可以了,这样所有子网都可以有相同的ip地址

那我现在要跟其他地方的主机通信怎么办,真要把网络局限在子网里,那互联网也没啥意义了,显然,这时候就要用到网络地址转换了,我们都知道,一个子网与外界通信都是经过第一跳路由器转发的,那么我们就可以用这个路由器的ip地址替换掉我们子网里面发送出来的报文的源ip地址,然后在外界看来,这就是一个有路由器发送的报文,接下来只要把相应报文发送还这个路由器就可以了

以上就是网络地址转换的基本概念,利用路由器的ip地址替换掉子网中主机的ip地址

你可能会问,子网中的主机是如何得到ip地址的,而且路由器的ip地址又是如何分配到

两者都是由
DHCP服务器分配的,子网的ip地址由路由器的DHCP服务器分配

你可能还有另外一个问题,路由器是如何将收到的报文准确发送到子网中对应的主机的?

这是由路由器中的NAT转换表完成的,每当一个主机往外界发送报文时,路由器在NAT表中加一个表项,顺便生成一个新的源端口号,然后将其替换掉子网中的报文的源端口号

也就是说,NAT表可以由这个端口号得到子网中主机的ip地址和端口号,然后将其准确的转发到主机上

IPv6

说完IPv4,我们可以了解一下IPv6

首先,为什么会有IPv6的出现,我们前面说的网络地址转换是因为什么才出现的,因为ip地址不够,而且网络地址转换引起的问题就是对P2P程序不友好,P2P程序需要两个程序可以建立TCP连接,但是你这个地址被隐藏在NAT后面,我就没办法建立连接了,当然,针对这个问题,也有相应的解决方案

但是,我们为何不使用一个128位的地址呢,如果地址是128位的,那ip地址就不怕不够用了,而且IPv4支持数据报分片,这对路由器也造成了一定的负担,并且路由器也会对数据报计算校验和,这也对路由器造成了一定的负担,我们希望路由器就单纯的转发ip数据报就可以了,不要管那么多事

出与各种原因,IPv6才会出现,简单来说,IPv6就是为了改进IPv4而诞生的,但是IPv6要如何替换掉IPv4呢,这是非常困难的一件事情,总不能规定一天让全球所有互联网设备停止工作吧,所以IPv6必须是向后兼容的

既然无法替换,那只好让两者同时工作,并逐步废弃IPv4了,注意,我们不能在IPv4使能的路由器中直接传递IPv6数据报,因为两者的数据报格式有一些地方不一样,这些数据会丢失,所以一个简单的方法叫做挖隧道法,就是将整个IPv6数据报放在IPv4数据报的数据内容中,然后IPv6使能的路由器就能提取出其中的IPv6数据报,再进行IPv6数据报的传输,这样就能传输IPv6数据报了

参考:

《计算机网络自顶向下方法》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值