计算机最初是为了打仗而来的,为了计算弹道导弹的轨迹。
计算机网络也是由于打仗而来的。是因为在冷战背景下,核威慑中如何才能用拥有足够的威慑力呢?后来想到了一个办法,就是二次核打击能力,二次核打击能力就是:是指在己方核武器 基地 遭到敌方打击后,仍能保存足够的 核 力量对敌方实施有效的核反击。那就需要一种通讯网络不怕核打击,在被核打击之后,通过网络通信进行发起二次核打击命令。
在上述背景下互联网就应运而生了。互联网很冗余,两点之间的路径有很多条,核打击不能全部打断网络连接的话,只要有一条路径还通畅,通信就还可以继续。
在上个世纪80年代左右,计算机还处于萌芽阶段,有些学校/研究所,已经尝试把计算机进行相连,可以进行简单的网络通信了。
后来大家发现民用更加有利,就衍生出了很多的互联网公司和产品,构建了咱们今天丰富的互联网世界。
计算机之间的网络连接连接后来就发展成为了局域网和广域网。
当然现在带有路由器功能(三层转发)功能的交换机也越来越常见,交换机和路由器之间的界限也越来越模糊。
我么家用的光猫就属于路由器,是由电口(插网线的),也有光口的(插光纤的)
网络通信信号传递:
上述两种都可以进行传递信息
协议是网络通信最最核心的概念。约定商量好数据是啥样的格式进行传输的。有了这个约定,才能让双方互相理解对方的含义。一个协议,可以很简单,也可以很复杂,像咱们日常说话,使用的”普通话“,“闽越话”, “川渝话”,也是属于协议的。
一次网络通信中最基础的是五元组。就类比于发一个快递有寄件人地址,寄件人姓名,收件人地址,收件人姓名,快递公司
网络通信是一个比较复杂的事情,需求场景复杂了,实现功能也比较复杂。
如果这个协议太复杂了,学习成本,使用成本,理解成本,维护成本都会非常高。因此实际采用的做法,是针对这个复杂的大协议,拆分成若干个相对简单的小协议。
随着把一些小的协议(每个协议负责一部分功能),此时就发现,某些协议之间,起到的功能和作用是类似的……
就针对这些小协议,再进行分类(分层),这就好比代码拆分出很多类,有的类功能相同,就可以放到同一个包中。
当前咱们要学习的网络协议就是在 分层 大背景下进行展开
协议分层类似于打电话时,定义不同的层次的协议:
在打电话时候,人只需要会打电话和说话就够了,不需要进行了解电话机协议和手机协议。在改变某一层协议的时候只需要改变该层协议对其他层协议没有影响。
协议其实有很多好处:
举个例子:
比如我要在淘宝上买件衣服,这个衣服要干什么,功能怎么样,用来自己穿,或者送人,又或者放在房间当饰品。这些都是应用层的职责。
买衣服要有收件人地址和收件人姓名,商家根据地址负责发快递,不关心传输的过程,只关心起点和终点。这些是传输层的职责。
买了衣服快递公司就要想从那条路径发,比如从 深圳 -> 石家庄,有很多路径选择:深圳 -> 武汉 -> 石家庄 ;深圳 -> 上海 -> 石家庄 …… 这个路线的选择就是网络层的职责。
比如选择了深圳 -> 上海 -> 石家庄,从深圳 -> 上海是飞机还是卡车?这个就是数据链路层的职责。
飞机飞行的航线,和卡车走的公路,就是物理层的职责了
越接近应用层就越接近用户,越接近物理层就越接近硬件设备
这五层协议各司其职,为什么还把这个叫做四层??
这个主要是因为物理层是属于纯硬件的,和程序员关系不大,所以有的资料就把TCP/IP模型中的物理层去掉了。
关于网络层和数据链路层的区别解析
节点:上述设备的统称 ,任何一个连入网络的交换机,路由器,电脑都可以称为”结点“。
相邻结点就是一根线连在一起的结点
网络层:考虑的是从电脑1 到电脑2 的路径规划
数据链路层:当数据到达目标电脑时,是通过网线传输,还是通过光纤传输,还是通过WiFi 无线传输……通过哪个网口出
所以咱们直接打交道的其实是应用层。下面四层,都是现成的。只需要知道怎么工作就行了。不需要你实现一个(但是经常涉及到,实现一个应用层协议……)。后面会继续重点解析的就是 应用层 和 传输层
下面来解析一下网络传输的基本流程(站在分层的背景下来理解)
以qq为例,A给B发送一个 doge
用户在输入框中输入 doge ,qq这个应用程序,就把这个字符串,构造成了一个应用层数据报。
应用层数据报,具体的数据格式,咱们是不清楚的。每个应用程序都不一定一样,只有开发qq的这群程序员才知道。
一个假定的应用层协议的格式:
发送方qq;发送时间;接收方qq;消息内容
所谓的”应用层数据报“本质上就是一个遵守了约定格式的字符串。
程序要调用操作系统的API,把这个应用层数据,交给传输层
到了传输层就进入了操作系统内核,在传输层中,就要把上述应用层数据报,构造成传输层的数据报。传输层使用到的协议,最知名的就是 UDP 和 TCP。假设在此处用到的是UDP,就需要构造出UDP 数据报(在 应用层数据报 基础上,加个 UDP 报头)
为什么要加报头呢?类似于发快递要把物品套上包装(还不止一层)。一方面是防止物品脏了。另一方面也可以在包装上面贴标签,标签上可以写一些信息。这是快递传输中必要的内容。
报头是另一个特定格式的字符串(具体细节后面说–涉及到源端口和目的端口),此处就像所谓的字符串拼接一样,这个报头和后面的数据拼到一起。所谓的“报头”就是一个“标签”,通过标签表示出当前这个消息是怎样进行传输的。
传输层就把这这个 UDP 数据报 交给网络层
最知名是协议就是 IP协议,IP协议要基于上述数据,打包成一个 IP数据报。
IP报头也是相当于一个字符串,包含了一组信息(最核心的信息,源IP 和 目的IP)。
网络层数据报准备好,还需要进一步交给数据链路层
最知名的协议叫做 ”以太网“ 。基于上述数据报打包成一个”以太网数据帧报“
表示一个网络传输的数据的单位:
包(packet)
报(datagram)
帧(frame)
段(segment)
……
在此不做过多介绍
接下来这个数据继续向下传输,交给物理层。
把上述二进制的数据(一串 0101) 转化成 电信号 / 光信号,此时就真正的把数据给发送出去了。
上述过程,从应用层,到物理层,层层加码,这个过程称为”封装“(这个风封装不是面向对象的封装)
接收方的工作只考虑接收设备,省略中间经过各个结点的中间装啊过程。
网卡接收到的是 光信号 和 电信号。在物理层,把这个光电信号转化回二进制 数据,这个数据其实就是一个以太网数据帧。
把这个数据交给 数据链路层 解析。
数据链路层,需要去点帧头 帧尾,取出中间的载荷,交给上层的网络层。以太网数据帧的帧头里也会有记录,这个载荷是不是一个 IP数据报。
IP协议针对这里进行解析,解析出 IP 报头,取出 IP 协议的载荷,把这里得到的 传输层数据报 ,交给上层传输层
IP 报头里面会记录,载荷是 UDP 还是 TCP。
UDP 再进行解析,解析报头,取出载荷,再把这个载荷交给对方的应用程序。
UDP 报头里有一个重要的字段”目的端口“,目的端口是一个具体的应用程序,关联在一起的。因此就可以根据这个端口来把数据交给应用程序了。
就是qq应用程序。qq就会针对应用层协议也进行解析。显示到界面上。
上述,从下到上 层层解析,这个过程称为 ”分用“
对比快递就是:封装 – 包快递 。 分用 – 拆快递。
整个网路协议中,协议分成了很多层。上层协议要调用下层协议(下层协议把数据交给下层,继续封装)。下层协议要给上层协议提供支持(下层协议解析好数据,交给上层)。这里的几层协议之间是有明确的层级关系的。只有相邻的两层之间才能进行交互。(不能进行跨层交互)。上述的这些约束让通信过程变得简单,清晰起来了。
不能跨层交互 是 一个 让内容不混乱 的重要约束 。一个公司里面也有层级结构
如果基层员工可以直接能够向老板汇报工作,老板就忙不过来了。
此处指的是”传统意义“ 的是一个路由器和交换机,也就是教科书里写的路由器和交换机。但是实际上,真实情况是不一样的。有些路由器/交换机是可以封装分用到应用层的。这些路由器/交换机网络设备都是运营商提供的。运营商有的时候要需要做些别的事情,就需要进行应用层级别的封装分用。
一个典型的例子:舆情分析。网民通过互联网传播一些言论,这个时候其实数据是啥时候发送到哪里的,通过运营商这样的设备都是可以检测到的。