1.
网络是我们做嵌入式 避无可避的知识点,但是网络的层次很多,很多时候我们根本理解不了其中的层次和作用,今天跟我们公司的 X 总聊到这个,给我普及了一些知识,我觉得非常有用,分享给大家。
最近事情比较忙,更新文章速度没那么快,大家有问题还是到知识星球里面去找我,不是微信不对接,是消息太多,自己的事情也多,忙不过来,望见谅,觉得文章不错的,帮忙推荐下,转发下,感谢。
文章感谢下几个读者,我在最近的项目中遇到几个问题,本来想付费咨询,发了几个红包都没有被收下,现在更加明白了做公众号对自己的帮忙真的非常大,能认识更多靠谱的朋友,不管是技术上的,还是生活上的,创业的,希望大家有问题都可以多跟我讨论,共创美好明天,哈哈。
2.
网络模型经典图片
好了,针对上面的模型,我们来举个例子说明一下
下面这个图片
两台 pc 通过交换机连上一个云服务器,我们假设都是通过网线来连接的。
1、物理层
物理层可以理解为硬件层,这个层的东西就是一个硬件的网口,phy 就是这个东西,这里的网络 pc 和交换机通过 phy连接,交换机也是通过 phy 和云连接。网络数据也是通过 phy 发送出去的。
我们所说的物理就是比较硬的东西,硬的东西那肯定是实际的硬件东西了,那物理层肯定就是硬件的鬼东西了。
2、数据链路层
这一层就涉及了一些软件的东西了,加入了全球唯一的 MAC 地址,这一层确定了 每个网络设备的 MAC 地址,正常我们 PC 发送数据的时候,可以通过 MAC 地址让对方知道自己是哪个设备,告诉别人我是谁。
物理层完成了数据的传输,还需要对0和1的定义进行规定(类似低电平为0,高电平为1),同时在传输0,1之后还需要对01进行分组如8bit为一个字节多少字节为一个包之类。这就是链接层的功能。
Ethenet 和 Wifi 基本就是属于这个层次。所以 wifi 协议其实就是解决的一个链路和物理层的问题,在更往上的网络层和传输层一般就是 TCP/IP 协议。
3、网络层
链路层说明把路打通了,可以在上面开车了,那不能随便开车啊,开车没有交通规则那就是要命的,所以就出现了网络层,出现了一些规范性的东西来规范在这条路上的车神们。
这个层次就引入了 ip 这个鬼东西了,我们设备的 MAC 地址唯一的,但是 IP 地址并不保证需要唯一,一台设备可能有几个 IP 地址。这个东西都是在这个层次决定的。
3.1 IP协议
定义网址的协议,叫做IP协议。所定义的地址也称为IP地址。
目前广泛采用的是IPv4协议,这个协议规定,网址由32个bit组成
习惯上,我们用分成四段的十进制数表示IP地址,从0.0.0.0一直到255.255.255.255。
互联网上的每个设备,都会分配到一个IP地址。这个地址分成两个部分,前一部分代表网络,后一部分代表设备。比如,IP地址172.16.254.1,这是一个32位的地址,假定它的网络部分是前24位(172.16.254),那么主机部分就是后8位(最后的那个1)。处于同一个子网络的电脑,它们IP地址的网络部分必定是相同的,也就是说172.16.254.2应该与172.16.254.1处在同一个子网络。
但是,问题在于单单从IP地址,我们无法判断网络部分。还是以172.16.254.1为例,它的网络部分,到底是前24位,还是前16位,甚至前28位,从IP地址上是看不出来的。
那么,怎样才能从IP地址,判断两台计算机是否属于同一个子网络呢?
这就要用到另一个参数"子网掩码"(subnet mask)
"子网掩码",就是表示子网络特征的一个参数。它在形式上类似IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.254.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。
有了"子网掩码"这个东西,我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行 AND 运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。
比如,已知IP地址192.168.1.1和192.168.1.5的子网掩码都是255.255.255.0,请问它们是否在同一个子网络?两者与子网掩码分别进行AND运算,结果都是192.168.1.0,因此它们在同一个子网络。
现在总结一下,IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。
4、传输层
我们用网络的东西 ,都会记得有一个 socket ,这个层次就完成了,socket 的东西。到这个层次,就可以通过 socket 来发送数据了。还包装了一些简单的协议,比如 TCP,UDP。
socket 就相当于发动机,有了发动机,就可以创造出不同的车子,汽车,卡车,电动车,当然还会有玛莎拉蒂和布拉迪威龙。
有了MAC地址和IP地址,我们已经可以在互联网上任意两个设备上建立通信了。接下来的问题是,如果一个设备有多个任务需要进行网络通信的时候,我们如何分配这些数据,让多个任务能够只使用自己对应的数据呢?
传输层的作用就是建立一条规范,使得两台设备上多个任务之间的相互通信能够正常进行,而不需要区分数据到底是来自于哪个程序而能直接接收。这个实现方式就是,我们添加了一个参数,这个参数被称为“端口”(port)。每个任务拥有自己 port,只接受对应 port 的数据,以此来区分数据。
4.1 UDP协议
包含端口号最简单的实现就是UDP协议,他的格式几乎就只是在数据前加上发送端口和接收端口而已。
4.2 TCP协议
UDP协议的优点是比较简单,容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到。
为了解决这个问题,提高网络可靠性,TCP协议就诞生了。这个协议非常复杂,但可以近似认为,它就是有确认机制的UDP协议,每发出一个数据包都要求确认。如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了。
因此,TCP协议能够确保数据不会遗失。它的缺点是过程复杂、实现困难、消耗较多的资源。
TCP数据包和UDP数据包一样,都是内嵌在IP数据包的"数据"部分。TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。
5、应用层
有了汽车,就出现了各种运输公司,什么中通,顺丰就应运而生了。所以这就是应用层了。
应用层的东西就是根据之前的层次来封装一些场景应用,比如我们正常的网址,就是 http协议。
其他还有 ftp 等等之类的,具体还是看上面那个图,看起来还是非常不错的。
举例来说,TCP 协议可以为各种各样的程序传递数据,比如 Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了"应用层"。
为什么说一个WIFI要说以上这么多。好吧,其实大部分没什么用,最重要的要理解一点,WIFI其实只是把赋予设备MAC地址,连接上网络,并分配好IP,或者是作为AP给别的设备分配IP等等,而要真正的传输数据,使用的仍然是TCP 或者 UDP协议。
3.
经过上面的层次封装之后,如果我们要发送数据就变成了这样。
然后接收端和发送端的对应解析大概是这样的,发送的时候每一层就封装上自己的东西,接收的时候,每一层就剥离掉其他层次,拿到自己那一层的数据。
AP :类似 wifi 也就是无线接入点,是一个无线网络的创建者,是网络的中心节点。一般家庭或办公室使用的无线路由器就是一个 AP。
STA:类似手机 每一个连接到无线网络中的终端(如笔记本电脑、PDA及其它可以联网的用户设备)都可称为一个站点。
完,各位共勉~