嵌入式Linux网络编程,终于有人将网络的七层讲清楚了

新闻 前端
本文主要给大家分享网络七层概念之网络层,后续章节会跟大家讲述物理层、链路层、传输层、应用层等。

 本文主要给大家分享网络七层概念之网络层,后续章节会跟大家讲述物理层、链路层、传输层、应用层等(难得的好文,建议先收藏!)

本文主要从以下几个方面讲解网络层

网际协议 IP

IP 地址

与 IP 配套几个协议

网络地址翻译器(NAT)

地址解析协议(ARP)

反向地址转换协议(RARP)

因特网控制消息协议(ICMP)

IGMP

IP 数据报的格式

IP 数据报首部的固定部分中的各字段

IP 数据报首部的可变部分

IP 层转发分组的流程

路由表

默认路由(default route)

路由表查找

网络层是OSI参考模型中的第三层,介于运输层和数据链路层之间,它在数据链路层提供的两个相邻端点之间的数据帧的传送功能上,进一步管理网络中的数据通信,将数据设法从源端经过若直干个中间节点传送到目的端,从而向运输层提供最基本的端到端的数据传送服务。主要内容有:虚电路分组交换和数据报分组交换、路由选择算法、阻塞控制方法、X.25协议、综合业务数据网(ISDN)、异步传输模式(ATM)及网际互连原理与实现。

IP是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传。IP提供不可靠、无连接的数据报传送服务。不可靠( unreliable)的意思是它不能保证I P数据报能成功地到达目的地。I P仅提供最好的传输服务。任何要求的可靠性必须由上层来提供(如TCP)。

