欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

计算机网络层相关协议(IP 协议等) ......

最编程 2024-04-29 10:16:07
...

在TCP/IP协议族中,两大重要协议就是传输层的TCP协议和网络层的IP协议。本文主要讲网络层的IP协议以及其他相关协议。

IP协议

IP协议作为TCP/IP协议中最重要协议之一,理解和掌握IP协议相关知识点,在实际项目工作中,能起到指导性作用。

分类IP地址

分类地址即将32位IP地址划分成两个固定长度的块,每个块代表不同的含义。其中一个称为网络地址,用来标明主机所接入的网络,该网络地址在全球唯一的;另一个称为主机号,标识接入前面网络地址的主机。从这种两级的IP地址结构可以看出,IP地址在互联网上都是唯一的。常见的分类地址就是A类、B类、C类。

上图中,A类、B类、C类都是单播地址,网络号前面0、10、110值固定的,永久不会改变。其对应的网络号位数也分别是8、16、24位。网络号所占位数越多,能接入的主机就越少,毕竟IP地址固定为32位。 32位二进制的记法并不适合我们人类阅读,从引进方便人类阅读的点分十进制,也就是我们熟悉的样子:128.11.3.31。

在A类地址中,网络号占8位,第一位固定为0,那么还剩下7位。由于网络号全为0代表本地(“this”)和网络号全为1(0111 1111)代表本地软件的环回地址。所以可分配的网络号数为27-2。与网络号类似,主机号全零的IP地址表示“本机”所连接到的单个网络地址;而全1则表示该网络号上的所有主机。因此A类的主机数为224-2。

