目录
[2. 初识协议](#2. 初识协议)
[2.2 协议分层](#2.2 协议分层)
[2.3OSI 七层模型](#2.3OSI 七层模型)
[2.4TCP/IP 五层(或四层)模型](#2.4TCP/IP 五层(或四层)模型)
[3.1为什么要有 TCP/IP 协议?](#3.1为什么要有 TCP/IP 协议?)
[3.2什么是 TCP/IP 协议?](#3.2什么是 TCP/IP 协议?)
[3.3TCP/IP 协议与操作系统的关系(宏观上, 怎么实现的)](#3.3TCP/IP 协议与操作系统的关系(宏观上, 怎么实现的))
1.计算机网络背景
1.独立模式: 计算机之间相互独立;
2.网络互联: 多台计算机连接在一起, 完成数据共享;
3.局域网 LAN: 计算机数量更多了, 通过交换机和路由器连接在一起;
4.广域网 WAN: 将远隔千里的计算机都连在一起;
所谓 "局域网" 和 "广域网" 只是一个相对的概念. 广域网也可以看做一个比较大的局域网
计算机是人的工具, 人要协同工作, 注定了网络的产生是必然的
2. 初识协议
2.1概念
"协议" 是一种约定.
打电话约定电话铃响的次数的约定
计算机之间的传输媒介是光信号和电信号. 通过 "频率" 和 "强弱" 来表示 0 和 1 这样的
信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式思考: 只要通信的两台主机, 约定好协议就可以了么?
定好协议, 但是你用频率表示 01, 我用强弱表示 01, 就好比我用中国话, 你
用葡萄牙语一样, 虽然大家可能遵守的一套通信规则, 但是语言不同, 即是订好了
基本的协议, 也是无法正常通信的
所以, 完善的协议, 需要更多更细致的规定, 并让参与的人都要遵守。
计算机生产厂商有很多;计算机操作系统, 也有很多;计算机网络硬件设备, 还是有很多。
如何让这些不同厂商之间生产的计算机能够相互顺畅的通信? 就需要有人站出来, 约定一个共同的标准, 大家都来遵守, 这就是 网络协议;
一般具有定制协议或者标准的资格的组织或者公司都必须是业界公认或者具有江湖地位的组织或者公司。(定协议的人和实现协议的人可能是两批人,华为制定了5G标准,那么其他国家要实现5G技术,那就要遵守华为的标准)
2.2 协议分层
协议本质也是软件, 在设计上为了更好的进行模块化, 解耦合, 也是被设计成为层状结构的。
软件分层的好处
首先逻辑上,AC是在直接沟通。实际上,A和C进行沟通不是直接沟通,是通过电话来进行沟通的,电话就是下一层。如果下层换成了无线电,当然也是不影响AC进行通信的,也就是说,即使下层出现了问题,也是不会影响上层的;上层语言变化了,也不会影响下层。
- 在这个例子中, 我们的"协议"只有两层:语言层、 通信设备层。
- 但是实际的网络通信协议, 设计的会更加复杂, 需要分更多的层。
- 但是通过上面的简单例子, 我们是能理解, 分层可以实现解耦合, 让软件维护的成本更低。(耦合度的高低,也成为了软件好坏的评估之一)
2.3OSI 七层模型
- OSI(Open System Interconnection, 开放系统互连) 七层网络模型称为开放式系统互联参考模型, 是一个逻辑上的定义和规范;
- 把网络从逻辑上分为了 7 层. 每一层都有相关、 相对应的物理设备, 比如路由器, 交换机;
- OSI 七层模型是一种框架性的设计方法, 其最主要的功能使就是帮助不同类型的主机实现数据传输;
- 它的最大优点是将服务、 接口和协议这三个概念明确地区分开来, 概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;
- 但是, 它既复杂又不实用; 所以我们按照 TCP/IP 四层模型来讲解
其实在网络角度, OSI 定的协议 7 层模型其实非常完善, 但是在实际操作的过程中, 会话层、 表示层是不可能接入到操作系统中的,所以在工程实践中, 最终落地的是 5 层协议。
但是要理解上面的话, 需要我们学习完网络才可以理解, 这里就知道就可以。
2.4TCP/IP 五层(或四层)模型
TCP/IP 是一组协议的代名词, 它还包括许多协议, 组成了 TCP/IP 协议簇.
TCP/IP 通讯协议采用了 5 层的层级结构, 每一层都呼叫它的下一层所提供的网络来完成自己的需求
- 物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、 早期以太网采用的的同轴电缆(现在主要用于有线电视)、 光纤, 现在的 wifi 无线网使用电磁波等都属于物理层的概念。 物理层的能力决定了最大传输速率、 传输距离、 抗干扰性等. 集线器(Hub)工作在物理层.
- 数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、 帧同步(就是说从网线上检测到什么信号算作新帧的开始)、 冲突检测(如果检测到冲突就自动重发)、 数据差错校验等工作. 有以太网、 令牌环网, 无线 LAN 等标准. 交换机(Switch)工作在数据链路层.
- 网络层: 负责地址管理和路由选择. 例如在 IP 协议中, 通过 IP 地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.
- 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机.
- 应用层: 负责应用程序间沟通, 如简单电子邮件传输(SMTP) 、 文件传输协议(FTP) 、 网络远程访问协议(Telnet) 等. 我们的网络编程主要就是针对应用层.
物理层我们考虑的比较少, 我们只考虑软件相关的内容. 因此很多时候我们直接称为TCP/IP 四层模型.
一般而言
- 对于一台主机, 它的操作系统内核实现了从传输层到物理层的内容;
- 对于一台路由器, 它实现了从网络层到物理层;
- 对于一台交换机, 它实现了从数据链路层到物理层;
- 对于集线器, 它只实现了物理层;
但是并不绝对. 很多交换机也实现了网络层的转发; 很多路由器也实现了部分传输层的
内容(比如端口转发);
3.再识协议
上面的内容, 我们只是懂了一些基本概念, 还是达不到我们的目标, 下面我们再次重
新理解协议和协议分层。
3.1为什么要有 TCP/IP 协议?
首先, 即便是单机, 你的计算机内部, 其实都是存在协议的, 比如: 其他设备和内存通信, 会有内存协议。 其他设备和磁盘通信, 会有磁盘相关的协议, 比如:SATA, IDE, SCSI 等。 只不过我们感知不到罢了。 而且这些协议都在本地主机各自的硬件中, 通信的成本、 问题比较少
其次, 网络通信最大的特点就是主机之间变远了。 任何通信特征的变化, 一定会带来新的问题, 有问题就得解决问题, 所以需要新的协议
所以, 为什么要有 TCP/IP 协议? 本质就是通信主机距离变远了
3.2什么是 TCP/IP 协议?
为什么要有 TCP/IP 协议? 本质就是通信主机距离变远了。由于长距离的通信,随之也伴随了一些问题(1.如何将数据发生给路由器?2.如何定位接收数据的主机?3.数据发出去,丢失了怎么办?4发数据不是目的,只是手段,用数据才是目的,接收数据的主机怎么知道我发出去的数据该怎么处理?)
TCP/IP 协议的本质是一种解决方案,为了解决上面的问题
然而上面的问题性质不同,种类不同,导致协议的性质不同,种类不同,所以协议是要分层处理的。TCP/IP 协议能分层, 前提是因为问题们本身能分层。这就是经协议分层的TCP/IP 协议
3.3TCP/IP 协议与操作系统的关系(宏观上, 怎么实现的)
操作系统的作用:
- 操作系统是计算机硬件与软件之间的桥梁,负责管理和控制计算机硬件和软件资源。
- 在网络通信方面,操作系统提供了TCP/IP协议栈的实现,使得计算机能够遵循TCP/IP协议族进行网络通信,计算机之间之所以能够通信,就是使用了同一套协议栈。
TCP(传输层最主要的协议)/IP(网络层最主要的协议),然而网络协议栈对主要的两次又是传输层和网络层,因此我们把这个协议统称为TCP/IP协议。
3.4所以协议究竟是什么?
截止到目前, 我们还没接触过任何协议, 但是如何朴素的理解协议, 我们已经可以试试了。 OS 源代码一般都是用 C/C++语言写的。
仔细看看下面的图:
我们目前可以理解windows系统和Linux系统之间可以进行网络交流,最主要的原因就是他们的网络协议栈是一样的(同一份代码)。
假设传输层定义了一个protocol的结构体
问题: 主机 B 能识别 data, 并且准确提取 a=10, b=20, c=30 吗?
回答: 答案是肯定的! 因为双方都有同样的结构体类型 struct protocol。 也就是说,用同样的代码实现协议, 用同样的自定义数据类型, 天然就具有"共识", 能够识别对方发来的数据, 这不就是约定吗?
关于协议的朴素理解: 所谓协议, 就是通信双方都认识的结构化的数据类型
因为协议栈是分层的, 所以, 每层都有双方都有协议, 同层之间, 互相可以认识对方的协议。
一段完整的协议包含协议报头和有效载荷,两者总称报文。
对于IP协议,其报头包括版本(标识IP协议的版本,如IPv4或IPv6)、首部长度(描述IP包头的长度)、服务类型(定义包的优先级等)、总长度(首部长度和数据长度之和)、标识(用于分片)、标志(如DF和MF位)、协议(标识上层所使用的协议)、头部校验(用于IP头部的正确性检测)等字段。
有效载荷(Payload)是指数据包中除了协议报头之外的部分,它包含了实际要传输的数据或信息。
4.网络传输基本流程
4.1局域网网络传输流程图
局域网(以太网为例)通信原理
首先回答, 两台主机在同一个局域网, 是否能够直接通信? 是的
假如我们在一间教室上课,老师问张三你作业为什么不做,大家都听到了,但只有张三站起来了,(不站起来的人是因为,刚刚老师的报文中,目的地址是张三,其它人不做处理),张三提取到的目的地址是张三,所以张三站起来了。张三和老师算单独通信吗?算的,只是有一大批吃瓜群众,他们也可以听到,只是不做处理罢了。
在上面的例子中,老师就是局域网,张三是主机A,还有其它的主机BCD...,当A和B通信时,只需要知道对方的名字就可以实现直接通信,虽然其它主机可以收到,但并不做处理。
每台主机都能直接通信,每台主机在局域网上, 要有唯一的标识来保证主机的唯一性: mac 地址
MAC 地址用来识别数据链路层中相连的节点;
- 长度为 48 位, 及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
- 在网卡出厂时就确定了, 不能修改. mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址, 可能会冲突; 也有些网卡支持用户配置 mac 地址).
后面我们详细谈论数据链路层的时候, 会谈 mac 帧协议, 此处我们做一个了解即可。
下面就是一个局域网,有各种主机,每个主机都有自己的mac地址。在发送数据的时候,(src会带上自己的mac地址,dst是目的机的mac地址,data:发送的数据)会将发送的通过数据网络协议栈变成数据帧,然后通过局域网发送到局域网中,局域网的主机都能收到,主机会通过mac地址判断是不是自己的消息,如果是自己的消息,就会接收处理消息,最终以同样的方式发送回去。这就采用mac地址在局域网中进行通信了。
- 以太网中, 任何时刻, 只允许一台机器向网络中发送数据
- 如果有多台同时发送, 会发生数据干扰, 我们称之为数据碰撞
- 所有发送数据的主机要进行碰撞检测和碰撞避免
如果多个主机在局域网中,是不可避免的。 任何时刻, 只允许一台机器向网络中发送数据,那么在系统观念当中,局域网其实是一种临界资源!如果发送碰撞了就进行检查,重发,以维持这个通信
- 没有交换机的情况下, 一个以太网就是一个碰撞域
- 局域网通信的过程中, 主机对收到的报文确认是否是发给自己的, 是通过目标mac 地址判定
- 这里可以试着从系统角度来理解局域网通信原理
初步明白了局域网通信原理, 再来看同一个网段内的两台主机进行发送消息的过程:
流程图
而其中每层都有协议, 所以当我进行进行上述传输流程的时候, 每层都要要进行封装和解包,每层协议都要有报头下面我们明确一下概念:
- 报头部分, 就是对应协议层的结构体字段, 我们一般叫做报头
- 除了报头, 剩下的叫做有效载荷
- 故,报文 = 报头 + 有效载荷
然后, 我们在明确一下不同层的完整报文的叫法
- 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame).
- 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation).
- 首部信息中包含了一些类似于首部有多长, 载荷(payload)有多长, 上层协议是什么等信息.
- 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的 "上层协议字段" 将数据交给对应的上层协议处理
从上往下的过程叫做封装(添加报头),上一层交给下一层的我们都称之为有效载荷;从下往上的过程叫做解包和分解。对于发送方和接收方,每一层的报头和有效载荷一定是一样的,每一层都以为自己在于对方同层协议(逻辑上是认为,我们都是在与对方同层进行直接通信)。封装的过程就是一个入栈的过程,而解包就是一个弹栈的过程,所以我们把tcp/ip叫做网络协议栈。数据在网络中发送的时候,一定最终是要在硬件上跑的,一定是沿着网线跑的,上面过程,物理上是下楼再上楼的过程,逻辑上也得这么走。
我们在上面对协议做了朴素性的理解,协议就是一个结构体对象。所以每一个报头都是一个结构体,因此我们在进行封装的时候,每层协议都有一个共性(应用层除外,应用层比较特殊):1.报头和有效载荷分离的问题--解包 ;2.除了应用层,每一层协议,都必须解决一个问题,自己的有效载荷,应该要交给上层的哪一种协议!!---这个过程叫做分用。( 在报头中都有一个公共字段,来记录自己的上层协议是谁。)
最后, 在整体复盘一下:
在网络传输的过程中, 数据不是直接发送给对方主机的, 而是先要自定向下将数据交付给下层协议, 最后由底层发送, 然后由对方主机的底层来进行接受, 在自底向上进
行向上交付, 下面是一张示意图。
数据包封装和分用
下图为数据封装的过程:
下图为数据分用的过程:
要学习的协议, 是如何做到解包的? 只有明确了解包, 封包也就能理
要学习的协议, 是如何做到将自己的有效载荷, 交付给上层协议的?分用。
4.2跨网络传输流程图
网络中的地址管理 - 认识 IP 地址
IP 协议有两个版本, IPv4 和 IPv6. 我们整个的课程, 凡是提到 IP 协议, 没有特殊说明的,默认都是指 IPv4。
- IP 地址是在 IP 协议中, 用来标识网络中不同主机的地址;(ip在全网内唯一)
- 对于 IPv4 来说, IP 地址是一个 4 字节, 32 位的整数;
- 我们通常也使用 "点分十进制" 的字符串表示 IP 地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一个字节, 范围是 0 - 255;
跨网段的主机的数据传输. 数据从一台计算机到另一台计算机传输过程中要经过一个或
多个路由器.
下面的以太网和令牌环是两个不同的局域网标准,数据链路层也是不同的。
首先理解一下 IP 地址的意义:
首先我们可以看到,该路由器有两个网卡,有两个ip地址。要进行网络通信,就要有两个协议栈。
在这个过程中A会进行封装,在网络层的时候,A会有一个路由的过程,发现不是发给自己局域网主机的报文就推送给路由器,如果要推送给路由器不是在网络层,还要向下添加数据链路层报头封装mac帧,形成最终报文(自己的mac地址和路由器的mac地址)由路由器接收处理,路由器会进行解包,交给自己的网络层进行路由,这个过程中路由器会匹配A主机发送的ip目标网段(172.168),接着在这个网段寻找目标主机B,向下交付进行封装形成
报文发送给B所在局域网,最终由B接收处理。
网络层(就是IP)向上(包括网络层)看到的所有的报文都是一样的,都至少是IP报文。**IP可以屏蔽底层网络的差异,所有的网络都是IP网络。(**在转发的过程中IP地址不变,但mac地址经过一个地址都要变一下。)这样无论你的设备连接的是什么网络,都可以和其它设备无障碍的通信,因为底层用的都是IP网络。
对比 IP 地址和 Mac 地址的区别
- IP 地址在整个路由过程中, 一直不变(目前, 只能这样说明, 后面再修正)
- Mac 地址一直在变
- 目的 IP 是一种长远目标, Mac 是下一阶段目标, 目的 IP 是路径选择的重要依据, mac 地址是局域网转发的重要依据
提炼 IP 网络的意义和网络通信的宏观流程
下面的网络传输我们可以看到,经过了多个路由器。根据IP地址确定最终目标,根据mac地址找到路由器,数据被不断的路由,mac地址不断更迭,最终根据ip地址确定送达。