不同的设备终端被称为:host;通信链路包括:无线电、路由器、光纤等等。图中圆柱子体是交换网络,由路由器和中转器构成,负责控制信号的发送路径。
计算机协议就是规定了网络实体之间所交换的消息的格式、意义和顺序,以及针对收到信息所发生的事件采取的动作。是对网络中数据交换而建立的规则标准或路径。
计算机协议一般以RFC(Request file comment)文档的形式保存。
计算机协议三要素:
语法:规定数据或命令传递的格式和规则。
语意:规定当终端接收到数据后应该做出什么反应
时序:保证信息收发的有序性,不会产生传输冲突。
网络边缘:主机和一些网络应用;
接入网络、物理介质:有线或无线通信的链路
网络核心(核心网络):互相连接的路由器(或其他分组转发设备)、网络之网络
指主机,一些特殊的主机运行着一些网络应用程序的服务。
客户发送请求,接收服务器响应。一般都由客户端主动发送请求,服务端被动接收请求,例如:Web应用、文件传输FTP应用等等。
由任意两台主机直接互联进行信息传递,通信在实体之间直接进行,这种应用如Gnutella、BT、Skype、QQ等。
住宅接入网络、机构接入网络、移动接入网络
用户最关心的是网络的带宽,以及网络的接入方式,是与别人共享接入还是独占接入。
利用已有的电话线连接中心局的DSLAM,通过信号的频率不同来确定该发往何种网络。
这种方式的上行传输速率<2.4Mbps(典型速率<1Mbps);下行速率<24Mbps(典型速率<10Mbps),所谓上行就是用户往网络中发送的传输速率,下行就是从网络中下载数据的传输速率。
FDM(频分多路复用技术):
>50kHz - 1MHz用于下行;
4kHz - 50kHz用于上行
0kHz -4kHz用于传统电话。
此种方式采用混合光纤同轴电缆作为传输介质,同样是非对称的,上行速率(2Mbps)<下行速率(30Mbps)。
不同于DSL的独占式,cable modem方式是共享接入,所以有时同样是2Mbps的带宽,cable modem方式上行会更慢(因为接入设备过多,带宽平均之后就小了)
后面会详细学习!
主要用于高校,公司等;通过以太网交换机直接接入ISP(互联网);通常传输速率为10Mpbs、100Mbps、1Gbps、10Gbps;
无线局域网(LANs):在同一建筑物内,通过共享的无线接入网络实现端系统(电脑、手机等)和路由器的连接。
广域无线接入:通过电信运营商(蜂窝网),该方式覆盖范围广,一个基站覆盖范围为几十公里,带框一般为1、10、100Mbps;例子是移动互联网的普及。
网络核心的主要功能:路由和转发。
网络核心解决的问题:数据如何通过网络核心从源主机到达目的主机。
路由:路由是指路由器遵循某种路由协议,遵循协议中的算法得出来路由表,其记录了输入数据分组对应的输出链路,确定输出链路的过程就叫做路由。
转发:路由完毕后,将输入的分组交换到正确的端口输出即为转发。
端系统通过接入ISP(access ISPs)接入到Internet,它将各种网络笼络形成一个巨大的复杂结构。因其复杂性,无法给出固定的细化结构,但可以宏观概览。
可以用一个全球或国家之间的大的ISP网络来中转接入此ISP网络中的各种数据信号。
这些大的ISP之间有两种连接方式:直接通过ISP种某台路由器互相连接;通过IXP(高速网络线路)实现ISP之间的连接;
黄色部分是一些区域性的ISP或者运营上ISP接如最大ISP的过程。
实际网络结构中,会存在多级ISP,可能会有一级ISP,二级ISP....最后是access ISPs(接入ISP)
一些网络内容提供商也会构建自己的网络,保证就近为用户提供内容,如谷歌
如果没有数据交换,设备和设备之间直接连接,那么假设设备有n个,就需要n*(n-1)/2条数据线路,线路过于繁杂,实现难度大。
我们在设备之间加上一个交换设备,通过它将每个设备发送的数据转发到指定设备,就使线路简化。
但同样上面这种方式如果主机相互之间相隔较远,仍无法合理的实现数据转发,所以我们可以用多个转换设备构成一个交换网络,将相距较远的计算机通过交换设备连接到一起,从而实现数据远距离传递。
电路交换、报文交换、分组交换
典型:电话网络
当两部电话需要连通,首先拨号,交换机建立A->B的线路,然后通话开始,通话完毕,电话挂断,电路释放。
在整个过程对线路的占用是独占方式,当两方通话过程中,第三方无法占用前两者的线路传输数据。
所以电话网络可以概括为以下三个过程:
建立连接、数据交换、释放连接
在两对通讯设备的连接链路中,我们发现,圈圈的地方都是共用的链路,虽然电话的连接在逻辑上是独占的,但是数据在传输的过程中还是会有链路在共同使用。
因为一对占用方往往无法消耗完链路性能,多数据传输共享,可以让链路使用最大化。
多路复用技术把链路/网络资源划分为“资源片”,资源片被分配到各个call(用户端),因为各呼叫(call)是独占分配到的资源片进行通信,所以资源片有可能会“闲置”。
每个用户指定用一段频率发送数据,不同用户发送数据所用频率不会重叠,所以可以共享链路,所谓频分多路复用
该技术把时间分成等份的多个时间片段,叫做帧,每个帧由多个时间隙,每个用户占用帧中一个时间隙,只有自己时间隙到时,才能够发送数据。所以同一用户所用时间隙是周期性出现的。
是一种用光纤作为传递介质,光作为传递媒介的数据传输方式的特殊频分复用技术,依靠不同波长来区分不同用户,不同用户可以共享使用链路。
该技术多应用在无线链路共享(如蜂窝网,卫星通信等)
不同于上面的技术(将时间分配和频率/波长分类),该技术给每个用户分配一个唯一的m比特(bit)的码片序列(chipping sequence),其中“0”用“-1”表示,“1”用“+1”表示。
如S站的码片序列为(-1 -1 -1 +1 +1 -1 +1 +1),要S站要发送的数据必须用这个码片序列编码后发送。
编码后数据=码片序列 * 原始数据。如要发送的数据是1,则编码后为(-1 -1 -1 +1 +1 -1 +1 +1),如果发送的数据是-1,则编码后的数据是(+1 +1 +1 -1 -1 +1 -1 -1)每位取反即可。
我们可以看到,如果我们要发送1则发送本站(S)的m bit的码片序列,如果我们要发送0则发送本站(S)的m bit的码片序列的反码。
在下面我们会用到两个概念:
规格化内积=两个向量每位相乘再相加的合/位数,例如我们两个码片序列(-1 +1 -1 +1)(-1 -1 +1 +1)的规格化内积就是[(-1)*(-1) + (+1)*(-1)+(-1)*(+1)+(+1)*(+1)] / 4 = 0;
正交,指两个向量的规格化内积为0的情况(即两个向量相互垂直)
我们用Si或Sj来表示某个站的码片序列,m表示码片序列的位数。用d0来表示要发送的数据
码分多路技术满足下面的关系:
不同站点的的码片序列的规格化数为+1,相同站点的码片序列的规格化数为0;
不同站点的码片序列和码片序列反码的规格化内积为-1,相同站点的码片序列和码片序列的反码规格化数为0;
发送端在两个时隙发送了两个数据分别是1和-1,经过编码(P=di * Si)后发送到接收端,接收端接收数据,di= Si * P / m = Si * Si * di/m。这时关键就是看Si*Si的值,如果接收端用要接收端的码片序列获取di,若Si对应则,Si * Si / m 为1,则结果为di,若不是要接收端的数据则Si * Si / m为0,则结果为0,不能收到数据。
如上图,多组信息同时传递因为没有时隙分配,必然会产生数据叠加,如时隙0中两个用户发送的数据编码后,在传输的过程中就叠加为了(+2 0 +2 0 +2 -2)。
那么在接收的过程中如何确定叠加后的数据是否含有自己需要接收的数据?
可见在解码阶段,如果叠加后数据含有要接收的数据则,内积为1,能够得出正确结果。如果是-1一样能得出结果。如果没有要接收的数据,就为0,数据被过滤。
确定含有之后,用要接收端的码片序列进行计算,即可得到自己需要的数据。
这种方式发送的是一个信息的整体,比如说一个文件或者一张图片(报文)。
把报文分成一个一个小的部分,每个部分加上头信息(包括在报文中的顺序等信息),这个过程需要拆分和重组,需要源主机和目的主机产生性能消耗(很小)。
特点:
因为这种方式(统计多路复用)是对小块对象,所以可以共享占用,目的主机会识别是否是自己需要的数据。这样就实现了数据共享,增加了链路的利用率。(如下图)
报文交换和分组交换都用到了分组交换的方式,不同的是报文交换是一次性就将报文全部发送到目标主机,分组交换是将报文分成几组,每组一个个转发。储存是对数据的分组和保存,转发是数据的转发过程。
分组交换的传输时延(指一个分组从第一个bit开始到最后一个bit传输结束所用的的时间),假设我们每组为L 个bit,链路每秒能够传输R 个bit,则传输时延= L / R。
报文交换的传输时延,如果报文大小为M,链路每秒能够传输的数据为R个bit,则报文的传输时延= M / R。
为什么叫传输时延,因为目的主机在接收到第一组数据时才算接到数据,在分组发送完毕前,即还收到数据,故为传输时延。
我们假设报文大小为M=7.5Mbits,每个分组大小为1500bits,M=5000L(一共5000组),链路带宽为R=1.5Mbits,从而计算报文交换和分组交换最终报文交付所需要的时间。
报文交换方式:
每经过五秒(7.5/1.5=5)M向右移动一个位置,第一个五秒,M到达第一个路由器->第二个五秒,M到达第二个路由器->第三个五秒,M到达目标主机。故一共需要15秒时间。
同样路由器要保证容量>=7.5(报文容量),这样报文越大,路由器容量也必须提高。
分组交换方式:
第1个1ms(1500bits/1.5Mbits), 第一个分组到达第一个路由器。
第2个1ms,第一个分组到达第二个路由器,同时第二个分组到达第一个路由器。
第3个1ms,第一个分组到达第目标主机,第二个分组到达第二个路由器。
第4个1ms,第二个分组到达目标主机,第四个分组到达第一个路由器,第三个分组到达第二个路由器。
....(从3ms开始,每过1ms就会有一组到达目标主机,一共有5000组)
第5002个1ms,最后一组到达目标主机。一共用时5002ms=5.002秒。
对比可知:5.002s(分组转发方式) < 15s (报文转发方式),再加上分组转发方式,路由器需要的容量也很小(仅一个分组容量即可)。
结论:因为分组转发方式具有的优越性,现在被广泛采用。
所谓跳步数即指源主机到目标主机经过的段数。
电路交换方式的特点:独占、频段分配;分组交换的特点:共享、无需分配;
例如:多个用户通过一个路由器接入互联网,路由器输出端链路为1Mb/s。
用户在使用网络过程中,并不是全部时间都是用网络进行数据交换,用于网络数据交换的时间仅占总上网时间的10%,设每次数据传输时需要的带宽为100kb/s(占总带宽的10%)。
电路交换方式:因为独占方式,所以有用户使用时,其他用户就不能使用,所以最多允许10个用户同时接入。
分组交换方式:对于35个用户,最大同时有10个人同时使用网络传输数据的可能性<0.0004。
结论:分组交换允许更多人同时使用网络,能更充分利用带宽资源。
那分组交换是完美的吗?
优点:特别适合突发数据传输网络(计算机网络等),突发就是突然有很多请求和数据传入。
缺点:因为无需共享,无需确定连接,当同时传输数据用户过多时就容易造成数据阻塞,产生分组延迟和数据丢失的可能。
其无法提供电路级的性能保障:像打视频电话时的卡顿等等都是数据阻塞等原因造成的,电路交换方式就能够保证少出现这类问题。
指单位时间内(s),链路能够传输数据的量(bit),经常表示的单位有:b/s kb/s Mb/s Gb/s。
速率往往都是指额定速率或标称速率,指的是往往无法达到最大,只能无限接近,每秒传输数据往往没有那么大。
本义指信号具有的频带宽度,最高的频率(Hz)和最低的频率(Hz)的差值。
计算机网络中的“带宽”通常是数字信道所能传送的“最高数据率”,单位是b/s(bps)等。
路由器都会有一段缓存,用来存储从输入端传过来的分组,当输出端的链路产生数据拥堵时,传入分组就会继续存储在路由器内部,当存入分组超过路由器最大缓存,就会产生丢包。
路由器在收到分组之后,确定包要输出的链路,差错检测所需要的时间,这种延迟时间很短,常常不到毫秒级。
因为路由节点要输出的链路产生拥堵,就会将要发送的分组咱存在自身,等待链路通畅,等待时间就是排队延迟。
排队时间取决于链路的拥塞程度,拥塞程度越高,等待时间越久。
我们设链路带宽(bps)为R,分组长度(bits)为L,平均分组到达速率为a,则流量强度公式为:La/R,其强度和排队时间的关系如图所示。
指每个分组在按比特传输过程中,完整将一个分组传入输出路径需要的时间。
该延迟受链路带宽(bps)和分组长度(bits)的影响,带宽或分组长度越大,则传输延迟越小,表达式:L/R L为分组长度,R为链路带宽。
是指数据在链路上从一个路由器传到另一个路由器所需要的时间,改时间的长短严重取决于物理链路的长度、信号传播的速率。
常用的传输介质有光缆、同轴电缆等,同轴电缆的传输速率能够达到0.7倍的光速(-2 * 10^8 m/sec),公式:排队延时=物理链路长度/信号传播速度。
可以看成bit带宽的链路中,当第一个bit到达对端时,链路中所拥有的bit数,是一种用bit表示的链路长度。
丢包率=丢包(分组)数/已发送分组总数;
表示发送端到接收端之间的数据传送速率。即时吞吐量:给定某一时刻的速率;平均吞吐量:一段时间内的平均速率。
瓶颈电路:在端到端路径上,限制端到端吞吐量的链路。
决定吞吐量大小的往往是所有链路中,带宽最小的链路(瓶颈电路)决定的,下面是一个理论图:
实际场景中,互联网带宽往往很大,限制吞吐量的链路一般存在于发送端和接收端的接入网路的链路。
计算机网络非常复杂是一个非常复杂的系统,涉及到很多组成部分包括:主机、路由器(routers)、各种链路(links)、应用(application)、协议(protocols)、硬件、软件,需要一种结构来为研究提供架构。
这种结构每一层都有固定的功能,上层要完成其服务要依赖下层提供的服务,每层之间依靠协议完成自身功能。
计算机网络体系结构是计算机网络各层及其协议的集合。
网络体系结构是从功能上描述计算机网络各层,并不关注如何实现功能。
体系结构是抽象的,是人为了研究计算机网络而提出来的。
采用分层结构有以下优势:
结构清晰,有利于复杂系统部件及其关系。
模块化的分层易于系统更新和维护。
有利于标准化,各厂商要遵循的标准。
实体指任何可以发送或者接收数据的硬件或软件进程。
协议是控制两个对等实体进行通信的规则的集合,协议是“水平的”,是同一层之间使用的标准。
任何一层的实体都需要调用下一层提供的服务,遵循本层协议实现本层功能。自己也为上一层提供服务。
下层协议对于上层来讲是透明的(不可见的)。同系统的相邻实体间通过接口进行交互,通过服务访问点SAP(Service Access Point),交换原语,指定下层要提供的服务。下层的原语返回的是服务调用状态。
该模型是由ISO(国际标准化组织)于1984年提出的分层结构网络模型。它将计算机网络分为七层,每层都有自己的功能,多层之间相互协调配合完成网络功能,下面是七层的具体内容:
为什么会出现OSI结构,因为当时计算机网络不同公司都在用自己研制的网络,为了不同公司通过网络交流,国际标准化组织就给出了通用的结构标准,为了不同网络之间的互联互通(异构网络系统的国际标准。
它虽然在商业实现上是失败的,但是在研究网络结构确实是极好的网络模型。
如上图所示,主机A、主机B、中间系统(路由器等)他们都拥有或多或少的层。相邻位置的对应层用协议互相通信,注意这种通信之所以用虚线是因为二者的通信指示逻辑方向,真正数据流动的方向不是直接通信。
过程:主机A应用层先将数据根据本层协议编码后发送给下一层,下一层再编码,一直到主机A的物理层根据物理层协议编码后,通过传输介质来到中间系统的物理层,物理层根据主机A和中间系统确定的协议解析数据内容后向上发送,数据链路层解析完数据后再向上发送。网络层解析完数据后,指明下一步要通过的链路方向。数据继续下流,首先在中间系统的网络层完成编码(根据中间系统和主机B的协议),而后向下到达数据链路层,编码后,经物理层再编码,而后通过传输介质,来到主机B的物理层,经过层层解析向上最终主机B的应用层完成了信息的解码工作,数据传递实现完毕。
特点分析:
实线是真实的数据传递路径,虚线是对于每一层的数据传输路径(逻辑上的),比如我们之前寄信,在寄信人和收信人看来,信是直接在二者之间传递的,但实际是邮局到火车到快递员这个过程
相邻两层之间通过接口进行对下一层的服务调用,和对上一层的服务反馈。
观察发现,前四层(应用层、表示层、会话层、传输层)是直接从源主机对着目标主机的,所以我们称这四层为end-end层。
主机A的用户数据在应用层进行处理时,应用层会在用户数据加上一些本层独有的信息,称为“头”,构成协议数据单元,以后向下每一层都会被加上对应层独特的“头”,到达物理层时,其给协议数据文件前后都加上了内容,构成帧,到达物理层之后就变成了01比特流,到达主机B后,从下往上逐层去掉头信息,最后返回用户B的就是用户A发送的原信息了。
为什么一定要给数据加上“头”?
“头”就是一种控制信息,这种控制信息包括:
数据接收方地址信息;数据纠错和排错信息(可选);数据的优先级、协议控制:服务质量和安全控制等(一些特殊数据包会用到)。
因为要实现数据传输,所以物理层向上提供的接口一定具有电气特性、功能特性、规程特性、机械特性。
具有比特编码能力,即将数据编为bit进行传输的能力。
控制时钟同步,保证数据发送方发送的数据能够被接收方接到。
还要考虑数据传输效率(数据率)
物理层有四种传输模式:
单工(simplex):两端,一端只能发送数据,另一端只能接收数据,数据流动是单向的。
半双工(half-duplex):两端都能发送和接收数据,但是一端发送数据时,另一端只能接收数据。
全双工(full-duplex):两端都能接收和发送数据,两端可以同时收发数据,一边发送一边接收(可以利用双线实现)
负责结点-结点的数据传输,结点到结点指同一线路左右两个结点。
负责把网络层传入的数据加上“头”和“尾”信息,组成数据帧,以便接收端识别并接收。
有物理寻址功能,在数据“头”中加入发送端和接收端的物理地址,供接收端识别。
如上图就很好看出了在广播线路中,如果没有源物理地址和目的物理地址,发送的数据将被所有其他主机接收。
其还要实现流量控制,避免发送端流量过大,超过接收端缓存速度,从而导致数据丢失。
负责差错控制,插入数据纠错信息,接收端检测错误,尝试修复。
访问控制,像上图的电路,要保证只用一个主机占用线路发送数据,避免多个主机同时发送数据,产生冲突。
负责将来自传输层的协议数据单元,加上分组信息,负责源主机到目的主机的数据分组。在大的网络环境下,物理地址就不起作用,需要一个全局范围的地址标识,例如internet的IP地址。故其具有逻辑寻址的功能。
要保证数据正确到达目的主机,路由功能也必不可少,路由器或者网关互联网络,不断将分组传给下一级正确路由器,最终到达目的主机。路由能够实现分组转发。下面是网络层分组转发示意图。
源主机将目标主机唯一标识(Ip)加入数据“头”,经过链路层和物理层,将协议数据单元传到第一级路由器,第一级路由经过物理层、数据链路层、到网络层,层层解析后,根据自身路由表给出输出链路,同时将下一级路由标识加入“头”。在整个数据传输的过程中,源主机和目标主机的Ip始终不变。
分段与重组:
负责将来自会话层的协议数据单元,分成不同的段,发往网络层。
该层主要负责将会话层完整报文的传输。其面对的是计算机互联网中两个主机的对应进程。
此外还有连接控制、流量控制、差错控制等
表述层不会将数据截断称不同的份,但是会在数据中添加一些同步点。
另外会话层也负责会话的建立和断开。
每个主机在对数据编码的时候,用的编码方式存在不同,表示层就负责将通用的数据转化为接收主机能够识别的数据,实现数据的正确表示。
当然也有压缩/解压缩、加密/解密的操作。
提供一个服务接口,可以为用户提供服务。网络应用有下面几个类型:
文件传输(FTP)、电子邮件(SMTP)、web应用(HTTP)
不同于OSI模型的先有理论后实践失败的发展路径,TCP/IP模型是先在计算机网络中实践后才形成的模型,所以更有使用性。
观察上图可发现该模型有两个特点:
OSI模型的优点在于对网络分层能够更清楚解释网络数据传输的细节,所以我们将两种模型结合起来,更有利于研究计算机网络。
1961-1972年,Kleinrock在论文中提出分组交换适合突发性数据传输,奠定理论基础。
1972-1980 网络互联,大量新型网络涌现:Xerox设计以太网、私有网络体系结构:DECnet、XNA、SNA、固定长度分组交换(ATM网路先驱)。
75年、ARPnet移交给美国航空管理局。
cerf和cahn提出网络互联体系结构,提出互联网的基本原则:极简、自治、尽力服务模型、无状态路由器、分散控制。
1980-1990年,新型网络协议和网络的激增。
1983年,TCP/IP部署到ARPnet网络。1982年,STMP协议出现、1983定义DNS、1985定义FTP、1988,在TCP协议中实现TCP拥堵控制。
新型国家网络诞生:BITnet NSFnet等,后NSFnet发展为现代互联网。
1990-2000初 网络商用化,web应用诞生。
ARPnet退役、NSFnet1991年解除商用限制,私营企业开始运营。
1992年因特网协会诞生ISOC成立。被人为互联网的诞生日。
web应用的出现,促进了互联网的普及。网络安全问题出现。
2005年至今,宽带接入网络的部署,无线接入网络的部署,互联网大公司,构建自己的网络,以绕够Internet直接给用户提供服务。互联网深刻改变生活。“云”应用的使用和发展。
服务端特点:
客户机特点:
这种结构的应用有Web应用,如Safari浏览器等等。
特点:
优点:可伸缩性强;缺点:难于管理。
两种方式的结合可以扬长避短。
例如:napster这应用就使用了混合结构,搜索文件时使用client-server模式,向其他用户发送文件时使用P2P结构。用户可以将自己的资源注册到中央处理器中,这样其他用户就可以通过中央处理器搜索获得。用户也可以直接发送给用户而不经过中央处理器。
进程指主机上运行的程序,同一主机上的进程通过一定的进程间通信机制和操作系统提供。不同主机上进程之间通过消息交换实现通信。
客户机进程:指发起通信的进程,服务器:进程指等待通信请求的进程。P2P结构也存在进程等待。
进程之间利用Socket传递数据,发送数据进程先将数据送入Socket中,操作系统会根据传输基础设施提供的API(传输协议的选择、参数的设置等等),调用命令将Socket中数据传入到目的主机的Socket中,从而实现信息的传递。
应用(进程)之间要在传递数据时,需要遵循共同的规范才能实现,发送端到接收端的信息传递能够正常识别与转换。
协议分为公开的协议和私有协议:
公开协议由RFC(request for comments)来定义和规范,常见的公开协议由HTTP、SMTP等,现在的大多数应用都是建立在HTTP协议之上的。
私有协议,出于商业竞争考虑,一些P2P结构的应用,会自己设计协议,确保自己应用数据的安全性和特殊性。
消息的类型:是请求消息还是响应消息;
消息的语法:是键值对还是value,都有哪些字段。
字段的语意:字段中信息的含义,一般是约定俗成。
规则(rules):进程何时发送和响应消息。
不同应用对传输服务的要求:
一些对数据丢失要求不高的网络应用,如网络电话。
某些对数据可靠性要求高,传输的数据必须完整,不能丢失,如文件传输。
网络电话和网络游戏要求低延迟,要保证数据传输的速度。有些应用必须在延迟低到一定程度才能正常运行。
网络视频必须在带宽达到一定程度才能正常观看,否则卡顿严重,甚至黑屏。
email应用对带宽无要求,因为该类型应用本身就是异步的。
TCP:
面向连接:客户端的进程和服务端的进程需要建立连接。
传输是可靠的:正因为需要建立连接,所以连接是可靠的。
流量控制:能够控制发送端发送数据的流量大小,方式超过接收方处理能力导致数据丢失。
拥塞控制:当网络负载过重时,能够限制发送方的数据发送速度。
不提供时间/延迟保障,不提供最小带宽保障。
UDP:
无连接、不提供可靠数据传输、不提供流量控制、拥塞控制、延迟保障、带宽保障。
仅提供网络数据传输的基本功能!
发明者:Tim Berners-Lee(一位专注科研的值的敬佩的人)
Web的诞生使Internet称为全世界使用最广泛的网络,同样HTTP协议也顺势称为使用最广泛的Web应用层协议
特点:
通过网页的互相连接实现应用。
网页包含多个对象:HTML文件、JPEG图片、视频文件、动态脚本等,HTML文件是最基本的,其含有对其他对象的链接。
网页之间寻址方式,通过URL(统一资源定位器)寻址,URL格式->
协议名://ip或者域名:端口号/文件路径 下面是百度新闻的一个网址实例。
https://content-static.cctvnews.cctv.com/snow-book/index.html
HTTP:HyperText Transfer Protocol;
面向CS(Client-Server)结构:
客户端发送请求,接收返回信息、展示获得的web对象。
服务器在80端口等待客户请求,浏览器发送到服务器的TCP连接(创建套接字),服务器接受来自浏览器的TCP连接,浏览器和服务器交换HTTP消息,关闭TCP。
服务器不会维护任何有关客户端的历史请求信息,不会有记忆。
为什么是无状态的?因为如果有状态,那么维护状态就需要一定时间,如果发生客户端断开,则客户端下次连接产生的状态不一致,就需要很复杂的逻辑,花费代价较大。
1.0: 非持久性连接的,不会维持连接;1.1:默认是持久连接的,一旦连接建立就不会轻易断开。
案例前置:客户端从服务器中获取一个HTML文件,文件中包含10个图片引用。
客户端向指定URL发起建立连接请求 -> 服务器同意建立连接,返回同意信息 -> 客户端发送要请求的资源地址(URL后面部分) -> 服务器返回HTML资源 -> 客户端解析HTML文件,发现10个新的对象引用 -> 再次请求连接 ->同意连接 -> 发送资源路径 -> 返回资源 ....... ->客户端收到最后的对象引用。
如果我们客户端到服务器发送一个小数据包并获得返回的时间为RRT(Round Trip Time),那么发起建立连接请求和获得同意,发送资源地址和返回资源一共需要2RRT,因为返回资源时间较大,故获得HTML文件所用时间为:1RRT + 文件请求和发送时间。总共获得完整HTML页面时间为11RRT + 文件请求和发送时间。因为有十个对象连接,所以频繁建立连接,服务器返回后,自动断开连接,很浪费资源。如果HTML页面和十个连接对象的请求获取都需要1RRT,那么总共消耗:22RRT。
操作系统为每个TCP建立连接都会开销系统资源,可见单次连接的HTTP会大量开销系统资源用于建立TCP连接。
服务器发现客户端连接请求后,建立连接,然后一直保持跟客户端的连接状态,后续的HTTP请求都通过该连接发送。
无流水的持久性连接:客户端只有收到前一个请求返回的资源后才会发送下一个请求。每个被引用的对象获得消耗1个RTT,整个下来获得完整的HTML页面需要:12RRT。
带有流水机的持久性连接:客户端在收到第一个对象后(确保连接畅通),就尽可能发送所有的引用对象路径请求,理想情况下只需要1个RRT就可以获得所用引用对象。这样一共需要:2RRT。
什么是流水?流水就是在固定时钟周期内要作哪些事情,像流水线,不会等待响应(或者说在等待流水段等不到回应就判定失败)
非流水要以收到回应为下一步操作的条件,故会受限于服务器的返回速度。
两类消息:请求消息(request)、响应消息(reponse)
用ASCII编码编成直接可读,部分内容结构如下:
请求头信息和请求体用换行隔开,请求头内容包括一些必要的信息,如请求资源的路径信息,使用的代理,接收的语言等等。
请求方法:
get,该方式请求数据跟在路径后面;post请求中携带的数据被放到请求体中;
HEAD,要求返回时不携带请求体,一般用于测试。
put,该请求方式将请求携带的文件放到路径指定位置;(1.1)
delete,删除指定路径对应文件。(1.1)
请求头中包含:请求状态码(代表不同的服务器响应结果),HTTP代表所用协议。DATE是响应时间,Last0Modified是要返回内容最近一次修改时间。
前面提到,HTTP协议是无状态的,但是一些网络应用需要记录用户在所有请求中的行为,如网络购物,身份验证等等,所以HTTP协议就在它的请求头中增加了一个属性叫做Cookie,用于识别用户身份。
客户端发起请求,服务器收到请求后生成Cookie值,加入响应头中返回给客户端(浏览器),浏览器将Cookie保存,此后客户端在一定时间内再次发送请求会携带Cookie值,客户端收到Cookie值就可以查到该Cookie对应的用户之前做了什么操作,从而实现服务端对用户行为的记录。
Cookie一但被窃取,就能够冒用身份盗取信息,为犯罪创造条件。
一些大型应用商为了缓解中心应用服务器压力,会部署服务器代理,一些资源用户不访问服务器,可以从就近的代理服务器中获取,这样就减少了中心服务器的压力。运用代理有如下好处:
如上图:当客户端需要资源时,请求会先到达代理服务器,如果代理服务器有该资源,则直接返回给客户端/用户,不经过真正服务器;如果代理服务器没有该资源,则会请求服务器返回对应资源到代理服务器,代理服务器保存后,返回给用户/客户端,下次再访问统一资源则会直接返回。
从上面的分析我们可以看出代理服务器有两重身份:代理服务、用户。
代理服务器一般由ISP(网络应用提供商)架设。
Web缓存如何缓解接入网络压力?
上图是一个公司网络接入互联网示意图,在没有缓存的情况下,如果要从互联网上请求1.5Mbps的资源,直接就将网络带宽占满,造成网络堵塞,严重影响传输性能。
如果我们在本地接入缓存,缓存命中率为0.4,那么1.5Mbps的资源有40%都可以在本地的缓存中得到(如不会变的网站图标等等),这样就大大减轻了接入网络的带宽压力,也足够经济实惠。
本地缓存如何实现资源更新?
本地缓存会发送条件get请求,请求头中有属性If-modified-since:
Email客户端将要发送的信息发送到email服务器中,要发送的信息会被保存到服务器对应账户的代发送消息队列中,如果是接收消息,对应账户会收到其他服务器发送过来的信息,保存在服务器的收件位置进行储存。
开始时SMTP仅允许发送7位的ACSII码,请求头只有:To、From、Subject(发件人、收件人、主题)信息,请求体里面放邮件的具体内容。可见本来的SMTP是不能够发送多媒体文件的。
后来,因为实际需要,对SMTP的请求头进行了扩展(MIME版本),增加关于多媒体的请求行:
这样如果客户端要发送或者接收数据,就可以根据指定的编码格式和文件类型进行编码,接收方也可以根据请求行定义内容,对文件进行正确的解码从而实现文件的正确获取。编码后的数据放在请求体中进行传递。
与邮件发送和服务器间传递使用的SMTP协议不同,IMAP协议/POP协议是用于用户从服务器上获取邮件的协议。
该协议分为三个阶段,握手,确认身份(认证/授权)、邮件的上传或下载。
该协议是无状态的。
该协议比POP协议相比功能更复杂,能够操纵服务器上的消息。现在被广泛采用。
当然HTTP协议也可以实现邮件阅读和删除的功能,例如QQ等。
我们在计算机网络中,是用IP寻找到指定主机,但是IP不便辨识和记忆,所以就出现了域名,域名用英文表示,每个域名与IP是一一对应关系,DNS是专门提供域名到IP解析服务的服务器。
多层命名服务器构成的分布式数据库共同组成DNS域名解析服务。
DNS协议是应用层协议,域名解析在应用层完成。
为什么域名解析要在应用层完成?
在前面我们提到,要保持网络核心(路由器或网络层)的简单性,将DNS这一复杂的互联网核心操作放到应用层实现,也保持了网络核心的简单,不会拖慢网络传输的效率。
其系统结构如下:
第一层是根DNS服务器,第二层是不同后缀的DNS服务器,最后一层是各网络服务提供商的域名解析器DNS。
例:当用户想要请求www.amazon.com对应的服务时,会先向根DNS服务请求,根DNS并不会保存全部IP和域名映射,根DNS查找到请求域名时com结尾的DNS服务器,将新域名DNS地址发送给用户,用户再次请求com DNS服务器,查找到地址对应域名解析服务器再amazon.com DNS上,所以再次把对应新DNS服务器发送给用户,用户再次访问DNS,获得真正的域名。
从上面过程可以看出来这种方式有利有弊:
利:避免大量请求同时涌入一台DNS服务器,造成单点故障,缓解DNS服务器带宽压力。
避:用户解析域名需要发送多次请求,请求过于频繁。
顶级域名服务器(com org net edu等顶级域名和国家顶级域名cn uk fr)会归专门的部门或公司维护。Network Solutions 维护com顶级域名服务器。Educause维护着edu顶级域名服务器。
权威域名服务器由服务提供商负责维护。
不属于域名解析系统范畴,但是起着用户代理的作用,用户发出的请求中的域名解析请求,都由本地DNS代为处理。下面展示两种域名解析过程
左边是迭代请求方式,右边是递归请求方式。二者区别观察可以发现,递归请求方式本地用户和代理DNS都只需要发送1次请求即可获得IP地址,其他由DNS系统内部处理。
本地域名解析服务器拥有缓存功能,一些经常访问的域名会被本地DNS服务器缓存下来,只有在本地DNS没有时,才会访问Root DNS。
现在世界上的13根域名服务器都设在其他国家,中国没有。
是DNS服务在相互交流中需要用到的协议。
查询(query)和回复(reply)类型的协议,发送查询信息,返回查询结果。
查询的格式和回复的格式相同。
DNS服务器中保存的是资源记录(RR,Resource record),格式如下:
(name,value,type,ttl)不同类型的name与value代表的意义不一样。
下表列出了不同类型对应的三个值的对比:
type | name | value | ttl(过期时间) |
A | 主机域名 | IP地址 | 过期时间 |
NS | 域(如edu cn等) | 该域权威解析域名解析服务器 的主机域名 |
|
Type | 某一真实域名 的别名 |
真实域名 | |
MX | 邮件服务客户端(存疑) | 相对应的邮件服务器 |
identification用来确定查询的身份(识别查询以正确返回);
flags用来记录是否递归查询、这是回复/查询消息等信息。
questions用来记录查询的四个元素(name、value、type、ttl);
answers用来记录回复信息。
后两列分别代表权威机构的回复和其他机构的回复。
最后在自己的权威域名解析服务器中加入A类型的信息,www.networkuptopia.com->真实IP。
上面提到的都是CS结构,即客户端-服务器模式,Peer to Peer模式是两台主机直接互联发送信息的结构,具有管理难度大,没有固定IP等特点。
问题:从一个服务器向N个节点分发一个文件需要多长时间?假设网络有足够的带宽,上传带宽不一致。
如上图可以知道,我们有n个主机需要接收文件File,所以Server(服务器)上传文件需要的时间就是NF/Us,同样每个主机都需要下载文件,受最慢接入网络带宽主机传输限制,所以N个主机并行下载需要F/min(di)的时间才能下载完毕,所以可见:
这里N得值越大,即用户数量越多,传输和下载文件所要耗费的时间就越大,耗费时间和N的值是线性关系。
首先服务器必须至少发送一个文件副本,耗时F/Us,客户机需要F/di时间下载,总共需要下载NF个bit,故最快的上传速率为Us + (u1 +... + Ui)。
可以看到当N越大,其对整体的传输度的影响就越小。所以我们可以用下图描述两种方式对节点数量的敏感程度。
tracker:跟踪参与torrent的节点
chunk:是用于交换的文件块。
torrent:交换同一个文件的文件块的节点组,如下图:
新增的用户如何加入节点组?
如上图,节点加入torrent,会先从tracker中获取已经在该torrent中的节点,然后与torrent中的某些节点建立连接,从这些节点下载需要的数据并保存到本地,在这个过程中,其他节点都又可能离开(掉线),所以同一份文件会同时保存到许多节点中,这样就避免了数据丢失。
节点组如何保持chunk的流动性和更新?
在给定的任意时刻,不同节点持有文件的不同chunk集合,每个节点会定期查询自己连接的其他主机的chunk列表,如果存在自己还没有的chunk,则发送获取请求补全缺失的chunk。
节点如何决定该向何节点发送数据?
每个节点会定期向自己连接的结点的前四名(给自己发送数据最多的前四名)发送chunk,没过4s重新评选top4。
同时每隔30秒还会随机选择一个其他节点,向其发送chunk,以此保证数据的一致性、平衡性。
从上面分析中可以看出torrent中节点之间数据的流动是双向的,用top4来促进各节点传输文件的积极性。
索引就是用来记录每个节点对应文件的目录。
如电驴用于文件互传、qq用于动态IP的确定。
所有的节点都会将自己所拥有的文件列表同步到一个centrallzed directory server上,如果一个节点想要获取指定文件,要先访问centrallzed directory server,获得拥有该文件的节点列表,然后再访问对应节点,获得数据(文件)。
缺点:单点失效问题、性能瓶颈问题(带宽限制)、版权问题(因为集中式资源一目了然,懂??)
覆盖网络(overlay network)的概念:指已经存在了TCP连接的各个节点形成的网络,节点的邻居数少于10个。
每个主机都自带索引标识自己拥有的文件列表。如下图,最左边的主机想要获取某个文件,先向自己建立了TCP连接的其他节点发送请求,其他节点检索自身索引,如果有就返回,如果没有,再以自己为基点,向和自己有TCP连接的主机发送资源索取请求,如果有主机有,就逐级返回拥有文件的主机节点信息,最左边主机得到后建立与彼主机的TCP连接获取数据(文件)。
其缺点:
会产生大量请求,直接全部覆盖查询消耗节点性能和网络通畅度。
每个大的节点相当于一个集中节点(集中索引),其下面的小节点将自己信息注册到他们上面,大的节点之间构成分布式索引,完美避免了前两者的弊端。
简单理解就是它是应用层调用传输层,使用传输层发送和接收数据功能的接口,即API。应用层一般情况下用不到传输层的服务,当应用层需要用到传输层服务来发送和接收数据时,就会创建Socket,Socket中包含了一些指令,相当于调用传输层服务的接口,通过调用对应指令实现数据收发。
传输层在操作系统之中由操作系统管理,Socket相当于将操作系统的功能通过接口提供给应用程序,应用程序可以让传输层做指定操作,从而实现两层通信。
两个引用层相互传递数据时,因为每台主机上都有多个应用程序在跑,所以就通过IP+端口号来唯一标识某个应用程序,内部标识通过创建Socket时自动生成的套接字描述符,来确定进程,每个套接字描述符会被抽象为文件或指定数据结构进行管理,里面记录着对应进程的相关信息如下:
数据结构如下:
WINSocket在Socket基础上,很多指令还是Socket指令,在Unix(Unix中用的Socket)中一样适用。一些纯小写指令是Socket和WINSocket通用指令。
创建Socket之前要先开启动态Socket库,关闭Socket后还要清理动态Socket库,以释放库。
三个参数,一个返回值。
返回值sd是操作系统创建完socket 返回的Socket描述符。
第一个参数是协议族,protofamily=PF_INET,代表服务的协议是TCP/IP协议。
(在Socket诞生之初仅仅服务TCP/IP后来演变为什么都可以服务,所以需要协议族来声明)
第二个参数是套接字类型:
type= SOCK_STREAM,SOCK_DGRAM,SOCK_RAW(TCP/IP)
SOCK_STREAM,面向TCP协议(可靠,面向连接,字节流传输,点对点)的Socket;
SOCK_DGRAM,面向UDP协议(不可靠,无连接,可一对多)的Socket。
SOCK_RAW,直接越过传输层和网络层通信(创建该Socket一般需要计算机的最高权限)
第三个参数是遵守的协议(协议号表示)
三个参数。
sd,socket的描述符,用来确定要连接的socket。
saddr,要连接的Socket的IP地址。
saddrlen,指定地址的长度。
如下图:
当有多个Socket向同一个Socket发起连接请求时,Socket内部的队列会储存要连接的Socket信息,排队连接(队列先进先出)
同时注意:
该函数在CS结构中只能客户端调用。
TCP协议,使用connect函数时,是真正意义上的建立连接;UDP使用connect函数时,因为其是无连接的所以仅仅是将数据发送方向指向了指定地址的Socket罢了。
三个参数。
sd,Socket描述符,用来识别Socket。
localaddr,指定要连接的客户端IP地址,用INADDR_ANY通配符式指定IP地址。
不固定制定,那是为何?原因如下:
服务端是一,客户端是多,不同客户端的Socket对应的IP不一样,并且如果是动态IP那么同一个客户端也会有不同的IP地址。故指定为INADDR_ANY,如下:
功能:置服务端的流套接字处于监听状态(仅仅服务端调用,面向连接的流套接字,无连接还连接什么,哈哈。)
两个参数。
sd,Socket描述符,用来识别计算机上不同进程。
queuesize,设置连接请求队列的大小(即允许等待连接数)。
返回值:0,成功;SOCKET_ERROR 失败
功能:关闭一个描述符为sd的套接字。
如果多个进程共享一个套接字,那么调用Closesocket只会使套接字中引用数减1,只用当引用数为0时,才会真正关闭Socket(套接字)。
如果一个进程中的一个线程调用了closesocket,即使Socket没有真正关闭,该进程中的其他线程都不能再访问该套接字。
返回值:0,成功;SOCKET_ERROR 失败!
功能:调用后,服务端从监听状态的流套接字sd的客户端请求队列中取出排在最前的一个客户请求,并且创建一个新的套接字来与客户端相连,并开始提供服务和交换数据。
accept 是一个阻塞式函数,当没有请求进来,其会一直等待。
仅用于TCP套接字(流套接字),仅用于服务器端。
为什么要创建新的套接字来与客户端进行通信?在原来套接字的基础上不好吗?
这是因为,服务端提供的服务都是多线程的,只有新建一个套接字给指定线程使用,以给用户提供服务才能将原套接字空闲出来,继续执行accept函数,接收更多请求,建立更多套接字,或共享以实现服务端一对多的服务实现(见过哪个服务器一次仅服务一个人?)
如果再原来套接字的基础上跟客户端建立连接,则一次仅能服务一个客户对象。
send函数用于TCP套接字(客户端与服务端)或调用了connect函数的UDP客户端套接字(注意这里并未真正建立连接)
sendto函数用于UDP服务器端套接字与未调用connect函数的UDP客户端套接字。
recv函数从TCP连接的另一端接收数据,或者从调用了connect函数的UDP客户端套接字接收服务器发来的数据
recvfrom函数用于从UDP服务端套接字与未调用connect函数的UDP客户端套接字接收对端数据。
setsockopt函数用来设置套接字sd的选项参数。
getsockopt函数用来获取任意类型、任意状态套接口的选项当前值,并把结果存入optval。
TCP/IP协议定义了关于协议头的二进制整数表示,网络字节顺序(network byte order)
某些Socket API函数的参数需要储存为网络字节顺序(如IP地址、端口号)。
一些函数可以实现本地字节顺序和网络字节顺序的转换。