在B类地址中,网络号占16位,即两个字节,前两位固定,那么可分配的网络号数为214(因为网络号后面14位无论如何取值,都不会出现全零和全1的状况,所以不需要减2。但实际上128.0.0.0网络地址是不指派的,所以网络地址总数应该是214-1。那么主机号数共216-2。

C类地址与B类地址类似,所以网络地址总数为224-1,主机数为28-2。

D类地址常用于多播,即一对多通信。

IP数据报格式

通过IP数据报的格式可以知道IP数据报具有什么功能。

IP数据报由首部和数据两部分组成,首部固定20个字节,也就是说IP数据报最小长度20个字节。

  • 版本:长度共4位,指定IP协议的版本,例如IPv4(版本号为4)和IPv6(版本号为6),通信双方使用的IP协议版本必须一致。

  • 首部长度:长度共4位,因为首部存在可变部分,所以首部长度=固定部分(20字节)+可变部分长度。因为固定部分长度20个字节,所有首部长度最小值为5(因为首部长度字段 所表示数的单位是32位字长,即4个字节。20个字节等于数5,即0101)。当首部长度4位为最大值全为1时,即十进制的15,那么可以表示首都最大长度为60字节。当首部长度不是4个字节的整数倍时,需要用填充字段进行填充。

  • 区分服务:用来获得更好的服务,一般情况下不使用。

  • 总长度:长度为16位,单位为字节,表示整个数据报的长度,即总长度=首部长度+数据部分长度。总长度最大值为216-1=65535个字节。

  • 标识:长度共16位,IP软件在存储器维持一个计时器,每发送一个数据,计时器就增1,并将该值赋值给 标志 字段。标志字段主要为了IP数据报在需要分片时,会复制到每个数据片的标志字段,各个数据片在接收后能够正确组装成原来的数据报。

  • 标志:共3位,目前只有两位有意义。最低位记为“MF”,即MF=1表示后面还有分片,MF=0,后面没有分片。中间位记为“DF”,即DF=1不允许分片。DF=0允许分片。

  • 片偏移:共13位,单位为8字节。较长的IP数据报进行分片后,片偏移表示该分片距离原数据报起始位置的偏移量。为分片重新组装成数据报提供有力保证。

  • 生存时间:共8位,该数据报在网络的寿命,常用TTL表示。表示该数据报在网络能够转发多少次,一个路由器转发一次,该值就减1,直到为0就丢失该数据报。所以,最多可以转发255次。

  • 协议:共8位,指出该数据报携带的数据携带何种数据,以让目的主机IP层知道如何将数据部分上交给什么协议处理。例如TCP、UDP协议。常用的协议和对应协议字段的值:

  • 首部检验和:共16位,只校对首部,不校对数据。在发送端,将首部划分为许多16位字的序列,并将校验和置0,然后对所有序列进行反码算术运算求和,求和结果取反码写入到检验和中。接收端,操作与发送端类似,但不把检验和置0,如果取放码后结果为0,则保留该数据报,不为0则表示出错,丢弃该数据报。

    二进制反码算术求和:从低位到高位逐列进行运算:0+0=0;0+1=1;1+1=0,进1,如果最高进1,则在最后的结果加1即可。

  • 源地址和目的地址:各32位本地IP地址和目的主机的IP地址。

路由器分组转发算法

知道了IP数据报的格式,那么数据报是如何从发送端通过路由器到达接收端的呢?那就要了解路由表转发算法了。

  1. 路由器从数据报的的首部提取目的IP地址D,并计算出目的网络地址N.
  2. 如果N就是与此路由器直接相连的某个网络地址,则直接进行交付,不需要经过其他路由器。所谓直接交付就是将目的地址D直接转换为具体的硬件地址,把数据报封装成MAC帧,在数据链路层发送此帧。否侧就是间接交付,执行第3步。
  3. 路由器的路由表如果含有该目的地址D所指定的特定主机路由,则将数据报传输给下一跳路由。否则执行第4步。
  4. 路由表有能到达网络N的路由,则将数据报传输给下一跳路由。否则执行第5步。
  5. 若路由表有默认路由,则将数据报传输给下一跳默认路由。否则执行第6步。
  6. 报告转发分组出错。

那么在第二步中,如何将目的IP地址转换成硬件地址呢?那就涉及到ARP协议,具体看下一节。

ARP(地址解析协议)

在实际网络数据链路中传递数据帧,使用的还是硬件地址,因此需要通过ARP将IP地址解析出在数据链路层使用的硬件地址。

每台主机都设有ARP高速缓存,存有本局域网上的各主机和路由器的IP地址到硬件地址的映射表,该映射表是动态更新的。因为IP地址32位,而硬件地址是48位,经常的转换计算操作是非常的耗性能,所以通过高速缓存来存储IP地址和硬件地址的映射关系。同时由于主机经常添加和移除,所以需要动态更新映射表。映射地址项在映射表中都有生存时间,超过了生存时间就会被剔除。

那么ARP是如何通过IP地址找到对应的硬件地址呢?

如果主机H1要向主机H2发送IP数据报,那么会先在ARP高速缓存查找是否有H2主机的IP地址,如果有,就找到H2主机的硬件地址,然后把硬件地址写入到MAC帧即可,发送出去。如果在高速缓存中找不到H2主机的IP地址,那么H1主机就需要向局域网广播一个ARP请求分组,请求分组会携带有H2主机的IP地址。局域网内的所有主机都会收到该广播,并将请求分组的IP地址和自己的IP地址比较,如果一致则回复ARP响应分组,告知H1z主机,自己的硬件地址。H1主机收到H2的答复后,就会写入到高速缓存中,后续需要向H2主机发送数据就直接从映射表查找即可,有效降低通信量。

那,要是H2主机不在H1主机的局域网中怎么办?

ARP是解决同一个局域网内所有主机和路由器的IP地址与硬件地址解析问题。如果局域网内不存在H2主机,即ARP无法在本地局域网解析出H2的硬件地址,那么就查找本地局域网的一个路由器R1。路由器R1会在另一个相连局域网A通过ARP查找H2主机,如果找不到,则会在A局域网查找另外一个路由器R3,进行ARP查询。

那如果主机H2已经没有接入互联网了,或者在路由表转发分组出错时,怎么办?那么就需要ICMP(网际控制报文协议)。

ICMP(网际控制报文协议)

ICMP允许在主机或路由器报告差错情况和提供有关异常的情况报告。ICMP报文是装在IP数据报中,作为IP数据报的数据部分。如图所示:

ICMP报文的种类

ICMP报文有ICMP差错报告报文ICMP询问报文两种。

下面表格是常见几种ICMP报文类型:

差错报告报文

  • 终点不可达:当主机或路由不能交付数据报时就向源主机发送终点不可达报文。例如上文路由表转发分组第6步就是发送此报文。
  • 时间超过:在讲解IP数据报格式,讲到生存时间TTL,当数据报在路由器转发的次数(跳数)超过了源数据TTL的值,则会丢失该数据报,向源主机发送时间超过报文。或者终点在预定的时间内收不到所有的数据片的情况。
  • 参数问题:在接收端校验首部检验数据和,如果不为0,会丢失该数据报,并向源主机发送参数问题报文。
  • 改变路由:路由器把改变路由报文发给主机,让主机下次把报文发给另外的路由器(可通过更好的路由器)。

至于ICMP的数据部分,在差错报告报文,具有同一个格式,取原有的数据报数据字段的前8个字节(对TCPh和UDP协议来说,可以获取到端口号)。

下面几种情况是不再发送ICMP差错报文:

  • 对ICMP差错报文,不再发送ICMP差错报文。
  • 第一个数据片后面的所有数据片。
  • 具有多播地址的数据报
  • 具有特殊地址的数据报,如回环地址等等。

询问报文

  • 回送请求和回答:由主机或路由表向特定主机发送出的询问。收到此询问报文的主机向主机或路由表回复的回答报文。一般用来测试目的主机的是否可达和了解相关状态。
  • 时间戳请求和回答:请求主机或路由表回答当前的日期和时间。用于时间同步或时间测量。

例如我们常用的PING就是ICMP的应用实例,用来测试两台主机的连通性。

划分子网

两级IP地址到三级IP地址

在IP地址小结的介绍中,IP地址分为网络地址和主机号两级结构。两级划分IP地址会存在以下问题:

IP地址空间利用率有时很低:一个A类地址网络可以连接主机数超过1000万台,B类超过6万台。对主机数需求不大的单位又不愿申请C类,造成大量IP地址浪费。

路由表变得太大:给每一个物理网络分配一个网络地址,会导致路由器的路由表的项目数越来越多,从而导致网络性能下降。

两级IP地址不够灵活:一个单位在新的地点新建一个网络,是无法立即接入互联网的,需要向管理机构申请新的网络地址。

为此,通过将两级IP地址划分为三级地址来解决上述问题。这种做法叫做划分子网或者子网寻址或者子网路由选择

所谓划分子网就是从主机号中借若干位作为子网号,这样就行三级结构:

IP地址::={网络号:子网号:主机号}

同个子网内的所有主机,网络号也是相同,子网内的主机对外通讯需要将数据报发给路由器,再由路由器统一发送到其他网络。其他主机发送到本子网的主机也需要经过路由器。也就是说,划分子网是单位内部的事,对外还是表现为一个网络。

子网掩码

那么,当外部数据达到路由器,路由器如何转发给子网呢?从IP数据报首部是无法判断出网络是否划分子网的,所以需要子网掩码来协助。子网掩码是用来计算子网的网络地址。假如子网掩码为255.255.255.0,IP地址为145.13.3.10,将子网掩码和IP地址逐位与(AND),得到145.130.3.0就是子网网络地址。

使用子网掩码的好处是无论有没有划分子网,通过和IP地址按位与,可以快速得出网络地址,进行分组转发。如果划分子网,那么使用子网掩码就可以计算子网络地址,没有划分,方便路由器在路由表中查找下一跳。所以现在网络规定必须使用子网掩码。

构造超网

构造超网也就是无分类编址(CIDR),划分子网能在一定程度缓解IP地址不够用的问题,但是还不够,因此出现了无分类域间路由选择(CIDR)。CIDR具有以下两大特点:

消除传统分类地址和子网划分,成为无分类的两级编址,记法为:

IP地址::={网络前缀:主机}

更熟悉的记法是斜线记法

128.14.35.7/20 20表示前20位为网络地址(网络前缀),而剩下的12位为主机号。通过斜线记法也可以得出最小地址为128.14.32.0;最大地址为128.14.47.255。

IPv6

随着互联网的发展,IPv4分配的IP地址基本耗尽。新版IPv6是采用具有更大的地址空间来解决IP地址不够用的问题。 在IPv4中将数据协议单元PDU称为数据报,而在IPv6称为分组。IPv6相对IPv4具有以下特点:

  • 更大地址空间,位数为128位
  • 扩展地址层次结构
  • 灵活首部格式
  • 改进的选项
  • 允许协议继续扩充
  • 支持即插即用
  • 支持资源预分配
  • 首部改为8字节对齐,IPv4是4字节对齐

IPv6更多信息参阅GitHub文档资源吧。

点赞支持支持吧