Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

计算机网络层相关协议 #20

Open
xxm-sz opened this issue Jul 29, 2019 · 0 comments
Open

计算机网络层相关协议 #20

xxm-sz opened this issue Jul 29, 2019 · 0 comments

Comments

@xxm-sz
Copy link
Owner

xxm-sz commented Jul 29, 2019

在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文档资源吧。

点赞支持支持吧
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant