文章目录
- 问题
- 认识“协议”
- 计算机通信问题
- 技术问题
- 应用问题
- 协议分层
统编程帮助我们处理数据,网络编程帮助我们获取数据,网络配上我们写的线程池模块很快就搭建起来了。
问题
网卡是文件吗?
是的,所以未来网络通信的本质反馈到编程上他就是文件操作,所以未来网络各种协议都不要管,
就记住文件里写,就是往网卡里写,往网卡里写就是往网络里写。
局域网和广域网只是相对的概念
我们认为在你家里就是一个局域网,如果你访问自己的服务器,那么就是访问广域网。
网络发展是历史的必然,如果没有网络那么每个人关注数据处理数据的点不一样,那你用U盘传效率太低,所以就会有网线把所有计算机连起来,每个人想要数据从服务器上去拿。
随着发展可能一个局域网要和另一个局域网共同处理一个项目,所以把两个不同的子网链接起来也是发展的必然。
认识“协议”
计算机里因为数据经过长距离传输,所以沟通的成本就高了,距离变成,信息传输衰减是问题,传递过来的信息我得知道这信息是什么意思,所以长距离传输是需要定一些协议的。
例子:你去上大学,老爹在老家有一部座机,你给家里打电话 响铃一声,2声,三声,你和老爹约定好了这三种情况都是啥意思,这个东西就叫做协议。
从故事里得到一个结论,一个问题。
结论:我们可以通过协议降低沟通信息的成本。所以协议本质是一种约定,通过双方规定的方式,减少沟通成本。
问题:我们在计算机领域的协议该如何理解他呢?
不管如何,我们定协议是为了解决计算机通信问题,把问题罗列出来协议能解决什么问题也就清楚了,协议就是解决通信问题的。
计算机通信问题
技术问题
长距离传输的数据丢失的问题 1.你怎么知道丢了 2.丢了之后怎么办 》tcp协议
如何定位主机的问题-》ip协议
你怎么保证你的数据能准确到达下一个设备 -》数据链路层
这几个问题假设都解决了,我能精准定义某一个主机把数据传给另一个主机了,这个传数据给远端主机是目的吗?
应用问题
把数据传送给远端不是目的,我们要的是如何处理发来的数据? 》https http ftp协议…
他是让我干什么呢?是让我上传还是下载?
主机是对称的,发送方和接收方都有相同的这样的问题,所以我们就要在双方机器上每一层对应的问题都要解决。
那我们怎么做的,所以每一层都要有自己的协议。
为什么网络会有这些问题呢?
如果今天两台机器就在一块会有这样的问题吗?
根本原因就是单纯的传输距离变长了!
我们实际生活中收快递,假如你买了一个洗面奶,可是你会收到多出来的快递盒子,盒子上的各种信息字段,这个多出来的信息字段就叫做协议的报头。
如果用C语言想把快递单描述起来该如何描述?
用C语言该如何描述这个报头呢?答案就是你会用结构体。
你要发“在吗“”这个字符串,只要把在吗拷贝到结构体后面你就构建了一个报文。
协议的最终结论
协议是双方的约定,最终他的表现形式就是结构体对象。
所以左侧机器定义结构体A,右侧机器也认识结构体A,对端也能立马认识这个 结构体,因为我们类型是一样的,所以就可以跨主机基于结构体快速形成约定。
思考:
只要通信的两台主机,约定好协议就可以了吗?
标准定出来之后,从硬件到软件,协议是标准的子集
问题
能不能告诉我一些软件分层的场景?什么叫做软件分层啊?
我们学习过的linux操作系统就是分层的
具体如何分层的例子有:继承和多态带来的软件的意义不就是在做软件分层吗?
基类就是上层,子类的各种多态化实现就是下一层,所以你改下一层并不影响上一层,这就是典型的软件分层。
我们学习虚拟文件系统时,不同的硬件对应struct file中对应不同的指针指向读写方法,就是在用户和硬件驱动之间加一层软件层。
软件分层不一定非得是上下的关系,也可以是左右的关系,比如虚拟地址空间的分层将进程管理和文件管理很明显就区分开了。
软件分层上的结论
它最典型的表现是在结构体或类的设计上,在数据层面上作分离。
第二种,回调函数,通过回调的方式在软件逻辑上分层,大部分的分层既是在数据结构上分层,又是在软件逻辑上分层,这样代码耦合度就低了也就好维护了。
为什么我要分层呢?
一旦分层最大的好处就是层和层之间,它代码耦合度降低了,大项目被肢解为多个子项目,这样后期维护成本非常低。
遵守的维护原则让层和层之间他的耦合度降低,层和层不要有太多的交互,要交互接口一定设计的非常轻量化。
凡事划分同一层内部,大家的代码和数据和逻辑都必须是强相关的,这叫高内聚。
协议分层
为什么网络协议是层状的呢?
原因:
技术上的原因
1.网络通信时规模太大了
实际情况的原因
2.协议本身是解决问题的,刚好你的问题是层状的,所以协议定义出来也是层状的。
比如你得先解决主机到下一跳主机的问题,解下的问题是如何定位目标主机的路由问题,解决之后A到B主机的问题后,但我并不能保证可靠性,所以继续衍生到可靠性问题。下一组问题是你打算把数据怎么处理?
所以软件协议就进行软件分层方面 的设计了。
自此把软件协议从是什么,为什么,后面大部分都在说一个问题,如何进行分层?每一层究竟有什么,协议是怎么解决这些问题的。
张三和李四 打电话实际上认为人和电话在沟通
但是重要的是 逻辑上我们认为 人和人,在同一层进行直接交互,电话和电话在沟通。
语言层,我们有协议,比如你不是上来就说话,而是简单握手比如 喂,电话层的协议就更不用说了。
打电话场景中,同层协议能做到高内聚,层和层之间就叫做低耦合,电话的协议用户不关心,用电话的人说中文还是英文,电话一点不关心。
层和层交互时我们只用一个话筒就可以交互了。
所以层状结构的好处就是好维护,一层出问题只会影响某一层本身,不会影响上一层,甚至我把电话层全换掉,也不影响上一层,上一层也可以换。
所以分层最大的好处在于通过高内聚低耦合可以大大降低软件维护的成本。