无连接(connectionless)这个术语的意思是I P并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。这也说明, I P数据报可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据报(先是A,然后是B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达。

1.1 网际协议 IP

IP是英文Internet Protocol(网络之间互连的协议)的缩写,中文简称为“网协”,也就是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守 IP协议就可以与因特网互连互通。

各个厂家生产的网络系统和设备,如以太网、分组交换网等,它们相互之间不能互通,不能互通的主要原因是因为它们所传送数据的基本单元(技术上称之为“帧”)的格式不同。IP协议实际上是一套由软件程序组成的协议软件,它把各种不同“帧”统一转换成(NNT流量)或者“IP数据包”格式,这种转换是因特网的一个最重要的特点,使所有各种计算机都能在因特网上实现互通,即具有“开放性”的特点。

数据包也是分组交换的一种形式,就是把所传送的数据分段打成 “包”,再传送出去。但是,与传统的“连接型”分组交换不同,它属于“无连接型”,是把打成的每个“包”(分组)都作为一个“独立的报文”传送出去,所以叫做“数据包”。这样,在开始通信之前就不需要先连接好一条电路,各个数据包不一定都通过同一条路径传输,所以叫做“无连接型”。这一特点非常重要,它大大提高了网络的坚固性和安全性。

每个数据包都有报头和报文这两个部分,报头中有目的地址等必要内容,使每个数据包不经过同样的路径都能准确地到达目的地。在目的地重新组合还原成原来发送的数据。这就要IP具有分组打包和集合组装的功能。

在实际传送过程中,数据包还要能根据所经过网络规定的分组大小来改变数据包的长度,IP数据包的最大长度可达 65535个字节。

 网络互相连接起来要使用一些中间设备

• 中间设备又称为中间系统或中继(relay)系统。

• 物理层中继系统:转发器(repeater)。

• 数据链路层中继系统:网桥或桥接器(bridge)。

• 网络层中继系统:路由器(router)

• 网桥和路由器的混合物:桥路器(brouter)。

• 网络层以上的中继系统:网关(gateway)

网络互连使用路由器:

• 当中继系统是转发器或网桥时,一般并不称之为网络互连,因为这仅仅是把一个网络扩大了,而这仍然是一个网络。

• 网关由于比较复杂,目前使用得较少。

• 互联网都是指用路由器进行互连的网络。

• 由于历史的原因,许多有关 TCP/IP 的文献将网络层使用的路由器称为网关。

 分组在互联网中的传送

嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了
嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了

1.2 P IP 地址

所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。按照TCP/IP协议规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节。例如一个采用二进制形式的IP地址是“00001010000000000000000000000001”,这么长的地址,人们处理起来也太费劲了。为了方便人们的使用,IP地址经常被写成十进制的形式,中间使用符号“.”分开不同的字节。于是,上面的IP地址可以表示为“10.0.0.1”。IP地址的这种表示法叫做“点分十进制表示法”,这显然比1和0容易记忆得多。

 IP 地址及其分类原则

IP地址是一种层次地址,通用格式为:M——类的等级号,NET——网络号,HOST——主机号。按照类的等级号,IP地址分为五类:A、B、C、D、E。如下图所示,网络号和主机号随不同等级在32位中占有的位数不同。

嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了
嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了

网络地址的最高位必须是“110”。C类IP地址中网络的标识长度为24位,主机标识的长度为8位,C类网络地址数量较多,适用于小规模的局域网络,每个网络最多只能包含254台计算机。

C类IP地址范围192.0.1.1-223.255.254.254(二进制表示为: 11000000 00000000 0000000100000001 - 11011111 11111111 11111110 11111110)。

C类IP地址的子网掩码为255.255.255.0,每个网络支持的最大主机数为256-2=254台

特殊地址

除了以上三种类型的IP地址外,还有几种特殊类型的IP地址,TCP/IP协议规定,凡IP地址中的第一个字节以“lll0”开始的地址都叫多点广播地址。因此,任何第一个字节大于223小于240的IP地址是多点广播地址;IP地址中的每一个字节都为0的地址(“0.0.0.0”)对应于当前主机;IP地址中的每一个字节都为1的IP地址(“255.255.255.255”)是当前子网的广播地址;IP地址中凡是以“llll0”的地址都留着将来作为特殊用途使用;IP地址中不能以十进制“127”作为开头,该类地址中数字127.0.0.1到127.1.1.1用于回路测试,如:127.0.0.1可以代表本机IP地址,用“http://127.0.0.1”就可以测试本机中配置的Web服务器。网络ID的第一个6位组也不能全置为“0”,全“0”表示本地网络。D类IP地址第一个字节以“1110”开始,它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。地址范围224.0.0.1-239.255.255.254 。E类IP地址以“1111”开始,保留用于将来和实验使用。

 广播地址,主机号全部是“1”的网络地址用于广播,必须知道信宿网络的网络号。

 有限广播地址,TCP/IP规定,32比特全为“1”的网间网地址用于本网广播。

“0”类地址,TCP/IP规定,各位全为“0”的网络号被解释为“本”网络。

 “回送地址,A类网络地址127是一个保留地址,用于网络软件的测试以及本地机进程间通信,叫做回送地址。无论什么程序,一旦使用回送地址发送数据,协议软件立即返回之,不进行任何网络传输。 TCP/IP协议规定:含网络号127的分组不能出现任何网络上;主机和网关不能为该地址广播任何寻径信息。

 私有网络地址(保留地址)

A类地址:10.1.1.1-10.254.254.254

B类地址: 172.16.1.1-172.31.254.254

C类地址: 192.168.1.1-192.168.254.254

 IP 地址的屏蔽码

一般地,32位的IP地址分为两部分,即网络号和主机号,分别称为IP地址的“网络部分”和“主机部分”。子网掩码用于将这两个部分区分开来。

子网掩码IP协议规定:每一个使用子网的网点都选择一个32位的位模式,若模式中的某位置1,则对应IP地址中的某位为网络地址中的一位。若位模式中某位为0,则对应IP地址中的某位为主机地址中的一位。

若将IP地址主机部分的各位均置为0,则称为网络地址(network address).另外在网络地址后面追加了表示网络地址长度的几位数字,即在IP地址的后面划一个斜杠”/”,在斜杠的后面写上表示网络地址部分位数的数字。

例子

IP地址是由“网络地址”与“主机地址”所构成的以IP地址为“192.168.10.68”,网络地址为26位为例。

二进制数 11000000.10101000.00001010.01000000 /26

嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了
嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了
嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了

 互联网中的 IP 地址

嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了
嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了

1.3 与 P IP 配套几个协议

网际协议 IP 是 TCP/IP 体系中两个最主要的协议之一。与 IP 协议配套使用的还有四个协议:

• 地址解析协议 ARP(Address Resolution Protocol)

• 逆地址解析协议 RARP(Reverse Address Resolution Protocol)

• 网际控制报文协议 ICMP(Internet Control Message Protocol)

• 网际组管理协议 IGMP(Internet Group Management Protocol)

嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了

1.3.1 网络地址翻译器( NAT )

这种技术是在局部地区网中,设定私有 IP 地址,当与 Internet 连接的时候,再将其变换成全局IP 地址。并且,如果是能够替换 TCP 或者 UDP 的端口号的网络地址端口翻译器(NAPT:Network Address Ports Translation),则使用一个全局 IP 地址就可以在多台的主机之间进行通信。

嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了
嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了

1.3.2 地址解析协议( ARP )

略。

1.3.3 反向地址转换协议( RARP )

略。

1.3.4 因特网控制消息协议( ICMP)

ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

基本简介

ICMP协议是一种面向连接的协议,用于传输出错报告控制信息。它是一个非常重要的协议,它对于网络安全具有极其重要的意义。

它是TCP/IP协议族的一个子协议,属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。

嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了

ICMP提供一致易懂的出错报告信息。发送的出错报文返回到发送原数据的设备,因为只有发送设备才是出错报文的逻辑接受者。发送设备随后可根据ICMP报文确定发生错误的类型,并确定如何才能更好地重发失败的数据报。但是ICMP唯一的功能是报告问题而不是纠正错误,纠正错误的任务由发送方完成。

我们在网络中经常会使用到ICMP协议,比如我们经常使用的用于检查网络通不通的Ping命令(Linux和Windows中均有),这个“Ping”的过程实际上就是ICMP协议工作的过程。还有其他的网络命令如跟踪路由的Tracert命令也是基于ICMP协议的。

P ICMP 协定内容

ICMP的全称是 Internet Control Message Protocol 。从技术角度来说,ICMP就是一个“错误侦测与回报机制”,其目的就是让我们能够检测网路的连线状况﹐也能确保连线的准确性﹐其功能主要有:

• 侦测远端主机是否存在。

• 建立及维护路由资料。

• 重导资料传送路径。

• 资料流量控制

嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了
嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了
嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了
嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了

类型字段为3,标识这是一个ICMP 目标不可达数据包。代码字段的值进一步说明了出错的具体原因,其取值范围为0-12。各值的含义如下表所示。

嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了

另外我们注意到ICMP 目标不可达数据包中最后一个字段,该字段包含了出错IP 数据包的lP头部和IP 数据包数据部分的头64 位。之所以要包含这个字段是为了能让IP 数据包的发送者知道是哪个数据包出错。

(3)源端关闭

路由器转发IP 数据包时是仅仅根据单个数据包的信息进行转发的,因此它无法为某个数据包预留一定的资源。由于路由器的资源(内存,计算时间等)是有限的,在网络数据流量比较大时,路由器为了转发数据包可能会耗尽其所有资源,这种情况称为阻塞。出现阻塞就是路由器能力有限,无法转发所有需要转发的数据包。这时路由器会选择丢弃一些数据包。但仅仅这样做还是无法减轻网络阻塞的情况,因为发送端在发出数据包后如果无法收到响应往往会发送更多的数据包到网络上,使得网络更加拥挤,使网络的阻塞更加严重。因此路由器在丢弃数据包时会发送一个信息到数据包的发送方,通知它网络已阻塞,请缓发数据包。用来发送这个通知的就是ICMP 源端关闭数据包。该数据包格式如下图所示。

嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了

(4)超时错误

在IP 数据包中有个TTL 字段。IP 数据包每被路由器转发一次该字段的值就至少减l。当该字段的值减少到0 时,路由器会将该数据包丢弃。但这种情况是很少发生的,因为IP 数据包都会将该字段的值设置的足够大,使得该数据包被转发到目标主机时该字段的值仍然大于0。但有时也会发生这种清况,例如几个路由器组成一个环,而且路由器中的路由表有错误,这时在其中转发的数据包可能一直在这个环中直到TTL 字段减为0。在将TTL 为0 的数据包丢弃之前,路由器需要通知数据包的源主机数据包转发超时了。由于一个IP 数据包在转发到目标主机的过程中可能被分成了多个段,而这些分段是单独路由的。因此很有可能一个IP 数据包的多个分段只有部分能到达目标主机而其他的可能丢失了。目标主机在对一个IP 数据包的多个分段进行重组时,如果等待一定的时间后剩下的分段还没有到达,目标主机就认为这些分段不会到达,并将已收到的分段丢弃。在丢弃这些分段之前,目标主机会通知源主机IP 数据包的分段在进行重组时超时了。

不管是上述两种情况的哪一种,路由器和目标主机都是通过向源主机发送一个ICMP 超时数据包来通知它的。该数据包的格式如下图所示。

嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了
嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了

请求主机可以向路由器或者直接广播该数据包,路由器会将网络的子网掩码通知给该主机。

嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了
嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了
嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了
嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了
嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了
嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了
嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了
嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了
嵌入式linux网络编程之—网络层,终于有人将网络的七层讲清楚了

 

 

责任编辑:张燕妮 来源: 今日头条
相关推荐

2019-07-07 08:18:10

MySQL索引数据库

2020-07-29 09:21:34

Docker集群部署隔离环境

2021-07-05 22:22:24

协议MQTT

2024-04-01 10:09:23

AutowiredSpring容器

2020-12-24 15:18:27

大数据数据分析

2021-04-10 10:37:04

OSITCP互联网

2023-08-14 11:35:16

流程式转化率数据指标

2024-02-23 08:08:21

2021-01-29 10:50:04

数据中台数据数据管理

2022-01-05 09:27:24

读扩散写扩散feed

2020-10-16 17:20:21

索引MySQL数据库

2019-05-22 08:43:45

指令集RISC-V开源

2022-02-23 17:03:18

人工智能深度学习机器学习

2022-02-11 09:12:13

人工智能深度学习机器学习

2024-02-27 14:27:16

2019-01-30 10:18:46

七层协议网络通信

2022-07-04 11:27:02

标签数据指标标签体系

2023-05-29 13:59:00

GPTOpenAI监督微调

2019-10-21 08:51:41

分布式事务CAPAP

2010-09-09 16:48:50

七层网络协议
点赞
收藏

51CTO技术栈公众号