当自律变成一种本能的习惯,
你就会享受到它的快乐。
--- 村上春树 ---
首先,协议是一种约定。就比如使用汉语进行通信,就要遵循汉语的使用约定,不能胡乱遣词造句!
计算机之间的传输媒介是光信号和电信号.。通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息。要想传递各种不同的信息, 就需要约定好双方的数据格式,这就是计算机网络协议的本质!
那么既然是进行计算机的通信,如果每个地区的通信协议不一致,就好比地方上的方言,那么肯定是不可能行的,必须是要推广普通话的。计算机世界也是这样,需要进行一个统一的协议来保证通信的可行性!!!
协议本质也是软件, 在设计上为了更好的进行模块化, 解耦合, 也是被设计成为层状结构的!这种分层的结构让维护通信的成本降低,提高效率!
张三和李四通过电话来进行通信,张三会把汉语协议的信息传给电话,电话再通过电话协议将信息传给李四的电话,李四通过汉语协议理解张三的信息。这就是实现了物理意义的分层: 张三 -> 电话 -> 电话 -> 李四 这样就是良好的解耦,张三李四不需要考虑电话之间是如何进行通信的,只需要向电话中传入信息或者获取信息!电话不需要管张三李四之间通信的信息如何理解,只需要做到信息的传递就可以。这样维护起来不就简单多了!!!
通过上面的简单例子, 我们是能理解, 分层可以实现解耦合, 让软件维护的成本更低。但是实际的网络通信协议, 设计的会更加复杂, 需要分更多的层。
OSI(Open System Interconnection, 开放系统互连) 七层网络模型称为开放式系统互联参考模型, 是一个逻辑上的定义和规范;
但是, 它既复杂又不实用; 所以我们按照 TCP/IP 四层模型来讲解:
TCP/IP 是一组协议的代名词, 它还包括许多协议, 组成了 TCP/IP 协议簇。TCP/IP 通讯协议采用了 5 层的层级结构, 每一层都呼叫它的下一层所提供的网络来完成自己的需求。
为什么要有TCP/IP协议?
我要发信息到目标主机B:
所以必然需要协议来解决这些问题!TCP/IP协议就是解决方案!
无论是windows ,linux 或者安卓,都要遵循这样的协议,这样就能实现不同设备之间的通信!在四层的协议之间中,网络层和传输层是最重要的,统称为TCP/IP协议。
所谓协议 ,就是通信双方都认识的结构化数据类型!
下面通过快递单来朴素的理解协议:
小明买了一个新键盘,那么他想要收到的就是键盘。但事实上,快递送达的时候除了键盘,他还会收到一张记录信息的快递单。这张快递单上储存着各种各样的信息,这些信息是卖家填的,小明和卖家都可以理解这些信息,那么小明就会明白这是他的快递!这张单子是快递公司制定的板式,小明和卖家都是按照规则读取和写入数据。所以这个快递单本质就是一种协议!!!用C语言表示不就是一个结构体吗!!! 我们把“快递单”称之为报头 , “键盘”称之为有效载荷!
通过协议就可以理解对方发送的信息的含义什么,就可以进行通信了!!!
首先,两台计算机在一个局域网中,是可以进行直接通信的。就比如在我的世界里的局域网联机,这就允许在同一个局域网中玩家之间可以直接进行通信!!!
我们以上课的例子来理解局域网:
王老师在教室给同学们上课,教室里有张三,李四,王五,赵六,刘八等同学。突然王老师说:“张三站起来 , 你作业为什么不交!”,所有同学都听见了这个信息,但只有张三站了起来,其他人不会站起来,因为其他人在听到消息后理解了这条信息的接受者是张三,而不是他们! 同学们听到信息,都提取出了对话目标是张三,再与自身信息进行对比。所以只有张三会站起来! 张三站起来之后说:“我交了作业,只是你没看罢了” 此时也不会有其他人进行插嘴,因为这是传送给王老师的信息!
在这个过程中,王老师和同学们同处在一个区域网(教室)中,张三和王老师的对话可以称之为单独对话吗?当然可以,因为两人话语的对象是彼此,虽然其他同学也会听到,但是他们知道消息不是发送给他们的!仅仅是吃瓜群众罢了!!!
王老师和同学们就相当于局域网下的不同主机,为了可以在局域网中判断信息是否是发送给自己的,就需要一个唯一的标识信息来进行判断:
MAC 地址用来识别数据链路层中相连的节点:
08:00:27:03:fb:19
)我们可以查看一下Linux主机的MAC地址:
通信过程中,就会将自己的MAC地址和对方的MAC地址加入到报头中,方便其他计算机的判断!
那么可以看到,这个以太网只允许一台机器进行访问,不就相当于是临界资源吗!但是并不会进行上锁的方式解决,而是通过碰撞检测来进行解决临界问题。发送碰撞就重新进行发送!
每台电脑都可以理解为:用户层,传输层,网络层和数据链路层。如果要进行通信,那么就要从用户层来进行,一层一层的向下传递,传递到网卡,通过网卡将数据发送出去,然后另一台计算机接收到信息,一层一层的向上解包传递!
每层只关注自己的信息,都认为是在与对方同层协议进行直接通信!!! 整个结构可以理解为栈结构,封装信息的过程就是不断将信息进行入栈,解包的过程就不断的弹栈!!!所以网络才称之为网络协议栈!
数据在网络中传送,一定最终是要在硬件上进行!!!所以才要进行封装和解包的过程,而不是每次协议直接进行通信!
报头部分, 就是对应协议层的结构体字段, 我们一般叫做报头,除了报头, 剩下的叫做有效载荷:
报文 = 报头 + 有效载荷
除了应用层,其他层都需要解决一个问题:自己的有效载荷应该交给上层的哪一种协议?所以协议结构体中都要有一个字段表示上层应该传给哪一个协议!!!
总的来说:通信的过程可以理解为下面一张图
如果要进行跨网络通信,就需要IP地址来进行标识!
IP 协议有两个版本, IPv4 和 IPv6. 我们整个的课程, 凡是提到 IP 协议, 没有特殊说明的,默认都是指 IPv4
对比 IP 地址和 Mac 地址的区别: • IP 地址在整个路由过程中, 一直不变(目前, 我们只能这样说明, 后面在修正) • Mac 地址一直在变 • 目的 IP 是一种长远目标, Mac 是下一阶段目标, 目的 IP 是路径选择的重要依据, mac 地址是局域网转发的重要依据
以后我们会继续深入学习IP,这里只是简单介绍一下!