分层简介与分层的必要性

计算机网络是一个非常复杂的系统,早在最初的ArpaNet设计时就提出了分层的设计理念。
“分层”可将庞大而复杂的问题,转化为若干较小的局部问题,而这些较小的局部问题就比较易于研究和处理。

接下来,以五层模型为例,逐步讲解每个层。

两台计算机(物理层)

image.png
两台计算机通过一条网线连接起来,我们需要考虑以下问题:

  • 传输媒体,例如常见的双绞线网线
  • 在计算机上采用怎样的物理接口,例如RJ45以太网接口
  • 使用怎样的信号,例如方波信号中低电平表示0,高电平表示1

image.pngimage.pngimage.png

可以将这些问题划分到物理层

  • 严格来说,传输媒体不属于物理层,它并不包含在体系结构之中
  • 计算机网络中传输的信号,并不是我们举例的方波信号

总线型网络(数据链路层)

主机ABCDE通过总线互连,构成了一个总线型网络。
image.png

假设,我们已经解决了物理层的问题

  • 也就是说,主机间可以发送信号来传输比特流(0或1)了

有了物理层,我们还需要解决什么问题?

如何标识网络中的各主机

比如,主机A要给主机C发送数据

  • 但是,表示数据的信号会通过总线传播到总线上的每一个主机。
  • 那么问题来了,主机C如何知道该数据是发送给自己的,自己要接受?而主机B、D、E又如何知道该数据并不是发送给自己的,自己应该拒绝呢?

这就很自然地引出了如何标识网络中各主机的问题,也就是主机编址问题。

  • 网卡上的MAC地址,其实它就是主机在网络中的地址

主机在发送数据时,应该给数据附加上目的地址。当其他主机收到后,根据目的地址和自身地址,来决定是否接受数据。

如何从比特流中区分出地址和数据

这就又引出了另一个问题:目的主机如何从信号所表示的一连串比特流中区分出地址和数据。

  • 也就是要解决分组的封装格式的问题

如何协调各主机争用总线

另外,对于总线型的网络,还会出现下面这种典型的问题。
如何协调各主机争用总线?

  • 某个时刻总线是空闲的(没有主机使用总线来发送数据)。片刻之后,主机B和D同时向总线发送数据,这必然会造成信号碰撞

总结

总线型的网络早已淘汰,现在常用的是使用以太网交换机将多态主机互连形成的交换式以太网。

  • 那么,以太网交换机是如何实现的呢?
  • 我们将这些问题,全部划归到数据链路层

image.png

至此,我们可以实现分组在一个网络上传输了。

小型互联网(网络层)

  • 可以发现,只要解决了物理层和数据链路层各自面临的问题,我们就可以实现分组在一个网络上传输了
  • 但是,我们每天都会使用的因特网,是由非常多的网络和路由器(多个网络)互连起来的,仅解决物理层、数据链路层的问题,还是不能正常工作。

例子:一个由3个路由器、4个网络互连起来的小型互联网,可以把它看成因特网中很小的一部分
image.png

如何标识各网络以及网络中各主机

在之前的例子中,仅有一个网络,所以我们不需要对网络进行标识。而在本例中,有多个网络,很显然,我们面临着如何标识各网络以及网络中各主机的问题

  • 换句话说,也就是网络和主机共同编址的问题

例如,IP地址

  • IP地址的前三个十进制数用来标识网络,第四个十进制数用来标识主机

image.png

  • 在本例中,网络N1的网络号为192.168.1。故该网络上的笔记本、服务器,以及路由器接口的IP地址的前三个数都应该是192.168.1。而第四个十进制数1、2、254用来标识它们自己
  • 同理,网络N2也是如此

路由器如何转发分组,如何进行路由选择

源主机与目的主机之间的传输路径往往不止一条。分组从源主机到目的主机可走不同的路径。这就引出了,路由器如何转发分组的问题,以及如何选择路由选择的问题。

总结

我们将这些问题都划归到网络层

至此,如果解决了物理层、数据链路层,以及网络层各自的问题,则可以实现分组在网络间传输的问题

运输层

虽然有了物理层、数据链路层,以及网络层之后,我们可以实现分组在网络间传输的问题。
但是对于计算机网络应用而言,这仍然不够。

如何解决进程之间基于网络的通信问题

  1. 一台主机中运行着两个与网络通信相关的应用进程。一个是浏览器进程、一个是QQ进程
  2. 一台服务器中运行着与网络通信相关的服务器进程
  3. 某个时刻,主机收到了来自服务器的分组。那么这些分组是交给浏览器进程处理呢?还是应该交给QQ进程处理?

