一、计算机网络背景
计算机网络的发展如下:
先是独立模式:
计算机之间是相互独立的

而后形成网络互联:
多台计算机连接在一起形成网络互联,完成数据共享

到后面,计算机的数量很多,而且之间的距离也变长了,后面就使用交换机和路由器连接在一起
这个我们成为局域网LAN。

广域网LAN:将远隔千里的计算机连接起来。

广域网和局域网之间的区别就是使用的范围的区别,我们可以将广域网理解成比较大的局域网。
我们人需要通过计算机达到各种的数据信息交流,所以计算机网络是必要的。
二、认识计算机网络协议
1、初识协议
协议就是人与人之间的一个约定。
就比如我们的暗号,约定了某个信号表示什么意思。
那么为啥需要这些协议呢?
计算机传输之间的媒介是光信号和电信号,其通过频率和强弱来表示0、1等这些信息,那么想要传递这些信息,我们就要提前约定好双方之间的数据格式。
但是双方主机约定好协议还是不够的,就比如我一个计算机使用的频率高低来表示01,但是另外一个主机是使用的电信号的电平高低表示01,那么这两者之间还是无法完成通信的。
就好比我们两个人之间进行通话,一个使用中文,一个使用英语。
所以一个完善的协议,需要更多的细致的规定,而且要让更多的人都参与进来并遵守。
下面是需要网络协议的几种原因:
1、计算机的生产厂商是有很多家的
2、计算机操作系统也有很多家
3、计算机网络设备也有很多
4、为了让不同的厂商之间的计算机能够实现相互顺畅的通信,那么就需要有人站出来、约定一个 共同的标准,让大家都来遵守
2、协议分层
协议其分为硬件协议和软件协议
对于硬件协议是硬件厂商设定的,这里我们不过多赘述
对于软件协议、其本质就是软件、那么在设计上我们为了更好的进行模块化、解耦合、其也是被设计成层状结构的。
那么设计成层状结构的好处是啥呢?

对于一些场景的变化、我们只需要对部分层进行修改即可,不需要对于整个软件进行更改。
分层可以使得后续软件的维护成本更低。
3、OSI七层模型
OSI七层网络模型称为开放式系统互联参考模型、是一个逻辑上的定义和规范
其将网络从逻辑上分为了7层每一层都有相关、相对应的物理设备。
OSI模型是一种框架性的设计方法、其最主要的功能就是帮助不同的主机实现数据传输
它的最大优点就是将服务接口和协议这三个概念分开来、概念也清晰、理论也比较完整、通过七个层次化的结构模型使得不同的系统之间的网络之间实现可靠的通讯。
但是其在后来的实践中检验到、部分是在操作系统层面是无法完成的、其复杂且不实用。
其层次从高到低如下:

