-> 第二章–应用层
第一章 计算机网络和因特网(Computer Networks and Internet)
首先在这里再次声明一下,本系列博客内容参考北京交通大学软件学院计算机网络课程的教学资料,参考教材为英文教材:《Computer Networking- A Top-Down Approach》。编者英文水平有限,如有部分翻译不准确的地方,还请大家帮忙指正。本系列博客仅供计算机爱好者学习交流使用,未经允许禁止任何形式二改二传及任何个人或商业用途。
第一章是一个介绍性章节,将会给大家一个全部内容的大纲和框架。
文章目录
- 第一章 计算机网络和因特网(Computer Networks and Internet)
- 1.1 什么是因特网
-
- 1.1.1 "Nuts-and-Bolts"(描述什么是网络)
- 1.1.2 "Service" (描述什么是网络)
- 1.1.3 What is a protocol (什么是协议)
- 1.2 网络边缘(Network Edge)
-
- 1.2.1 接入网
- 1.2.2 物理介质
- 1.3 网络核心
-
- 1.3.1 分组交换
-
- 存储转发传输(store-and-forward transmission)
- 排队时延和分组丢失
- 1.3.2 电路交换(curcuit switching)
-
- 频分复用--FDM
- 时分复用--TDM
- 分组交换与电路交换的对比(packet switching VS curcuit switching)
- 1.3.3 网络的网络(network of networks)
- 1.4 分组交换网中的时延、丢包和吞吐量
-
- 1.4.1 分组交换中的延时
-
- 处理时延
- 排队时延
- 传输时延(发射时延)
- 传播时延
- 1.4.2 排队时延和丢包
- 1.4.3 端到端时延
-
- 利用Tranceroute程序加深认识
- 1.4.4 计算机网络中的吞吐量
- 1.5 协议层次及其服务模型
-
- 1.5.1 协议分层
- 1.5.2 封装(encapsulation)
1.1 什么是因特网
什么是因特网?有许多方式回答这个问题。首先,我们可以用"nuts and bolts"模型来描述因特网,即就是最基本的软件和硬件组成了因特网。其次,我们可以根据提供不同的功能的网络基础设施来描述因特网。
那因特网都包含哪些东西呢?
类比于我们的社会:
社会中 | 网络中 |
---|---|
使用网络的人,实体 | 网络组件 |
社会服务 | 网络服务 |
法律、规则 | 网络协议、标准 |
首先我们由"nuts-and-bolts"模型开始介绍什么是网络
1.1.1 “Nuts-and-Bolts”(描述什么是网络)
因特网是一个由数以百亿的全世界相互连接的计算机所构成的计算机网络。不久之前,这些计算机基本上是传统PC,Linux工作站,还有所谓的服务器组成的。然而,日渐增多的非传统因特网终端例如笔记本电脑,智能手机,平板,联网电视等等设备的接入,使得“计算机网络”这个名词逐渐变得过时了。这些设备在专业术语中叫做主机(host)或者终端(end systems)
这些终端以通信链路(communication link)和分组交换机(packet switching)连接在一起进行通信。
这些链接的 传输速率(transmission rate) 是以比特/秒的单位来计算的。这里的传输速率就是我们熟知的 带宽(bandwidth) 。发送终端会把需要发送的数据切开(segment),并给每一个部分加上一个首字节(header bytes),这就是我们所说的 数据包(packet) 。数据包发送出去以后,需要经过 路由器(router) 或 链路层交换器(link-layer switch) 发送到数据包所需要发送的最终目的地。
端系统通过因特网服务提供商(Internet Service Provider, ISP) 接入因特网。
端系统、分组交换机和其他因特网部件都要运行一系列协议(Protocol),这些协议控制因特网中信息的接收和发送
1.1.2 “Service” (描述什么是网络)
前面已经讨论了因特网的组件,这边我们用另外一个视角来看看什么是因特网:为应用程序提供服务的基础设施。
首先这些应用程序被称之为分布式应用程序(distributed application) (这些应用程序涉及多个相互交换数据的端系统)
与因特网相连的端系统提供了一个接口(socket interface) ,该接口规定了运行在一个端系统上的程序请求因特网基础设施向运行在另一个端系统上的特定目的程序交付数据的方式。
我们做一个类比,假定A向B发送一封信,A肯定不能仅仅写了信的内容就把它丢到窗外,A需要将信放入信封中,信封的中间写上B的名字,地址,邮编,贴上邮票,然后投入邮箱,这样邮政系统才能开始运作将信件送给B。从中我们可以看出,邮政系统有他的一套规则,叫“邮政服务接口”。那么因特网中的接口也是一样的。
1.1.3 What is a protocol (什么是协议)
同样我们做一个类比:
A向B开始通信,先向B说Hi,来请求开始交流
B回复A说Hi,表明B收到了A的请求,并同意开始交流
A问B问:“Got the time?”,向B请求当前时间这个信息资源
B回复A说:“2:00”,B收到该请求,并回复(发送)给A当前时间“2:00”类比到计算机网络中:
A->B:请求建立连接
B->A:收到请求,同意建立连接
A->B:请求资源******
B->A:收到请求,发送该资源
上述例子很好类比到计算机网络中,这里直接给出其定义:(我把英文原文也贴在这里供大家参考)
协议(protocol)定义了在两个或多个通信实体之间交换的报文的格式和顺序,以及报文发送和接收一条报文或其他事件所采取的动作
1.2 网络边缘(Network Edge)
我们更进一步的剖析网络,分为三个部分:
第一部分 | 网络边缘(network edge) | 应用程序和主机 |
第二部分 | 接入网,物理介质 | 有线和无线链接 |
第三部分 | 网络核心(network core) | 相互连接的路由器 |
回顾前一节中的术语,通常把与因特网相连接的计算机和其他设备称为端系统。由于他们位于因特网的边缘,所以才被称之为端系统。
1.2.1 接入网
接入网是指将端系统物理连接到其边缘路由器(edge router) 的网络。边缘路由器是端系统到任何其他远程端系统的路径上的第一台路由器
1.2.2 物理介质
设备发送数据时,通过跨越一种物理媒介(physical medium) 传播电磁波或光脉冲来发送。
1.3 网络核心
上图中红色部分,为网络核心部分
这里有一个最基本的问题:
数据时如何在这样的网络中传输的?
有两种方法:
- 分组交换(packet switching)
- 线路交换(circuit switching)
1.3.1 分组交换
在各个网络应用中,端系统彼此交换报文(message) 。报文能够包含协议设计者需要的任何东西。包括数据或者控制功能。为了从源端系统向目的端系统发送一个报文,源将长报文划分为较小的数据块,称之为分组(packet) 。在源和目的地之间,每个分组都通过通信链路和分组交换机(packet switch) 传送。
存储转发传输(store-and-forward transmission)
存储转发传输是指在交换机能够开始向输出链路传输该分组的第一个比特之前,必须接收到整个分组。
传输时延(transmission delay)
通过由N条速率均为R的链路组成的路径(中间会有N-1台路由器),从源到目的地发送一个分组。我们所看到的时延应该是:(这里忽略传播时延)
d e l a y = N L R delay=N\frac{L}{R} delay=NRL?
排队时延和分组丢失
每台分组交换机有多条链路与之相连。对于每条相连的链路,该分组交换机具有一个输出缓存(output buffer) 。如果到达该分组需要传输的某条链路,但是恰好该链路正在传输其他的分组,该分组必须要在缓存中等待。因此就产生了排队时延(queuing delay) 这个时延取决于拥塞程度。由于缓存空间的大小有限,如果该分组到达分组交换机时,缓存已经满了,那么这个分组将会丢失,也称为分组丢失(丢包)
1.3.2 电路交换(curcuit switching)
在分组交换中,传输的所用的线路是不会预留的。会话的报文按需使用这些资源。所以就不能避免排队接入通信线路。
而电路交换就不一样了,他会提前预留好所需传输的线路。
那么,如何进行预留呢?
有两种方式进行电路交换网络中的复用(预留)
- 频分复用(Frequency-Division Multiplexing, FDM)
- 时分复用(Time-Division Multiplexing, TDM)
频分复用–FDM
链路的频谱由跨越链路创建的所有连接共享,在连接期间链路为每条连接专用一个频段。该频段的宽度称为带宽(bandwidth) 。
时分复用–TDM
对于一条TDM链路,时间被划分为固定期间的帧(Frame) ,并且每个帧被划分为固定数量的间隙(slot) 。当网络连接时,网络在每个帧中为该连接指定一个间隙。这些间隙就像餐馆里的预留VIP包房一样,只供一个用户使用
分组交换与电路交换的对比(packet switching VS curcuit switching)
这里我们用一个例子来说明,多个用户共享一个1Mbps的链路,用户当使用网络的时候,以100kbps的速率传输,只有10%的时间是在使用网络进行传输的。
那么,如果使用电路交换:
由于线路是预留的,所以一共只能有
n u m O f U s e r s = 1 M b / s 100 k b / ( s ? u s e r ) = 10 numOfUsers = \frac{1Mb/s}{100kb/(s·user)} = 10 numOfUsers=100kb/(s?user)1Mb/s?=10
如果使用的是分组交换:
由于线路不会预留给用户,我只需要保证总传输速率不大于10Mb/s即可,当用户数量达到35个的时候,10个用户同时在线的概率为:
p = ( 10 35 ) ( 0.1 ) 10 ( 1 ? 0.1 ) 35 ? 10 ≈ 0.004 p=\binom{10}{35}(0.1)^{10}(1-0.1)^{35-10}\approx0.004 p=(3510?)(0.1)10(1?0.1)35?10≈0.004
1.3.3 网络的网络(network of networks)
粗略的分层:
第一层往往是比较大范围的ISP
第二层往往是小范围(区域性的)ISP
第三层就是最接近终端的ISP,区域更加小
最后就是终端了,所以,一个终端到另一个终端,可能需要经过很远的“路程”
1.4 分组交换网中的时延、丢包和吞吐量
理想情况下,我们希望因特网能够在任意两个端系统之间随心所欲地瞬间传输数据而没有任何丢失。然而这是一个几乎不可能实现的目标。
相反的是,计算机网络必定要限制在端系统之间的吞吐量(每秒能够传送的数据量),在端系统之间引入时延,而且实际上分组丢失也是很常见的
1.4.1 分组交换中的延时
数据从一台主机传输到另外一台主机的历程中,会经历几个不同类型的延时。大致为以下几种:
- 节点处理时延(nodal processing delay)
- 排队时延(queuing delay)
- 传输时延(transmission delay)
- 传播时延(propagation delay)
以上这些时延总和为节点总时延(total nodal delay)
d n o d a l = d p r o c + d q u e u e + d t r a n s + d p r o p d_{nodal}=d_{proc}+d_{queue}+d_{trans}+d_{prop} dnodal?=dproc?+dqueue?+dtrans?+dprop?
处理时延
检查分组首部和决定该分组导向何处所需的时间为处理时延 的一部分。当然处理时延还包括其他部分,比如检查比特级别差错所需的时间。
这里我们做一个类比,把两个端系统相互传输数据的过程类比于寄信
这里的处理时延就相当于邮局在处理需要发出邮件的时间,邮局需要知道这封邮件需要寄给谁,从而决定如何派送该邮件
排队时延
在队列中,当分组在链路上等待传输时,需要经受排队时延 。该时延取决于路由器的等级和网络的拥塞程度。
继续类比,这个过程好比于信件在中转站里面等待发送的时延
传输时延(发射时延)
用L表示该分组的长度,用R bps表示从路由器A传输到路由器B的链路传输速率。传输时延就是在传输过程中所需的时间。
这个是将所有分组的比特推向链路所需要的时间,所以我觉得这个名字起得不好,我给它取名叫发射时延
d t r a n s = L R d_{trans}=\frac{L}{R} dtrans?=RL?
继续类比,这个过程所需的时间相当于把邮件分配给派送员的过程所花的时间。
传播时延
当一个比特呗推向链路,比特需要在链路上传送给路由器B。从链路起点到路由器B传播所花时间为传播时延 。传播速率取决于链路的物理介质,大致为2×10^8 ~ c(光速)假设A和B之间的距离为d,传播速率为s,则:
d p r o p = d s d_{prop}=\frac{d}{s} dprop?=sd?
还是类比一下:这里相当于邮件在运送过程中所需的时间
1.4.2 排队时延和丢包
排队时延其实在前面已经讨论过了,这里我们讨论一下什么时候排队时延大,什么时候小?
这个主要取决于流量到达该队列的速率、链路的传输速率和到达流量的性质(流量是周期性到达还是突发形式到达)。
令a为分组到达该队列的平均速率(单位:pkt/s)R为传输速率。假定所有的分组都是L比特。那么到达队列的平均速率应该为 L a b p s La bps Labps最后,假定队列足够大,可以容纳无限量的比特。比率 L a / R La/R La/R被称之为流量强度(traffic intensity)
流量强度 | 效果 | I/O |
---|---|---|
L a / R ≈ 0 La/R\approx0 La/R≈0 | 排队时延非常小 | input<output |
L a / R ? > 1 La/R -> 1 La/R?>1 | 时延将越来越大 | input->output |
L a / R > 1 La/R > 1 La/R>1 | 越来越多的数据到达路由器,排队时延将趋近于无穷 | input>output |
在上述讨论是基于理想情况,路由器的缓冲队列无限大的时候,但是实际情况中,路由器的队列是有限大的,所以,如果一个分组到达该路由器时,发现该路由器的队列满了,该分组将会被丢弃(drop) ,分组就丢失(lost) 了。 这就是所说的丢包 。
1.4.3 端到端时延
前面一直讨论的是节点时延,也就是单台路由器的时延。现在我们讨论一下总时延。假定两个主机之间有 N ? 1 N-1 N?1台路由器。再假设网络无拥塞的(排队时延微不足道),每台路由器和源主机上的处理时延都是 d p r o c d_{proc} dproc?,每台路由器和源主机的输出速率都是R bps,每条链路的传播时延是 d p r o p d_{prop} dprop?。那么节点时延累加起来就是端到端时延:
d e n d ? e n d = N ( d p r o c + d t r a n s + d p r o p ) d_{end-end}=N(d_{proc}+d_{trans}+d_{prop}) dend?end?=N(dproc?+dtrans?+dprop?)
利用Tranceroute程序加深认识
用一个例子,追踪路由从源主机(gaia.cs.umass.edu)到(cis.poly.edu)输出为以下:
这6列数据时这样组成的
第一列 | 第二列 | 第三列 | 第四列 | 第五列 | 第六列 | |
---|---|---|---|---|---|---|
举例 | 1 | cs-gw | (128.119.240.254) | 1.009ms | 0.899ms | 0.993ms |
解释 | 路径上路由器的编号 | 路由器名称 | 路由器地址 | 实验1往返时延 | 实验2往返时延 | 实验3往返时延 |
最后3列是3次实验的往返时延。如果源从任何给定路由器接收到的报文少于3条(丢包造成的),Traceroute在该路由器号码后面放一个星号,并向那台路由器报告少于3次往返时间。
1.4.4 计算机网络中的吞吐量
考虑从A到B跨越计算机网络传送一个大文件。在任何瞬间的瞬时吞吐量(instantaneous throughput) 是主机B接收到了该文件的速率。
如果该文件又F比特组成,主机B接收到了所有F比特用了T秒,则文件的平均吞吐量(average throughput) 是 F / T b p s F/T bps F/Tbps
为了深入理解,我们还是举一个例子,一个服务器一个客户端,中间两条链路和一个路由器。 R s R_s Rs?表示服务器与路由器之间的链路速率, R c R_c Rc?表示路由器与客户之间的链路速率。那么,整个网络的吞吐量是多少?
我们可以想象比特(数据)是流体,通信链路是管道。如果 R s < R c R_s<R_c Rs?<Rc?,则在给定的吞吐量 R s b p s R_s bps Rs?bps的情况下,该服务器注入的比特将顺畅的通过路由器,并以 R s R_s Rs?的速率到达客户。
如果 R s > R c R_s>R_c Rs?>Rc?,路由器只能以其最大能力,用 R c R_c Rc?的速率发送,吞吐量为 R c R_c Rc?,同时,路由器内的数据会不断积压。
因此,对于这样简单的网络,吞吐量为 m i n R c , R s min{R_c,R_s} minRc?,Rs?
也就是说,吞吐量是瓶颈链路(bottleneck link) 的传输速率。
比如我要下载一个 F = 32 × 1 0 6 F=32×10^6 F=32×106比特的一个文件,服务器 R s = 2 M b p s R_s=2Mbps Rs?=2Mbps,客户端 R c = 1 M b p s R_c=1Mbps Rc?=1Mbps,那么下载所需时间就是32秒。(当然这里只是一个理想状况下的近似值)
如果说服务器到客户端有多个路由器和链路,其实效果也一样,吞吐量还是取决于传输速率最小的那个
接下来考虑这样一种情况:
有10台服务器和10个客户与计算机网络核心相连。同时发生10个下载,中间瓶颈链路的传输速率为R,所有服务器接入链路速率相同为 R s R_s Rs?,客户接入链路有相同速率 R c R_c Rc?。现在的吞吐量该如何衡量?
如果R比 R s R_s Rs?和 R c R_c Rc?大得多(比如100多倍),那么每个下载的吞吐量仍然是 m i n R c , R s min{R_c,R_s} minRc?,Rs?。
如果R与其具有相同的数量级怎么办?假定 R s = 2 M b p s , R c = 1 M b p s , R = 5 M b p s R_s=2Mbps, R_c=1Mbps, R=5Mbps Rs?=2Mbps,Rc?=1Mbps,R=5Mbps并且公共链路部分下载速率平等划分。这时候每个下载的瓶颈就不再位于接入网中了,而是在于共享链路,每个下载的吞吐量为 R 10 \frac{R}{10} 10R?
1.5 协议层次及其服务模型
1.5.1 协议分层
所有层的协议被称为协议栈(protocol stack) 。由以下几层组成:物理层(physical layer)、链路层(link layer)、网络层(network layer)、运输层(transport layer)、应用层(application layer)
- 应用层
支持网络应用
- 传输层
处理数据传输方向
- 网络层
帮助规划数据在网络中从源头到目的地的传输路径
- 链路层
数据在相邻网络元素之间的传输
- 物理层
使用什么样的介质来传输数据
1.5.2 封装(encapsulation)
这里我们先讲一个例子,还是A向B寄信,A写好信件,需要先用信封把信纸包起来,并且在信封上写上相关信息。然后放到发件箱中,该地区(比如AA省)邮局工作人员会再次将其包装,再写上相关信息并发送给B所在的地区(比如BB省),BB省的邮局工作人员会拆开最外面的封装,也就是省级的,然后才能看到收件人的信息并发送给B。B收到信件以后,也是要先拆开信封,才能看到其中的信件。
可以看到,信件这个系统是一层一层的,寄出的时候,会一层一层的包装,然后就是目的地的一层一层的揭开包装,目标用户才能看到其中的内容。那么计算机网络也是一样的。
发送端发送一条消息之后(此消息也称为应用层报文(application-layer message) ),传送给下一层,也就是运输层,运输层会再加上一个运输层报文(transport-layer segment)。也就是运输层报文封装了应用层内容。接下来就是不断地添加,依次是网络层数据报(network-layer datagram),链路层帧(link-layer frame)。在每一层都有两种类型的字段,一个是首部字段,也就是本层添加的字段,第二是有效荷载字段(payload field)
-> 第二章–应用层