这是重点和难点,抽象概念比较多,学习的时候要多思考。
1.5.1 常见的计算机网络体系结构
为了使不同体系结构的计算机网络能够互连,国际组织1977年成立专门机构研究该问题,不久他们就研究出一个使所有计算机在世界范围内互连成网的框架,也就是著名的“开放系统互连参考模型”,简称OSI。
20世纪90年代初期,虽然标准已经注册出来了,但是因特网已经抢先在全世界覆盖了相当大的范围,因特网从1983年开始使用TCP/IP协议族,并逐步演变成TCP/IP参考模型
在过去,制订标准的人往往是专家学者。但现在,许多公司都纷纷挤进各种各样的标准化组织,使得技术标准有着浓厚的商业气息。
OSI标准失败的原因可归纳为:
1)OSI的专家们缺乏实战经验,完成OSI标准时没有商用驱动力
2)OSI本身体系结构复杂,实现难度大,效率低
3)OSI研发周期长,因而使得其他那些按照他标准生产的设备无法进入市场
4)OSI层次划分不合理,有些功能在多个体系重复出现
因为IP的意思是网际,所以TCP/IP的网络层叫网际层。
我们自己的电脑带有TCP/IP协议族,路由器也带有TCP/IP协议族,只不过路由器只包含网络接口层和网际层。
TCP/IP的网络接口层并没有强制规定要有什么内容,这样做的目的是可以互连全世界各种不同的网络接口。比如有线的以太网接口,无线局域网的WIFI接口。
因此,本质上TCP/IP协议只有上面的三层。
- IP协议是TCP/IP中的网际层的核心协议。
- TCP和UDP是TCP/IP体系结构运输层的两个重要的协议
- 应用层包含了大量的应用层协议,例如HTTP,SMTP,DNS,RTP等
IP协议可以将不同的网络接口进行互连,并向其上的TCP协议和UDP协议提供网络互连服务
而TCP协议在享受IP协议提供的网络互联服务的基础上,可向应用层的相应协议提供可靠传输的服务。UDP协议在享受IP协议提供的网络互联服务的基础上,可向应用层的相应协议提供不可靠传输的服务。
IP协议作为TCP/IP中的核心协议,一方面负责互连不同的网络接口。另一方面为各种网络应用提供服务
TCP/IP体系中有大量的协议,IP协议和TCP协议是其中两个非常重要的协议,因此,用TCP/IP这两个协议来表示整个协议大家族。在嵌入式开发领域,TCP/IP协议族常称为TCP/IP协议栈。这是因为TCP/IP协议体系的分层结构,与数据结构中的栈,在图形画法上是类似的。
因为TCP/IP协议的网络接口层是没有实现的,OSI的又太多了,所以我们学习的时候,采用一种折中的思想。我们学习5层-原理体系结构。
1.5.2 分层的必要性
计算机网络是个非常复杂的系统。早在最初的APPANET设计时就提出了分层的设计概念
分层可以将庞大复杂的问题,转换成若干较小的局部问题,而这些较小的局部问题就比较易于研究和处理
下面我们按照简单到复杂的顺序,来看看实现计算机网络要面临哪些主要的问题,以及如何将这些问题划分到对应的层次,层层处理。
先来看最简单的两台:
注意:
- 传输媒体一般不认为是物理层的。
- 信号传输的时候并不是我们画的这种方波01信号,这个只是方便大家学习。
实用的计算机网络,一般都由多台主机构成。
假设我们已经解决了物理层的问题,也就是说主机间可以发送信号来传输比特0或1了。
我们来看看在这样一个总线型的网络上还需要解决什么问题。
A发送数据给C,但是表示数据的信号会通过总线传播到总线的每一个主机。
那么问题就来了,主机C如何知道是发给自己的,自己要接受?而主机B.D.E又如何知道该数据并不是发送给自己的,自己应该拒绝呢?
这就很自然的引出了如何标识网络中个主机的问题。也就是主机编址问题。大家可能听说过网卡上的MAC地址,其实他就是主机在网络中的地址。
主机在发送数据时,应该给数据附加上目的地址。当其他主机收到后,看一下目的地址和自己的地址是否匹配,来决定是否接受数据。这就又引出了一个问题:目的主机如何从所表示的一连串比特流中区分出地址和数据?也就是需要解决分组的封装格式的问题。
另外对于总线型的网络,还会出现下面这种典型的问题:某个时刻总线是空闲的,也就是没有主机使用总线来发送数据,一会,主机B和D同时向总线发送数据。这必然会造成信号碰撞。
因此,如何协调各主机争用主线,也是必须要解决的问题。
需要说明的是,这种总线型的早以淘汰,现在使用的是以太网交换机将多台主机互连形成的交换式以太网。
那么以太网交换机又是如何实现的呢?
我们将这些问题全部划分到数据链路层。
到目前为止大家发现,只要解决了物理层和数据链路层各自所面临的问题,我们就可以实现分组在一个网络上实现传输了。但是我们每天都会使用的因特网是由非常多的网络和路由器互连起来的,仅解决物理层和数据链路层的问题,还是不能正常工作。
我们来看这个例子:
这是一个由3个路由器,4个网络组合起来的小型互联网。我们可以把它看做因特网中很小的一部分,在之前的例子中,仅有一个网咯,我们不需要对网络进行标识,而在本例中,有多个网络。很显然,我们面临着如何标识各网络以及网络中各主机的问题?
换句话说,也就是网络和主机共同编址的问题。相信同学们一定听过IP地址,例如这是网络N1中各设备的网络地址
该类IP地址的前三个10进制数用来标识网络,第四个10进制数用来标识主机。
在本例中,网络N1的网络号为192,168 ,1。该网络上的笔记本,主机,路由器的IP地址的前三个数应该都是192,168,1。第四个十进制数分别为1,2,254。用来标识他们自己。
我们再来看一个问题,源主机和目的主机之间的路径不只一条,分组可走不同的路劲到达目的主机。这样就引出了路由器如何转发分组的问题?以及如何进行路由选择的问题?
我们将这些问题全部划分到网络层
到目前为止,我们解决了物理层,数据链路层,网络层各自的问题。则可以实现分组在网络间传输的问题。但是对于计算机网络应用而言这仍然不够。
比如,假设这台主机中运行着两个与网络通信相关的应用进程,浏览器进程和qq进程
另外一台服务器运行着与网络通信相关的服务器进程。
某个时刻,主机收到来自服务器的分组,那么这些分组应该交给浏览器进程处理呢?还是交给QQ进程处理呢?
这就引出了我们如何标识与网络通信相关的应用进程问题?进而解决进程之间基于网络的通信问题。
另外,如果某个分组在传输过程中出现了误码,或者由于路由器繁忙导致路由器丢失分组,换句话说:若出现传输错误,应该如何处理?
我们将这些问题全部划分到运输层。
解决了上面的问题的话我们就可以实现进程之间基于网络的通信。
在此基础上,只需制定各种应用层协议,并按照协议标准编写相应的应用程序。通过应用进程间的交互来完成特定的网络应用。例如,支持万维网应用的HTTP协议,支持电子邮件的SMTP协议,支持文件传送的FTP协议等。我们将这些问题全部划分到应用层。
总结:
1.5.3 分层思想举例
假设网络拓扑如下,主机属于网络N1,服务器属于网络N2,N1和N2通过路由器互连。
我们使用主机中的浏览器来访问web服务器,当输入网址后,主机会向web服务器发送请求。web服务器收到请求后,会发回相应的响应
主机的浏览器收到相应后,将其解析为具体的网页内容显示出来。
主机和web服务器之间基于网络的通信,实际上是主机中的浏览器应用进程与web服务器中的web服务器应用进程之间基于网络的通信。
那么体系结构中的各层在体系结构中起到什么样的作用呢?
应用层按照HTTP请求协议的规定,构建一个HTTP请求报文,内容如下
应用层将HTTP请求交付给运输层处理,运输层给HTTP报文添加一个TCP首部,使之成为TCP报文段。下图为TCP报文段的首部格式,该首部的作用主要是为了区分应用进程,以及实现可靠传输。
运输层将TCP报文段交付给网络层处理,网络层给TCP报文段添加一个IP首部,使之成为IP数据报,IP数据报的首部格式如下,该首部的作用是使IP数据报可以在互联网上传输。也就是被路由器转发。
网络层将IP数据报交付给数据链路层处理,数据链路层给IP数据报添加一个首部和一个尾部使之成为帧
假设网络N1是以太网,下面为以太网帧首部的格式。
该首部的作用主要是为了能够让帧能够在一段链路上,或一个网络上传输,能够被相应的目的主机接收。
下面为以太网帧尾部的格式
其作用是为了让目的主机检查,所接收到的帧是否有误码。
数据链路层将帧交付给物理层,物理层将帧看做是比特流。
由于网络N1是以太网,因此物理层还会给比特流前面添加前导码。
前导码的内容如下
其作用是让目的主机做好接收帧的准备
物理层将添加有前导码的比特流,变换成相应的信号发送到传输媒体,
我们来看路由器的处理过程。路由器的物理层将信号变换为比特流,
然后去掉前导码后,将其交付给数据链路层
这实际上交付的是帧,数据链路层将帧的首部和尾部去掉后,将其交付给网络层。这实际上交付的是IP数据报。
网络层解析IP数据报的首部,从中提取出目的网络地址,然后查找自身的路由表,确定转发端口,以便进行转发。
网络层将IP数据报交付给数据链路层,数据链路层给IP数据报添加一个首部和一个尾部使之称为帧
数据链路层将帧交付给物理层,物理层将帧看做是比特流,由于网络N2是以太网,因此物理层还会给该比特流前面添加前导码,
物理层将添加有前导码的比特流,变换成相应的信号发送到传输媒体。
信号通过传输媒体到达web服务器。我们来看web服务器的处理过程。
物理层将信号变换为比特流,去掉前导码,交给数据链路层。这实际上交付的是帧
数据链路层将帧的首部和尾部去掉后,将其交付给网络层,这实际上交付的是IP数据报
网络层将IP数据报去掉IP首部之后,将其交付给运输层,这实际上交付的是TCP报文段
运输层将TCP报文段的首部去掉之后,将其交付给应用层,这实际上交付的是HTTP请求报文。应用层对HTTP请求报文进行解析,然后给主机发回HTTP响应报文,与之前的过程类似,HTTP响应报文需要在web服务器层层封装,然后通过物理层变换成相应的信号,再通过传输媒体传输到路由器。路由器转发该响应报文给主机,主机通过物理层将收到的信号转换为比特流,之后通过逐层解封,最终取出HTTP响应报文
1.5.4 专用术语
1.5.4.1实体:
任何可发送或接收信息的硬件和软件进程,下图中的字母
对等实体:通信双方相同层次中的实体
1.5.4.2协议:
逻辑通信的规则的集合,这种通信并不存在,只是我们假设出来的。目的在于我们可以专注研究一层而不用考虑其他层。
例如当我们在研究运输层时我们可以看成运输层的对等实体在进行逻辑通信 ,而不用考虑其他层。
计算机网络协议有三个要素:
- 语法就是定义这些小格子的长度和先后顺序。换句话说:语法定义了所交换信息由哪些字段以及何种顺序构成。格式不需要记住,能看懂就行。
- 语义:定义收发双方要完成的操作。主机要访问服务器,会构建一个HTTP的GET请求报文,然后将其发送给web服务器。web服务器收到该报文并进行解析。知道这是一个HTTP的GET请求报文。于是就在自身内部查找所请求的内容。并将找到的内容封装到一个HTTP响应报文中发回该主机。主机收到HTTP响应报文之后对其进行解析,取出所请求的内容并由浏览器解析显示。这个例子就可以体现出通信双方收到分组后完成怎样的操作。这是HTTP协议的语义所规定的。
- 同步:定义通信双方的时序关系。比如TCP三次握手过程可以看出两个主机之间的时序和状态转换。
只有双方建立连接之后才可以进行数据传输。这个例子充分体现了同步。
1.5.4.3 服务:
在协议的控制下,两个对等实体间的逻辑通信使得本层能够向上一层提供服务。
协议是水平的,而服务是垂直的。
特别注意的是:实体看得见下层所提供的服务,但并不知道该服务的具体协议。我们看的见手机为我们提供的服务,闹钟啊,打电话啊,但是我们不知道具体实现。
1.5.4.4 服务访问点
在同一系统相邻两层的实体交换信息的逻辑接口,用于区分不同的服务类型。
例如:数据链路层的服务访问点为帧的“类型”字段
网络层的服务访问点为IP数据报首部中的“协议字段”
运输层的服务访问点为“端口号”
1.5.4.5 服务原语
上层使用下层所提供的服务必须通过与下层交换一些命令,这些命令称为服务原语。
1.5.4.6 协议数据单元
对等层次之间传送的数据包称为该层的协议数据单元。
物理层的称为 :比特流
数据链路层的称为: 帧
网络层的称为: IP数据报或分组
服务数据单元SDU :同一系统内,层与层之间交换的数据包称为服务数据单元