目录
网络协议栈和os的关系
思考联系
网络协议栈涵盖了硬件和软件,而os正是管理软硬件资源的中枢
os是计算机体系结构的一部分,计算机体系结构中也囊括了软硬件:
如果我们将网络协议栈和体系结构图对比着一起看
- 硬件层正好和底层硬件中的网卡相匹配
- 而数据链路层正好是软硬件的分界线,它必然和驱动程序有着异曲同工之妙
- 恰好,再上两层(运输层,网络层)被写在了os中,是os的一部分
- 到了最上层的应用层,也与用户部分匹配,用户看到的正是经过应用层处理过的数据
实际
而实际上的情况也和我们的想法一致
- 用户从网络上获取数据,都是通过网卡这个硬件设备得到的
- 数据链路层属于网卡驱动的一部分
- 传输层和网络层是真正在os中实现的模块,是os的一部分(所以学习了文件管理/进程管理,其实也就学习了这两层是如何运作的,原理都大差不差)
当然,网络协议栈里不只有这些与计算机体系结构相对应
用户从网络获取数据的过程
本质
用户从网络上获取数据,都通过网卡这个硬件设备 (网卡将用户请求传输给远端服务器,再将返回的数据上传到本地主机)
- 所以,[用户从网络上获取数据]的过程,本质就是在访问硬件(是一种基于网络的输入/输出操作)
- 之前我们梳理过的,使用printf函数实际是在访问显示器,使用文件操作接口实际是访问硬盘,这些操作本质上都是一样的
如何获取 -- 系统调用
由于用户无法直接操作硬件,硬件是由os管理的,但os不允许用户直接访问其内部(安全性问题)
- 所以需要让用户给os发送请求,然后os进行相应操作
- 既然用户有了需求,那么os自然要为我们提供服务
- 用户需要向os发送请求,怎么发送呢? -- 也就是os为我们提供系统调用接口
- (这是不是就和之前学其他硬件是一样的?都需要系统调用这个中间介质)
- 所以,网络协议栈中也会使用系统调用接口
然后开发者会基于这些系统调用,制定出非常多的应用层协议供用户使用
图示
可以看出来,网络协议栈和操作系统密切相关
- 网络协议栈是一组协议的层次结构,用于在计算机网络中进行通信
- 而操作系统提供了网络协议栈的实现和支持
不同的os
从图中我们也可以看出来,两者虽然互相协作,但网络功能的实现并不关心实际计算机的结构如何实现
- 比如,是否有独立线程结构/是否有图形界面
- osi模型是一个标准,它既然已经定下了,肯定不是只适用于一种操作系统,对linux/windows等os都是一视同仁的
- 无论他们内部是如何实现的,网络协议栈都必须是相同的,否则该操作系统无法联网
网络字节序
虽然网络功能对计算机类型不做要求,但在网络中传输的数据是需要规定的
引入
还记得吗,内存中的多字节数据相对于内存地址有大端和小端之分:
- 小端 -- 把高权值的数字放在高地址处,低权值的数字放在低地址处
- 大端 -- 把高权值的数字放在低地址处,低权值的数字放在高地址处
- 所以有"小小小"的口诀
因为大小端没有明显的优劣差异,所以一直到现在,字节序列都没有统一
一旦不同主机之间要通信,就势必需要考虑一些问题 -- 会出现 大端机向小端机发送数据 -> 小端机会以小端的形式读取以大端发送的数据 -> 导致 数据错误
介绍
所以就需要做出约定 -- tcp/ip协议规定,网络数据流均采用大端形式
这样就保证了在网络中的统一 : 如果你是小端机,发送和接收都需要做转换,而大端机不需要
网络数据流的地址
- 发送主机 通常将发送缓冲区中的数据按内存地址从低到高的顺序发出
- 接收主机 把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
- 所以,网络数据流的地址是 -- 先发出的数据是低地址,后发出的数据是高地址
接口
如果让我们自己转换,就有点麻烦,所以,系统为我们提供了一些函数,帮助我们完成通信
乍看很复杂,实际上函数名字都是有含义的:
- h表示host(主机字节序)
- n表示network(网络字节序)
- l表示32位长整数(4字节)
- s表示16位短整数(2字节)
- eg:htonl 指将4字节的整数从主机字节序转换为网络字节序,以便在网络中传输
网络通信的本质
两台主机通信流程
基于上面的图,我们可以简述一下两台主机是如何通信的:
- 两台主机在通信时,从一方主机的用户层开始向下传输数据,一直到网卡,然后网卡间通信,对方的网卡再将接收到的数据向上传输到用户层
- 和打电话的例子相同 -- 在逻辑上,相同层之间都认为是在互相直接通信(因为相同层使用的协议是一样的,同层间可以正常通信,在逻辑上,不同层无法交流)
- 而两台主机上遵守相同的网络协议栈,所以每一层都可以完美匹配
- 所以,上面那一系列过程,都是可以正常完成的
- 总结 -- 网络通信的本质就是贯穿协议栈的过程(只是方向有两个而已)