从一开始计算机作为一台台单机使用,到现在网络飞速发展,从局域网Lan建立起局域网,到广域网Wan将远隔千里的电脑联系在一起,网络极大的促进了社会的发展和人类之间的交流,自从同一台主机进程间相互通信开始,网络的出现就是必然的。
何为协议,顾名思义,协议是双方都要遵守的 “约定” ,而在计算机的世界里,数据都是光电信号,用01表示强弱,要想传递好各种各样的信息,就要约定好对应的格式
举个简单的例子,在现代社会我们使用纸币交易,而在古代我们使用银子交易,这些交易方式其实就是“协议”
为什么要有网络协议?
1、计算机硬件设备很多,都是由不同的厂商生产
2、计算机操作系统也很多。
为了让这么多厂商生产出来这么多产品能够相互的流畅的通信,自然就需要一套标准让大家都要遵守,在这种要求下,网络协议就自然诞生咯
协议为什么要分层?我们先来看一下网络传输带来的问题:
1、首先,网络传输是长距离传输,容易出现数据异常的问题,比如丢失。
2、其次,网络中主机数量非常庞大,如何定位一台主机。
3、然后,如何进行数据转发、路径选择
4、最后,选择好路径,又要如何在硬件上传输
为什么会带来这么多问题? 很简单,数据传输的距离变长了而已。
这些问题是有上下关系的,比如定位问题解决后,如何数据转发路径选择?选择好路径又如何在硬件上传输?
基于这样的特点,网络被设计为高内聚、低耦合的 层状结构
,这样每一层都只关注自己同层的功能,使用下一层的接口,任何一层出现问题,都不会直接影响另外一层。
高内聚:把相关的问题放在一起,设计出解决方案
低耦合:按照不同的功能,设计不同的模块
在这样的要求下,第一个网络标准协议模型就制定出来了,该模型非常完善的制定了网络中的各个层的功能,在真正设计的时候,由于有些层与应用高度相关,因此我们重点来学习另一个模型
TCP/IP是一组协议的代名词,他们共同组成了TCP/IP协议族
同层协议都要有两个功能:
1、报头要和有效载荷分离
2、报头必须支持将有效载荷交付给上层哪个具体协议(TCP?UDP?)
根据冯诺依曼体系结构,操作系统是计算机软件和硬件的管理者,要使用网卡这个硬件设备,就需要使用操作系统提供的接口,这也就注定了网络一定会贯穿操作系统,而传输层和网络层正是被设计进了操作系统里,操作系统可以有很多种,但是网络只能有一种。
如果不那么做,有人使用ip,有人不用,会直接无法通信。
跨网段的传输基本流程如图,中间要经过一个或多个路由器,路由器一定是级联至少两个子网的,路由器工作在IP层,而正是通过这样的方式,IP层屏蔽了底层子网之间的差异,可以说,IP是整个网络世界的基石!这样印证了那句话:在计算机设计哲学里,任何一个问题都可以在之间添加一层软件层。
在网络传输里通常会有两个地址,即mac地址和ip地址,通俗点来讲,目的ip地址就是最终目标,而目的mac地址决定下一站去哪里。即目的ip是不变的,而目的mac地址是一直在变化的。
需要注意的是,mac地址是全球唯一的,每一台网络设备都要有自己唯一的mac地址!而ip地址则是一台主机在公网内的唯一标识。
理解本质之前,我们先要想一个问题:网络通信是两个主机在通信吗?
对,也不对,网络通信不单单是两台主机在通信,在主机接收到对方的数据后,要向上交付,交给对应的进程来处理,而网络通信的本质就是进程间通信。
暴漏自己的进程pid是不理智的,因此使用端口号来代替pid,一个进程可以绑定多个端口号,但一个端口号不可以被多个进程绑定!
我们把这种通过[源ip,源端口 + 目的ip,目的端口]的通信方式称为socket通信,即套接字通信。