目录
结合代码,回顾osi七层模型
引入
结合我们之前写过的网络计算器代码,我们来重新回顾一下osi七层模型
--网络计算器代码编写+注意点(序列化,反序列化,报头封装和解包,服务端和客户端,计算),客户端和服务端数据传递流程图,守护进程化+日志重定向到文件-CSDN博客
我们从下往上看:
下三层我们暂且不看,因为代码里并没有涉及到
传输层
传输层保证数据被可靠到传输到对方主机
- 对应我们使用的tcp协议
会话层
会话层用于负责建立和断开通信连接
- 回想一下我们写的代码,每收到一个连接,就创建一个子进程去处理,当处理完成/失败时,子进程退出,并关闭与客户端的连接
- 也就是,由子进程管理[新连接的文件描述符]的生命周期
- 所以,创建子进程去对外提供服务,就相当于创建了一个会话层
- 其实也可以类比xshell,当我们登录后,它会为我们新建一个会话;这和客户端与服务端连接后,为它新建了一个文件描述符作为通信桥梁是一样的
- 只要这个会话存在,就代表他们之间正在通信
当然,这里其实并没有太体现出管理性
其实可以在原有基础中增加很多管理功能的,比如:
- 连接成功后,超过一定时间不发送消息,就自动关闭连接(因为连接了却不通信,相当于占着茅坑不拉屎,纯浪费资源,不如早点释放)
- 之前实现过的重连功能也算是一种管理
表示层
表示层用于转换设备固有数据格式和网络标准数据格式
- 是不是很熟悉,这其实就是我们的有效报文在进行格式的转换(报头的封装和解包)
其中:
- 设备固有数据格式 -- 我们自定义的协议 : 将结构体的字段以一定顺序,一定分隔符组合成有效报文
- (虽然其中之一被我魔改成是一个独立的字符串,也并不需要重新组合,总之依然是协议,双方都认识且都遵守)
- 网络标准数据格式 -- size\n有效报文\n
应用层
应用层就是为上层提供服务的,针对特定应用的协议
- 我们这里是网络计算器,会把拿到的运算表达式传入计算逻辑,计算完成后返回结果,然后又将它转换为字符串格式 -- 这一部分就是我们的应用层
- 处理有效报文(反序列化) -> 结果 -> 将结果封装为有效报文(序列化) 的过程,就是我们定制的应用层协议,它决定了我们如何处理收到的有效数据
- 不同的应用场景,有不同的序列化/反序列化方法,以及处理数据的方法
如何得到应用层协议
应用层协议有三种方式可以得到
- 有很多现成的,很好用的应用层协议可以供我们使用,比如http协议(超文本传输协议)等
- 也有直接提供第三方库的,可以直接调用库中定义好的接口
- 当然,我们也可以自定义协议(如果是供公司内部使用的服务/游戏后台开发/后台组件,一般会需要自定义协议)
总结
- 所以,我们的代码结构是完全符合osi七层模型的,这也反过来证明这个模型定义的非常精准非常好
- 也可以看出来,上三层的设计是很自由的,它可以根据场景不同/设计人员的心情不同而定制,这也是它无法写入内核的原因,它没法被写死