其实在网络的角度来说、七层模型是非常完善的、但是在实际的操作过程中、会话层、表示层是不可能接入到操作系统的、所以在实际工程中使用的是五层模型。
4、TCP\IP五层(四层)模型
TCP\IP协议是一组协议的代名词、其还包括了许多的协议、组成了TCP\IP协议簇
TCP\IP协议其采用了五层的层级结构、每一层都呼叫其下一个层级所提供的网络来完成自己的需求。
下面是从下往上表示TCP\IP模型的每个层次的作用:
**物理层:**负责光\电信号的传递方式、比如现在的以太网通用的网线。物理层的能力决定了最大传 输速率、传输距离、抗干扰性等、集线器就工作在物理层
**数据链路层:**负责设备之间的数据帧的传送和识别、例如网卡的驱动、帧同步(就是说从网线上 检测到什么信号作为新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差 错检验等工作。有以太网、令牌环网、无线LAN等标准。交换机工作在数据链路层
**网络层:**负责地址管理和路由选择、比如在IP协议中、通过IP地址来标识一台主机、并通过路由 表的方式规划出两台主机之间的数据传输的线路。路由器工作在网络层
**传输层:**负责两个主机之间的数据传输、如传输控制协议(TCP)、能够确保数据可靠的从源主机发 送到目标主机
**应用层:**负责应用程序间沟通、如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访 问协议(Telnet)等,我们的网络编程就主要是针对应用层的。

如上就是OIS模型和TCP\IP模型的对比
对于物理层、其对应的是硬件部分、所以我们会讨论的比较少。
三、深入理解协议
首先我们先引出下面几个问题,设备A和设备B之间可以进行跨网通信。
但是:
1、把数据在相邻的设备之间进行传递
2、目标主机和路径定位问题
3、如果出现了数据丢失咋办
4、使用数据的目的和如何处理收到的数据
前面我们学习操作系统、知道我们的操作系统是使用的C语言和一些汇编写的,然后我们的协议栈是在我们的操作系统内核中的,所以我们的协议栈也是使用的C语言写的。

我们先来看一个生活的例子。
现在网购已经是每个人的生活的一部分了,那么我们在网上买了一个手机,那么我们收到快递的时候,肯定是不止手机的,我们会收到一个盒子,然后这个盒子里面装了手机,这个盒子上会有一个快递单子,上面会写一些信息等。
那么实际上我们这些信息可以使用一个结构体来表示。
所以和我们的网络协议一样,可以使用一个结构体将一些信息进行包装。
那么我们的主机之间进行通信,比如我们的A设备给B设备传递一个结构体变量、这个结构体变量中有三个整型数据。
那么我们的设备B实际上从设备A上得到的信息不只有这个结构体变量,还会带有一些协议的信息,这个协议的信息我们称为协议报头。
对于这些协议报头的理解,是事先约定的,所以其知道如何对这些报头进行处理。
所以协议本质上是一个结构体。
四、网络传输基本流程
1、局域网通信(以太网)
首先我们先看局域网中的网络传输基本流程
先考虑一个问题:
两台主机在一个局域网中,是否可以直接通信?
可以明确的是可以。
局域网就好比我们的教室上课,老师在上面讲课我们都可以听到,当老师叫一个人起来回答问题的时候,就比如此时老师叫张三,那么我们大家都是可以听到的,但是只有张三会站起来,张三站起来了,这个就是反馈给老师,张三接收到了站起来这个信息。

如上,就是我们一个局域网的示意图,那么此时主机A要给主机E传递信息,然后其会有一个目标主机的信息,其就好比我们的名字。当主机E收到信息后,还会给主机A进行反馈。
其他的主机其实也是听到了这个信息的,但是如主机B所示,其会判断这个信息,发现其目标主机是主机E,那么就会将这个信息做丢弃处理。
所以也就验证了,我们上面提到的,数据的传递不单单会发送要传递的数据、还会将协议报文也进行发送。
那么我们的局域网中是如何找到主机E的呢?
其实我们的主机在出厂的时候都会存在一个mac地址,这个是用来唯一进行标识我们的主机的,这个地址理论上来说每个主机都是唯一的,一张网卡一个mac地址。
mac地址是一个由48个比特位组成的即6个字节。
在Windows中我们可以打开cdm,然后输入windows>ipconfig/all可以查看到我们自己电脑的mac地址。
所以这就将我们四个问题中的定位和路径问题解决了。
补充:
我们的局域网不仅是以太网、以太网只是其中一个品种、现在主流的还有一个令牌环网。
那么其有啥区别呢?
首先、我们考虑一个问题,如果同一个时刻、有两个以上的主机进行数据的发送、那么在整个局域网中,数据是否会混淆?
就好比我们在教室中上课、老师在上面讲课、有人也在讲话、那么我们就会听不清楚老师讲了啥,那么这种情况在我们以太网中叫:碰撞域。
任何主机都会进行碰撞检测,当出现了碰撞、那么碰撞的两个主机就会暂停信息的发送,此时其它的主机就可以趁着发送信息了。
所以局域网通信就是基于碰撞检测和碰撞避免的不断充实的过程。
通过碰撞检测和碰撞避免算法,也就保证了局域网中一个时间只能存在一个主机发送信息。
而且对于发生了碰撞的主机、其数据也不会被丢弃、是会返回给发送方的。
所以前面提到的四个问题、前三个已经解决了。
补充:
上面是我们局域网中的以太网的、我们的局域网其实是有非常多种类型的,其中目前主流就是以太网和令牌环网。
我们的局域网、我们从操作系统角度来看,其实就是我们的共享资源、而且其要保证任何时刻只能有一个发送方。所以其是一个临界资源,那么我们对其访问、就通过锁来进行管理、谁拿到锁谁就可以使用访问。
那么我们的令牌环网就类似、令牌就是我们的锁,我们的主机谁拿到这个令牌,谁就有发送信息的权力。
2、发送信息和接收信息
首先、我们明确一点、我们的主机为啥要求发送信息?
这是因为我们用户要求的。
所以我们的数据从用户通过发送方用户层->发送方传输层->发送方网络层->发送方数据链路层>发送方网卡->接收方网卡......
如下 :

实际上、上层给下层传递信息的时候、都会对其进行封装,其往下层传递的信息还会带上自己的报头。
如下:
总的来说在发送方、其是对数据进行封装、在接收方是进行解包。
实际上我们将封装的过程理解一遍:
我们竖着来看:

如上就是发送方的时候,然后到我们的接收方,就从栈顶进行数据的获取,先是数据链路层,然后是网络层,然后是传输层,然后是应用层,然后就到我们的用户,就只有数据了。
所以数据封装和解包实际是入栈和出栈的过程。
在局域网中,每个主机都会得到发送方的信息,然后在一开始得到的时候,在对数据链路层的报头进行解析,就可以判断这个信息不是我要接收的。
上层会得到下一层给的信息进行处理。

报头部分就是对应协议层的结构体字段。
除了报头,剩下的 就是有效载荷。
所以报文=报头+有效载荷
补充:
下面我们明确一下在各个层之间,其都是认为和其通信的也是同类型的层。
每个层之间传输的信息名称各不相同:
1、应用层之间:请求与应答
2、传输层之间:数据段
3、网络层之间:数据报
4、数据链路层之间:数据帧
五、网络传输的问题
1、封装问题
上面我们讲到,封装,就是一个入栈的过程,那么实际上其入栈的数据就是该层的结构体数据。
所以我们也说协议本质上是结构体类型。
报头就是一个结构体变量。
然后我们的整个封装过程,实际上是有一个缓冲区,其数据结构上,类似我们的栈,然后栈的大小在协议上已经是约定好了的。这个缓冲区我们称为报文。封装的本质就是在这个报文的头部头插我们的报头信息,实际上就是拷贝结构体变量。
然后我们的报头信息分为两种:
1、定长的报头
2、不定长的
但是其不影响我们的报文栈结构的大小的设定。
报头一般就会包含如下信息:
报头有多长,有效载荷有多长,上层协议是什么等信息

2、解包和分用问题
接收方收到报文,前面简单提到了会对其对应层的报头去除掉,然后将该层对应的有效载荷传输给上层。
下面我们提出两个问题:
1、报头和有效载荷分离问题
2、解决自己将有效载荷向上给那个协议传输的问题
首先我们看第一个问题:
在对报文进行封装的时候,对应层的报头都会有当前层的报头长度,有效载荷的长度的信息传入了,那么接收方的也会得到这些信息,然后进行解包。
第二个问题:
报头中也会将其对应的上层协议进行传递,所以也可以完成分用的工作。
如下图所示:

其就和一个树形结构类似,会有一个唯一的入口,这个入口就是数据链路层。
六、跨网络传输问题
1、初始IP地址
IP地址是用来标识公网中的唯一地址。
IP地址分为IPV4和IPV6。
下面是以IPV4为讲解的。
对于IPV4,其是一个4字节,32位的整数。
那么其和我们前面提到的mac地址有何不同呢?
前面我们提到的mac地址是在局域网中的标识主机的唯一地址,但是我们现在是来到了广域网中,广域网是有多个局域网组成的。
就好比如我们的学号,我们在学校中,可以通过学号来唯一标识你,但是出了学校,我们再使用学号的话,就没人认识了,所以在社会上我们又有身份证号。
总的来说,mac地址是用于我们在一个局域网中,对目标主机进行定位和路径确定的。IP地址是用于在广域网中进行路径定位和目标定位的。
2、跨网络通信流程
下图是一个小的广域网通信的示意图:

可以看到在跨网络通信中,需要借助路由器的帮助。
而且我们发现上图的局域网协议是不一样的,
首先在局域网内,所有的主机都可以收到发出的信息,但是其根据mac地址,确定其不是接收方,所以会丢弃掉这个信息,然后呢一个局域网中的IP地址,前三个字节是一样的,根据这个就可以判断目标主机是不在同一个局域网的,那么就会将其给路由器接收。
如下图所示:

所以对于网络层一下,对于不同的生产厂家,其各自使用其各自的方式,我们的网络层对其进行封装,网络层往上、大家所遵守的协议都是一样的。
路由器是实现IP网络的最重要的硬件设备。
IP网络层存在的意义:
提供网络虚拟层、让世界上所有的网络都是IP网络,屏蔽最底层网络的差异