目录
[3:TCP/IP 五层(或四层)模型](#3:TCP/IP 五层(或四层)模型)
一:计算机网络的背景
1:网络发展
独立模式 : 计算机之间相互独立
在早期的时候,计算机之间是相互独立的,此时如果多个计算机要协同完成某种业务,那么就只能等一台计算机处理完后再将数据传递给下一台计算机,然后下一台计算机再进行相应的业务处理,效率非常低下。

网络互联:多台计算机连接在一起,完成数据共享
这时就有人设法将这些计算机联系在一起,当某个业务需要多台计算机协同完成时,就可以将共享的数据放到服务器中进行集中管理,此时各个计算机就都能获取到这些共享的数据,所以各个业务在处理就能够随时进行切换了.

局域网LAN:计算机数量更多了,通过交换机和路由器连接在一起.
后来这样的网络雏形不断逐渐发展,连入这个网络中的机器变得越来越多,于是就出现了局域网的概念.
在局域网中有一种设备叫做交换机,交换机主要完成局域网内数据的转发工作,也就是在局域网内将数据从一台主机转发给另一台主机。各个局域网之间通过路由器连接起来,路由器主要完成数据的路由转发工作。

广域网 WAN: 将远隔千里的计算机都连在一起.
各个局域网之间通过路由器相互连接在一起,便组成了一个更大的网络结构,我们将其称之为广域网。实际上局域网和广域网是一种相对的概念,也可以将广域网看作一个比较大的局域网。

二:协议初识
- 协议的本质是一种约定,通信双方只要曾经做过某一种约定,之后就可以使用这种约定来完成某种事情。而网络协议是通信计算机双方必须共同遵从的一组约定,因此我们一定要将这种约定用计算机语言表达出来,此时双方计算机才能识别约定的相关内容。举一个简单的例子.

计算机之间的传输媒介是光信号与电信号.通过"频率"和"强弱"来表示0和1这样的信息.要想传递各种不同的信息,就需要约定好双方的数据格式.
但是可以去思考这样子的一个问题,只要通信的两台主机,约定好协议就可以了么?
- 定好协议,但是你用频率表示01,而我通过强弱表示01,这就好比我使用中国话,你使用葡萄牙语一样,虽然大家可能遵守的一套通信规则,但是语言不一样。即便是订好了基本的协议,也是无法正常通信的.
- 因此,完善的协议,需要更多更细致的规定,并让参与的人都要遵守。
1:协议分层
- 协议的本质也是软件,在设计上为了更好的进行模块化,解耦合,也就被设计成为层状结构

- 举一个简单的例子,在打电话的时候,站在工程师的角度实际上这两个人并不是直接进行沟通的,而是甲的电话将甲说的话记录下来,经过一系列编码转码后,通过通信网络将信息从甲的电话传递到了乙的电话,然后在乙的电话中再经过对应的编码转码,最后乙才通过话筒听到了甲所说的话.
- 其中人和人之间的通信使用的是语言,那么我们可以将其称之为语言层.而电话和电话之间通信使用的是电话系统相关的一些接口,我们可以将其称之为通信设备层.
- 在上述的例子中,我们的"协议"只有两层:语言层、通信设备层。
- 但是实际的网络通信协议,设计的会更加复杂,需要分更多的层.
- 但是通过上面的简单例子,我们是能理解,分层可以实现解耦合,让软件维护的
成本更低
2:OSI七层模型
- OSI(Open System Interconnection,开放系统互联)七层网络模型称为开方式系统互联参考模型,是一个逻辑上的定义和规范。
- OSI把网络从逻辑上分为了七层,每一层都有相关的、相对应的物理设备,比如路由器,交换机。
- OSI七层模型是一种框架性的设计方法,其最主要的功能就是帮助不同类型的主机实现数据传输,比如手机和电视之间数据的传输。
- OSI七层模型最大的优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整,通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。
- 但是,OSI七层模型既复杂又不实用,所以后来在具体实现的时候就对其进行了调整,于是就有了我们现在看到的TCP/IP四层协议。
OSI七层模型如下:
|----------|----------------------------------------|----------------------------------------------------------------------------|
| 分层名称 | 功能 | 每层功能概览 |
| 应用层 | 针对特定应用的协议 |
|
| 表示层 | 设备固有数据格式和网络标准数据格式的转换 |
|
| 会话层 | 通信管理、负责建立和断开通信连接(数据流动的逻辑通路)、管理传输层以下的分层 |
|
| 传输层 | 管理两个节点之间的数据传输、负责可靠性传输(确保数据被可靠地传送到目标地址) |
|
| 网络层 | 地址管理与路由选择 |
|
| 数据链路层 | 互联设备之间传送和识别数据帧 |
|
| 物理层 | 以0/1代表电压的高低以及灯光的闪灭、界定连接器和网线的规格 |
|
- 其实在网络角度, OSI 定的协议 7 层模型其实非常完善,但是在实际操作的过程中,会话层、表示层是不可能接入到操作系统中的,所以在工程实践中,最终落地的是 5 层协议。
3:TCP/IP 五层(或四层)模型
TCP/IP 是一组协议的代名词,它还包括许多协议,组成了 TCP/IP 协议簇 . TCP/IP 通讯协议采用了 5 层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求.
- 物理层:负责光/电信号的传递方式。比如现在以太网通用的网线(双绞线)、早期以太网采用的同轴电缆(现在主要用于有线电视)、光纤,现在的WiFi无线网使用的电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)就是工作在物理层的。
- **数据链路层:**负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。数据链路层底层的网络通信标准有很多,如以太网、令牌环网、无线LAN等。交换机(Switch)就是工作在数据链路层的。
- **网络层:**负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间数据传输的线路(路由)。路由器(Router)就是工作在网络层的。
- **传输层:**负责两台主机之间的数据传输。例如传输控制协议(TCP),能够确保数据可靠的从源主机发送到目标主机。
- **应用层:**负责应用程序间沟通。比如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层的。
与OSI七层模型各层的对应关系:

一般而言
- 对于一台主机,它的操作系统内核实现了从传输层到物理层的内容。
- 对于一台路由器,它实现了从网络层到物理层的内容。
- 对于一台交换机,它实现了从数据链路层到物理层的内容。
- 对于集线器,它只实现了物理层的内容。
但这并不是绝对的,比如很多交换机也实现了网络层的转发,很多路由器也实现了部分传输层的内容(比如端口转发)。
集线器
- 电磁信号在长距离传输过程中信号是会衰减的,而集线器的主要功能就是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时将所有节点集中在以它为中心的节点上。
- 需要注意的是,集线器属于纯硬件网络底层设备,基本上不具有类似于交换机的"智能记忆"能力和"学习"能力,也不具备交换机所具有的MAC地址表,所以它发送数据时都是没有针对性的,而是采用广播方式发送,也就是说,当集线器要向某节点发送数据时,不是直接把数据发送到目的节点,而是把数据包发送到与集线器相连的所有节点。
三:再识协议
1:为什么要有TCP/IP协议
- 首先,即便是单机,你的计算机内部,其实都是存在协议的,比如:其他设备和
内存通信,会有内存协议。其他设备和磁盘通信,会有磁盘相关的协议,比如:
SATA , IDE , SCSI 等。只不过我们感知不到罢了。而且这些协议都在本地主机各自
的硬件中,通信的成本、问题比较少。 - 其次,网络通信最大的特点就是主机之间变远了。任何通信特征的变化,一定会
带来新的问题,有问题就得解决问题,所以需要新的协议咯。

2:什么是TCP/IP协议
- TCP/IP协议的本质是一种解决方案
- TCP/IP协议能分层,前提是因为问题们本身能够分层

3:所以究竟什么是协议
- 截止到目前,我们还没接触过任何协议,但是如何朴素的理解协议,我们已经可以试试了。
- OS 源代码一般都是用 C/C++ 语言写的
下面,我们来看下面这张图

主机 B 能识别 data ,并且准确提取 a=10 , b=20 , c=30 吗?
这是肯定的,因为双方都有同样的结构体类型struct protocol。也就是说,使用的是同样的代码来实现协议,用同样的自定义数据类型,天然就具有"共识",能够识别对方发来的数据,这就是约定
关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型,因为协议栈是分层的,因此,每层都有协议,同层之间,互相可以认识对方的协议。
四:网络传输基本流程
我们这里以两台主机进行数据传输为例,此时各层对应的协议如下:

1.同局域网的两台主机通信
同局域网的两台主机通信
首先需要明确的是,同一个局域网内的主机是能够直接进行通信的,因为最初局域网设计的目的,就是为了让局域网内的主机能够进行通信。

当用户要将数据传输给另一台主机前,该数据需要通过网络协议栈进行封装
- 数据先交给应用层,应用层添加上对应应用层协议的报头信息后,将数据再交给传输层。
- 传输层收到数据后,再添加上对应传输层协议的报头信息,并将数据继续向下进行交付。
- 网络层收到数据后,再添加上对应网络协议层的报头信息,接着将数据再交给链路层。
- 链路层收到数据后,最后再添加上对应链路层协议的报头信息,至此数据封装完毕。
数据封装完毕后就可以通过局域网将其发送给对端主机了,而当对端主机收到数据后,对应也需要通过网络协议栈对该数据进行解包与分用:
- 链路层收到数据后,先将数据中对应链路层协议的报头信息提取出来,然后将剩下的数据交给网络层。
- 网络层收到该数据后,再将数据中对应网络层协议的报头信息提取出来,然后将剩下的数据继续向上进行交付。
- 传输层收到该数据后,再将数据中对应传输层协议的报头信息提取出来,然后将剩下的数据再交付给应用层。
- 应用层收到数据后,最后将数据中对应应用层协议的报头信息提取出来,至此便完成了数据的解包与分用。
也就是说,任何一台主机在发送数据之前,该数据都要先自顶向下贯穿协议栈来完成数据的封装,在这个过程中,每一层协议都会添加上对应的报头信息;而任何一台主机收到数据后,都要先自底向上贯穿协议栈来完成数据的解包和分用,在这个过程中,每一层协议都会将对应的报头信息提取出来。

接下来我们来明确一下概念

这里要给uu们讲一个小故事
我们日常在寄送快递时需要填写相关的信息,像寄件人,始发地,寄件人电话,收件人,收件人地址,收件人电话等等,我们在某个购物买一部手机时,我们需要的是手机 ,但实际收到的是快递单+ 手机, 而当我们看到快递单时,我们可以确认这个快递是发给我们的.发快递的人和收快递的人都必须知道快递单上面的每一个字段是什么含义,因此快递单本身就是寄件人和收件人之间所做的一个约定,而这个约定遵循的标准是快递公司所制定的. 使用C语言来表示这个快递单的话,那uu们会自然而然地想到使用struct结构体变量, 然后在里面定义对应的成员变量.那么快递单就是协议层里面所对应的报头,而手机就是有效载荷,报头与有效载荷整体构成了报文.
快递单本质就是发送方和接收方规定出来的一种协议.
- 报头部分,就是对应协议层的结构体字段,我们一般叫做报头
- 除了报头,剩下的叫做有效载荷
然后我们再明确一下不同层的完整报文的叫法
- 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame).
- 应用层数据通过协议栈发送到网络上时,每层协议都要加上一个数据首部,称为封装(Encapsulation).
- 首部信息中包含了一些类似于首部有多长,载荷有多长,上层协议是什么等信息.
- 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的"上层协议字段"将数据交给对应的上层协议处理.
下图为数据封装的过程

下图为数据分用的过程

报头的概念
报头的本质是一种数据,报头一般是通过位段实现的,因此协议栈的每一层都有一个对应的位段来表示当前层的报头。
数据的封装与解包
- 数据封装实际就是不断给数据加上各种对应的报头,这些报头里面填充的就是对应的各种协议细节。
- 数据解包则是不断地从数据中提取对应的报头,并对提取出来的报头进行数据分析.
2.:跨网络的两台主机通信
讲解了同局域网内的主机之间的通信,那跨局域网的两台主机之间又是怎么通信的呢?
- 局域网之间都是通过路由器连接起来的,因此一个路由器至少能够横跨两个局域网.而这些被路由器级联局域网都认为,该路由器就是本局域网内的一台主机,因此路由器可以和这些局域网内的任意一台主机直接进行通信.
例如上图中,局域网1中的A主机想要和局域网2中的H主机进行通信,那么主机A可以先将数据发送给路由器,然后路由器再将数据转发给局域网2当中的主机.
局域网1中的主机A ------- 路由器 --------局域网2中的主机H.

