1.7.2、计算机网络体系结构分层的必要性
-
计 算 机 网 络 是 个 非 常 复 杂 的 系 统 \color{red}计算机网络是个非常复杂的系统 计算机网络是个非常复杂的系统。早在最初的ARPANET设计时就提出了分层的设计理念。
-
" 分 层 \color{red}分层 分层"可将庞大而复杂的问题,转化为若干较小的局部问题,而这些较小的局部问题就比较易于研究和处理。
-
下面,我们按照由简单到复杂的顺序,来看看实现计算机网络要面临哪些主要的问题,以及如何将这些问题划分到相应的层次,层层处理。
1.7.2.1、物理层问题
1.采用怎样的传输媒体(介质)
- 常见的双绞线网线
2. 采用怎样的物理接口
-
例如,RJ45以太网接口
3. 使用怎样的信号表示比特0和1
-
例如,这样的方波信号。低电平表示
0
,高电平表示1
说明
- 严格来说,传输媒体并不属于物理层,它并不包含在体系结构之中
- 计算机网络中传输的信号,并不是我们举例的方波信号(这里只是容易理解)
1.7.2.2、数据链路层问题
使用的计算机网络,一般都有多台主机构成。
例如:主机A
,B
,C
,D
,E
通过总线互连,构成了一个总线型网络(早已淘汰
)
假设已经解决的物理层的问题(主机间可以发送信号来传输比特0
或1
了)
若主机A
要给主机C
发送数据。但是,表示数据的信号会通过总线传播到总线上的每一个主机。
那么主机C
如何知道该数据是发送给自己的,自己要接受?
而主机B,D,E又如何知道该数据并不是发送给自己的,自己应该如何拒绝呢?
-
如何标识网络中的各主机(
主机编制问题
,例如MAC
地址)- 主机在发送数据时,应该给数据附加上目的地址。
- 在其他主机收到后,根据目的地址和自身地址,来决定是否接受数据
-
如何从信号所表示的一连串比特流中区分出地址和数据
- 也就是需要解决
分组的封装格式问题
- 也就是需要解决
-
如何协调各主机争用总线
-
例如,某个时刻总线是空闲的,也就是没有主机使用总线来发送数据。
片刻之后,主机
B
和D
同时向总线发送数据,这必然会造成信号碰撞
-
现在常用的是使用以太网交换机
将多台主机互连形成的交换式以太网
- 那么以太网交换机是如何实现的呢?
1.7.2.3、网络层问题
我们发现,只要解决了物理层和数据链路层各自所面临的问题,我们就可以实现分组在一个网络上传输了。
但是
- 我们每天都在使用的
因特网
是由非常多的网络和路由器互连
起来的 - 仅解决物理层和数据链路层的问题还是不能正常工作
例如:一个由3个路由器。4个网络互连起来的小型互连网
。(因特网中的很小一部分)
很显然。我们面临着如何标识各网络以及网络中各主机的问题。
- 如何标识各网络以及网络中的各主机(网络和主机
共同编址
的问题,例如IP
地址)- 例如:网络
N1
中各设备的IP
地址。- 该类
IP
地址的前三个十进制数用来表示网络,第四个十进制数用来表示主机(C类IP
地址) - 在本例中,网络
N1
的网络号为192,168,1 - 该网络上的笔记本电脑,服务器,以及路由器接口
IP
地址的前三个数应该都是192,168,1(因为它们都在网络N1
上)。- 而第四个十进制数为1,2,254,各不相同,用来表示它们自己
- 该类
- 同理网络
N2
中各设备的IP
地址
- 例如:网络
-
路由器如何转发分组,如何进行路由选择
-
源主机与目的主机之间的传输路径往往不止一条
-
分组从源主机到目地主机可走不同的路径地址
-
1.7.2.4、运输层问题
若我们解决了物理层、数据链路层及网络层各自的问题,则可以实现分组网络间传输的间题。
但是
- 对于计算机网络应用而言,这仍然不够
例如:假设这台主机中运行着两个与网络通信相关的应用进程(QQ进程,游览器进程)
这台服务器运行着与网络通信相关的服务器进程。
- 如何解决进程之间基于网络的通信问题
- 某个时刻。主机收到了来自服务器的分组,那么这些
分组
应应该交给览器进程处理呢。还是应该交给回Q进程处理?
- 某个时刻。主机收到了来自服务器的分组,那么这些
- 出现传输错误时,如何处理
- 如果某个分组在传输过程中出现了
误码
。 - 或者由路由器繁忙。导致路由器丢弃分组。
- 如果某个分组在传输过程中出现了
1.7.2.5、应用层问题
若以上都解决了,则可以实现进程之间基于网络的通信
在此基础上,只需制定各种应用层协议
- 通过应用进程间的交互来完成特定的网络应用
- 支持万维网应用的
HTTP
协议 - 支持电子邮件的
SMTP
协议 - 支持文件传送的
FTP
协议
- 支持万维网应用的
1.7.2.6、统一解决
我们将实现讨算机网络就需要解泱的各种主要问题,分别归到了物理层、数据链路层、网络层运输层和应用层。
进而构成了五层协议体系的原理体系结构。
作为一名程序员,将这些问题将它们划分到不同的模块中,逐模块编程实现