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