![Z(N47X$D$I9@19(LL59HH8.png
这就引出了,我们如何标识与网络通信相关的应用进程,进而解决进程之间基于网络的通信问题。

如果出现传输错误,如何处理

如果某个分组在传输过程中出现了误码,或者丢包(由于路由器繁忙,导致路由器丢弃分组),应该如何处理?
某个分组在传输过程中出现了误码,丢包(由于路由器繁忙,导致路由器丢弃分组)

总结

我们将这些问题全部划归到运输层。

至此,如果我们解决了物理层、数据链路层、网络层,以及运输层各自的问题,则可以实现进程之间基于网络的通信

应用层

在上述四层的基础上,只需制定各种应用层的协议,并按协议标准编写相应的应用程序,通过应用进程间的交互来完成特定的网络应用。
image.png
例如

  • 支持万维网应用的HTTP协议
  • 支持电子邮件的SMTP协议
  • 支持文件传送的FTP协议

我们将这些问题全部划归到应用层。

总结

image.png
总结出了这些问题,相信你愿意把这些问题分模块来解决,而不是编程在一个模块中。

举例

这节课老师讲的很好,可以多看几遍:《计算机网络体系结构分层思想举例》

举例:主机中的浏览器访问Web服务器

  1. 当输入网址后,主机会向Web服务器发送请求
  2. Web服务器收到请求之后,会发回相应的响应
  3. 主机的浏览器收到响应后,将其解析为具体的网页内容,显示出来

实际上是主机中的浏览器应用进程 与 Web服务器中的Web服务器应用进程 之间基于网络的通信。
image.png

浏览器发送请求

第一步:主机应用层按HTTP协议的规定,构建一个HTTP请求报文,然后将HTTP请求报文交付给运输层处理
image.png

第二步:主机运输层给HTTP请求报文添加一个TCP首部,使之成为TCP报文段,然后交给网络层处理

  • 该首部的作用,主要是为了区分应用进程,以及实现可靠传输

image.png

第三步:网络层给TCP报文段添加一个IP首部,使之成为IP数据报,然后交付给数据链路层处理

  • 该首部的作用主要是为了使IP数据报,可以在互联网上传输,也就是被路由器转发

%FF}D9A(U~BHE}4G4XM~@@2.png

第四步:数据链路层给IP数据报添加一个首部和一个尾部,使之成为帧,然后交付给物理层

  • 首部的作用是为了让帧能够在一段链路上或一个网络上传输,能够被相应的目的主机接收。
  • 尾部的作用是为了让目的主机检查,所接收到的帧是否有误码
  • 假设网络N1是以太网,首部尾部格式如下

image.png

第五步:物理层将帧看作成比特流,由于网络N1是以太网,因此物理层还会给该比特流前面添加前导码。然后物理层将添加有前导码的比特流变换成相应的信号,发送到传输媒体

  • 前导码作用是为了让目的主机做好接收帧的准备

RBOLR4RA(VY@U43W2KR9EVU.png

路由器将请求存储转发

信号通过传输媒体到达路由器。

  1. 路由器物理层将信号变换为比特流;然后去掉前导码;最后交给数据链路层,这实际上交付的是帧
  2. 数据链路层将帧的首部和尾部去掉后,将其交付给网络层,这实际上交付的是IP数据报
  3. 网络层解析IP数据报的首部,从中提取出目的网络地址,然后查找自身的路由表,确定转发端口,以便进行转发。然后打包成一个新的IP数据报,并交给数据链路层
  4. 数据链路层给IP数据报添加一个首部、一个尾部,使之成为帧。数据链路层将帧交付给物理层
  5. 物理层将帧看做是比特流,由于网络N2是以太网,因此物理层还会给该比特流前面添加前导码。将添加了前导码的比特流变换成相应的信号发送到传输媒体

image.png <=> image.png<=> image.png

服务器接收

信号通过传输媒体到达Web服务器

  1. 物理层将信号变换为比特流;然后去掉前导码;最后交给数据链路层,这实际上交付的是帧
  2. 数据链路层将帧的首部和尾部去掉后,将其交付给网络层,这实际上交付的是IP数据报
  3. 网络层将IP数据包的首部去掉后,将其交付给运输层,这实际上交付的是TCP报文段
  4. 运输层将TCP报文段的首部去掉后,将其交付给应用层,这实际上交付的是HTTP请求报文
  5. 应用层对HTTP请求报文进行解析,然后给主机发回HTTP响应报文

image.png => image.png=> image.png => image.png=> image.png

服务器响应

与之前的类似,服务器响应的内容也经历相同的过程

  1. HTTP响应报文需要在Web服务器层层封装,然后通过物理层变成相应的信号
  2. 再通过传输媒体传输到路由器,路由器存储转发该响应报文给主机
  3. 主机通过物理层将接收到的信号转换为比特流,之后通过逐层解封,最终取出HTTP响应报文