采用不同通信标准的两个局域网内的主机通信
如果路由器级联的两个局域网采用的是相同的通信标准,那么通信的过程和上述是一样的。但被路由器级联的局域网可能采用的是不同的通信标准,比如局域网1采用的是以太网 ,而局域网2采用的却是令牌环网.

由于以太网和令牌环网 是不同的通信标准,它们给数据添加的报头也是不一样的,因此令牌环网当中的主机 无法对以太网当中的数据帧进行解包。
这种情况实际是由路由器来处理的,路由器是工作在网络层的一个设备,我们可以认为路由器当中的协议栈是下面这样的.

此时当数据要从局域网1发送到发送到局域网2中,路由器收到局域网1的数据后,会先将以太网对应的报头进行解包,然后将剩下的数据向上交付给网络层,在网络层进行一系列数据分析后,再将数据交付给链路层,此时在链路层当中就会给该数据添加上令牌环对应的报头信息,然后再将该数据发送到局域网2中,此时该数据就能够在令牌环网当中传输.
、
五:网络中的地址管理
1:认识IP地址
- IP地址是在IP协议中,用来标识网络中不同主机的地址。
- 对于IPv4来说,IP地址是一个4字节,32位的整数。
- 通常也使用"点分十进制"的字符串表示IP地址,例如192.168.0.1,用点分割的每一个数字表示一个字节,范围是0-255.
PS:IP协议有两个版本,分别是IPV4和IPv6地址。IPv4地址用32个比特位来标识地址, 而IPv6用128个比特位来标识地址.

2:MAC地址
- MAC地址用来识别数据链路层中相连的节点。
- 长度为48位,即6个字节,一般用16进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
- MAC在网卡出厂的时候就确定了,不能够修改。MAC地址通常是唯一的(虚拟机中的MAC地址不是真实的MAC地址),可能会冲突,也有些网卡支持用户配置MAC地址.
3:MAC地址与IP地址的区别
这里博主通过一个小故事来帮助UU们理解下IP地址和MAC地址的区别.
唐僧西天取经,出发地**是:长安 终点是:西天.**当唐僧从长安到了车迟国以后,见到车迟国的国王以后就说:施主你好,我是从东土大唐而来前往西天取经的和尚,我的上一站是长安,走着走着就到了车迟国,那么请问我下一站该去哪里呢?
车迟国国王:你要去西边啊,我们离西边最近的城池就是女儿国.
唐僧这时候大脑里面就有了两套地址,第一套是:从长安来,西天去.第二套是:上一站:长安,本站:车迟国.
唐僧到了女儿国以后,他大脑里面的地址发生了变化**,** **第一套是:从长安来,西天去.第二套是:上一站:车迟国,本站:女儿国.**然后他按照同样的方式去询问了女儿国的国王,女儿国的国王告诉他下一站要去往火焰山.
唐僧到了火焰山以后,他大脑里面的地址又发生了变化,第一套是:从长安来,西天去.第二套是:上一站:女儿国,本站:火焰山.

- IP 地址在整个路由过程中,一直不变 ( 目前,我们只能这样说明,后面在修正 ).在上面的故事中,唐僧在取经的过程中,最终目标一直不变,就是去往西天取经.
- Mac地址:每经过一个设备,就要变化自己上一站和本站的地址,这种变化的地址叫做MAC地址.
- 车迟国、女儿国、火焰山可以类比成路由器.
- IP 地址在整个路由过程中,一直不变(目前,我们只能这样说明,后面在修正)
- Mac 地址一直在变.
- 目的 IP 是一种长远目标, Mac 是下一阶段目标,目的 IP 是路径选择的重要依
据,M ac 地址是局域网转发的重要依据.- IP 网络层存在的意义:提供网络虚拟层,让世界的所有网络都是 IP 网络,屏蔽
最底层网络的差异.
提炼 IP 网络的意义和网络通信的宏观流程
