我们平时在百度上搜索知识,我们的电脑就是客户,从百度服务器请求东西,构成了C/S体系。客户发请求,服务器接收并响应请求。
C/S结点不平等,扩展性差
- 当请求用户比较多时,瓶颈在于服务器端,所以只能提升服务器的硬件性能来提升服务质量。
- 当请求用户请求数量增多到一定程度,C/S架构的性能会发生断崖式下降(性能骤降)。
我们平时用手机QQ给伙伴传输文件,我的手机既可以作为服务器给对方传输文件,也可以作为客户端接收文件。我的手机既是客户端又是服务器。
每一个节点既是客户端又是服务器
当用户数量增多,请求的节点也会增多,但同时充当服务器的节点也会增多;所以当用户数量不断增加,P2P不会出现性能断崖式下降,可能是平滑的下降或者维持在某一水平。
存在某个中心服务器,当用户上线时在服务器注册IP地址,并向服务器说我这有哪些资源(我在哪,我有啥)。当另一个用户向从服务器请求某个资源,服务器会进行文件搜索(这一过程是C/S模式)。当服务器检索到某一用户存在该资源,服务器可以提供有资源的用户IP地址,这两名用户就可以进行传输资源(这一过程是P2P模式)。
文件搜索:C/S ; 文件传输: P2P
当用户越多,资源越多,下载的速度越快,越能吸引更多的用户。
同一个主机内,进程间通信使用进程间通信机制通信(操作系统)
不同主机,通过交换报文message来通信
网络应用在不同的端系统上运行,通过网络基础设施提供的服务,应用进程彼此通信。
网络核心中没有应用层软件,网络应用只在端系统上存在,者能够加速网络应用的开发和部署
区分应用进程3要素:
- 唯一的32位IP地址。【找到某台主机】
- 用TCP还是UDP进行通信
- 在TCP或UDP上的端口号【找到主机上的某个进程】
应用层需使用传输层提供的服务实现进程通信功能。应用层与传输层间在SAP(TCP/IP:socket)服务访问点,可通过SAP调用应用层序接口API(TCP/IP:socket API)来实现进程通信。
服务访问点(SAP):是一个层次系统的上下层之间进行通信的接口,N层的SAP就是N+1层可以访问N层服务的地方。【SAP:调用函数的地方;函数:提供服务的方式】
应用层向传输层传递数据必须携带的信息:
传输层提供的服务就像快递公司,应用层需要告诉“快递公司”:
- 发的什么货
- 发货人地址
- 收货人地址
关于“快递公司”怎么将货送到对方手里,用户(应用层)并不需要管,只需要找到快递点(SAP),剩下的交给“快递公司”
如果每次使用Socket API传输报文时都得携带以上信息,不容易管理。便引入socket
这一概念,作为信息的代表。
TCP socket
TCP socket:
用一个整数(本地标识)来表示一个四元组:<【源 IP】, 【源端口】,【目标 IP】 ,【 目标端口】>
在传输层维护一张表,某个整数(标识)可映射到某一对应四元组。一个整数对应一个四元组,一个四元组对应一个会话
。
引入socket后,应用使用这个标识,与远程的应用进程通信,不必在每一个报文的发送都要指定这 4 元组。
就像使用操作系统打开一个文件, OS返回一个文件描述符一样,以后使用这个文件描述符,而不是使用这个文件的目录名、文件名。
UDP socket
UDP socket:
用一个整数(本地标识)来表示一个二元组:
UDP 套接字指定了应用所在的一个端节点( end point )【端结点=IP+port】;因为 UDP是无连接的,所以UDP socket不代表会话关系。
进程在TCP上进行传输,需要提供两样东西:
1、 TCP socket; 2、 数据本身。
进程在UDP上进行传输,需要提供三样东西:
1、UDP socket; 2、数据本身
为了能够进行正常传输,还需要 3、目标ip和端口
TCP提供可靠的传输,就像两个经常写信的好友,对应的四元组<好友A地址,好友A门牌号,好友B地址,好友B门牌号>;因为你们经常联系,通过维护一个本地标识即可。
UDP提供不可靠的传输,就像两个不经常写信的好友,好友A想和好友B写信的时候才会知道好友B的具体地址;所以联系的时候需要给出自己的标识<好友A地址,好友A门牌号>,并且主动告诉“邮局”好友B的地址和门牌号。
数据丢失率
有些应用则要求100%的可靠数据传输(如文件;有些应用(如音频)能容忍一定比例以下的数据丢失
延迟
一些应用 出于有效性考虑,对数据传输有严格的时间限制
吞吐
一些应用(如多媒体)必须需要最小限度的吞吐,从而使得应用能够有效运转;一些应用能充分利用可供使用的吞吐(弹性应用)
安全性
机密性、完整性、可认证性
UDP服务
UDP无需建立连接,省去了建立连接时间,适合事务性的应用;
UDP不做可靠性的工作,例如检错重发,适合那些对实时性要求比较高而对正确性要求不高的应用;
UDP没有拥塞控制和流量控制,应用能够按照设定的速度发送数据;
而在TCP上面的应用,应用发送数据的速度和主机向网络发送的实际速度是不一致的,因为有流量控制和拥塞控制
TCP和UDP在传输数据的过程中都没有加密,明文通过互联网传输,甚至密码。
所以为了安全性,可以在TCP上使用SSL,提供加密的TCP连接。
SSL在应用层,应用进程采用SSL库进行加密,SSL库再使用TCP进行通信。
先大致了解,后面再深入了解
应用层协议定义了运行在不同端系统上的应用进程如何相互交换报文。应用协议仅仅是应用的一部分,规范了应用之间信息交换的流程。
Web 页:由一些对象组成。
对象可以是 HTML 文件、 JPEG 图像、 Java 小程序、声音剪辑文件等。
Web 页含有一个基本的 HTML 文件,该基本 HTML 文件又包含若干对象的引用(链接)。
通过URL对每个对象进行引用
【对象嵌套
对象】
HTTP是Web的应用层协议,采用C/S模式。因为使用了相同的协议,不同厂家的浏览器之间才能够相互通信。
浏览器向服务器请求对象过程:(HTTP建立在TCP之上)
- 服务器守在TCP 80号端口,存在一个waiting socket 等待建立连接请求。
- 某主机浏览器通过socket API 向服务器发起连接请求。
- 服务器接受响应请求并创建一个socket代表这段会话关系。【注意是创建新的连接socket,原来的waiting socket仍然守候在80号端口】
- 连接建立后,浏览器采用HTTP协议向服务器发出对象请求。
- 服务器响应HTTP请求,返回响应对象。
【返回的对象是HTML框架,在主机页面展示过程中若碰到指向图片的引用(指向图片的url),需再次与对应主机建立TCP请求,把对象拉过来】
HTTP一般是无状态的;
无状态:服务器不维护客户端状态,既对象响应后就断开连接。
【无状态的服务器能够支持更多的客户端】
非持久HTTP
访问一个网页可能需要多次建立TCP连接,获取HTML框架的TCP连接,在HTTP请求与响应。HTML中的图片音频又得依次建立TCP连接和HTTP请求响应
在非持久HTTP连接中,请求一个对象最少需要2个RTT(TCP连接请求与响应+HTTP请求与响应)
持久HTTP
- 获取GET,发送POST,只获取头部(只为了获取部分信息,不用发送对象内容)HEAD。
【POST:页面会作为传输的数据,如页面内的表单;GET:参数包含在URL请求中,因此GET不适合传输保密信息】- Host:访问主机域名
- User-agent:用户代理(用户浏览器名称+版本)
- Connection:关闭持久连接
第1行200是响应状态码
第5行Lat-Modified是最后更改日期。有时HEAD请求就为了获取这个修改时间,及时更新本地对象内容。
第6行Content-Length是文件数据长度。HTTP提供内容边界(TCP不提供)
HTTP默认是非持久连接,不维护客户状态信息,当某个用户发出页面请求时,WEB服务器只是简单的进行响应,然后就关闭与该用户的连接。因此当一个请求发送到WEB服务器时,无论其是否是第一次来访,服务器都会把它当作第一次来对待。【那些广告精准投放啥的就不能实现了,进入下一个功能页还得输入账户密码】
cookies是把用户信息存储在本地某个文件夹下的一个手段,解决用户与服务器之间的无状态通信。
引入cookies后访问某一对象:
- 浏览器第一次向服务器请求对象,此时请求不带cookies。
- 服务器分配一个cookies,并放入response报文中发回浏览器,同时服务器保留cookies在数据库中。
- 浏览器第二次访问对象,发送一个带cookies的请求。
- 服务器收到cookies后在数据库中匹配,建立关联。
28原则:百分之八十的用户访问百分之二十的内容。
那我们把这百分之二十的内容存到一个方便的地方,其他人要用在从这取不就更快速了嘛。
所以Web缓存的目标:不访问原始服务器,就能满足客户的请求
。
Web缓存好处:
第一台电脑先经过代理服务器后访问终端服务器,代理服务器存储访问内容。第二台电脑访问同一个内容,就只需访问代理服务器,不用在去请求终端服务器。
代理服务器就起到了Web缓存的功能【代理服务器既是服务器也是客户端➡缓存既是客户端又是服务器】
在开发网站时,可通过FTP协议将网站程序上传到Web服务器。工作方式分为:主动方式和被动方式
FTP 服务器维护用户的状态信息:当前路径、用户帐户与控制连接对应(有状态)
- FTP服务器守护在TCP21号端口,等待连接建立请求
- FTP客户端向服务器的21号端口发送连接请求
- 服务器接受请求后,建立起一条命令连接
- 传数据时,客户端在命令链接上向服务器发送PORT命令(客户端接收数据端口)
- 服务器收到命令后,通过自己的20号端口与PORT命令中指定端口发送连接请求,建立数据连接。
- FTP服务器守护在TCP21号端口,等待连接建立请求
- FTP客户端向服务器的21号端口发送连接请求
- 服务器接受请求后,建立起一条命令连接
(以下为不同之处)- 传数据时,客户端在命令链接上向服务器发送PASV命令
- 服务器收到命令后,
随机
开启一个端口并向服务器发送端口信息- 客户端向服务器指定端口发送连接请求,建立数据连接
3个主要组成部分:
发送:SMTP
获取:POP3、IMAP
用户代理向邮件服务器发送报文,邮件服务器向邮件服务器发送报文➡SMTP
用户代理从邮件服务器获取邮件➡POP3
SMTP使用TCP在客户端和服务器之间传送报文,端口号为 25。
SMTP要求传输的报文必须为7位ASCII码
SMTP采用持久连接,在无报文发送后才关闭连接。
当使用SMTP发送中文字符时,ASCII码并不能够表示中文,需要进行扩展,从而产生了MIME(多媒体扩展)内容格式。
用有意义的字符串:好记,便于人类用使用。
最开始是一个平面命名,只有一个(集中)维护站:维护着一张主机名 -IP 地址的映射文件。
一个平面存在的问题:
网络中主机数量多,名字重复问题会很严重。
方案:Domain Name System(DNS)
DNS主要思路:
DNS是在网络边缘上的。互联网很多核心内容在建立在互联网边缘的端系统的应用之上实现的。
DNS使用C/S模式运行在通信的端系统之间,通过下面端到端的传输协议来传送DNS报文,所以DNS是一个应用层协议。
DNS不是直接与用户打交道的应用,它为英特网上的用户应用程序以及其他软件提供将主机名转换成IP地址的核心功能,它使用了位于网络边缘的客户和服务器实现了名字到地址转换的功能。
DNS将原来一张存有映射关系的表格,转变为一棵树形结构的映射树。
不同节点的字节点可以有相同的命名,叶节点代表主机
如:robot.ai.cs.yale.edu.就表示一台主机。
域名的管理:
域与物理网络无关,同一域可在不同网络,同一网络可在不同域,域的划分是逻辑的,而不是物理的。
DNS的一种简单设计是在因特网上只使用一个DNS服务器,该服务器包含所有的映射。
但只有一个DNS服务器,容易出现:
解决方案:区域(zone)
以层次结构划分区域,将DNS名字空间划分为互不相交的区域,每个区域都会存在自己的DNS服务器,维护着这个区域主机名-IP地址映射的信息。上一层区域的服务器区域会有下层区域服务器的路径信息。
以区域方式来组织DNS的服务,就会使用大量的DNS服务器;因此,没有一台DNS服务器拥有因特网上所有其他主机的映射。相反,所有的映射分布在所有的DNS服务器上。
大致上来说,存在3种DNS服务器:
1、根DNS服务器;2、顶级域(Top-Level Domain,TLD)DNS服务器;3、权威域名服务器。
根DNS服务器:
有400多个根域名服务器遍及全世界,由13个不同的组织管理。根域名服务器提供TLD服务器的IP地址。
顶级域DNS服务器:
TLD服务器提供了权威域名服务器的IP地址。
权威DNS服务器:
在因特网上具有公共可访问主机的每个组织机构必须提供公共可访问的DNS记录(主机名-IP地址映射的记录),一个组织机构的权威DNS服务器收藏了这些DNS记录。
本地DNS服务器:
严格来说,本地DNS服务器不属于该服务器的层次结构,但它对服务器的层次结构至关重要。
每个ISP都会有一台本地服务器,当主机与ISP连接时,该ISP记录主机的主机名-IP地址映射记录,该主机通过DHCP,获得一台或多台本地DNS服务器的IP地址。
本地DNS服务器起到代理的作用,主机发出的DNS请求都会被发送给本地DNS服务器,并将请求转发到DNS服务器层次结构种。
假设主机cis.poly.edu想获取主机gaia.cs.umass.edu的IP地址,同时假设主机cis.poly.edu的本地DNS服务器为dns.poly.edu,主机gaia.cs.umass.edu的权威服务器为dns.umass.edu;如下图所示:
DNS查询过程:
递归查询与迭代查询的不同之处在于:本地DNS服务器只会发出一次DNS查询报文,剩下的查询工作由上层DNS服务器完成。如下图:
递归查询的名字解析负担都放在当前联络的名字服务器上,会导致根服务器的负担太重;解决方案是使用迭代查询。
为了改善时延性能并减少在因特网上到处传输的DNS报文数量,DNS广泛的使用了缓存技术。
某个DNS服务器接收到一个回答,它能够缓存包含在该回答中的任何信息。若DNS服务器中缓存了一台主机名/IP地址对,该DNS服务器就能绕开其他的DNS服务器访问,直接提供所要求的IP地址。
由于主机名-IP地址的映射不是永久的,所以DNS服务器在一段时间后(通常设置两天)将缓存信息丢弃。事实上,因为缓存,除了少数DNS查询以外,根服务器被绕过了。
共同实现DNS分布式数据库的所以DNS服务器存储了资源记录(Resource Record,RR),RR是一个包含了下列字段的4元组:
( N a m e , V a l u e , T y p e , T T L ) (Name,Value,Type,TTL) (Name,Value,Type,TTL)
下列例子忽略TTL
如果Type=A:Name为主机名,Value为映射的IP地址。
如(relay1.bar.foo.com,145.17.93.126,A),relay1.bar.foo.com主机映射的IP地址为145.17.93.126
如果Type=NS:Name是个域,Value是 中间/权威 DNS服务器的主机名。这个记录用于沿着查询链来路由DNS查询
如果Type=CNAME:Value是别名为Name的主机对应的规范主机名。该记录能够向查询的的主机提供一个主机名对应的规范主机名
如果Type=MX:Value是别名为Name的邮件服务器对应的规范主机名。该记录允许邮件服务器主机名具有简单的别名
- 如果一台服务器是某特定主机的权威DNS服务器,那么该服务器会有一条包含该主机名到IP地址映射的A类RR
- 如果一台服务器不是某特定主机的权威DNS服务器,,那么该服务器会有一条包含该主机名到域的NS类RR,还将包含一条指向该域的A类RR
关于DNS报文,不做过多介绍。DNS只包含查询报文和回答报文,且具有相同的格式。
假设刚创建了一家名字为Network Utopia的公司,
完成以上步骤,人们就能访问我的Web站点,向公司内的员工发送邮件。
P2P好处:搭建极少的服务器,存在大量的结点相互服务。任意端系统都可以直接通信。
纯P2P架构应用例子:
所有用户都从服务器获取文件
问题:
n台主机从服务器获取大小为F的文件最少需要多长时间?
答:
设总分发时间为 D c s D_{cs} Dcs
第i台主机下载F大小文件的时间: F d i \frac{F}{d_i} diF。最大的取 m a x { F d i } max\{\frac{F}{d_i}\} max{diF}作为用户获取大小F文件的下载时间,即最小分发时间为 F d m i n \frac{F}{d_{min}} dminF。
服务器必须向N台主机传输F文件的副本,所以分发n个F大小文件的时间: N ⋅ F u s \frac{N\cdot F}{u_s} usN⋅F
则 D c s ≥ m a x { F d m i n , n ⋅ F u s } D_{cs}≥max\{\frac{F}{d_{min}},\frac{n\cdot F}{u_s}\} Dcs≥max{dminF,usn⋅F}
∴最少时间= m a x { F d m i n , n ⋅ F u s } max\{\frac{F}{d_{min}},\frac{n\cdot F}{u_s}\} max{dminF,usn⋅F}
当N变得很大时,主机获取文件速度大致不变,而服务器发送文件时间线性增加(服务器性能成为瓶颈)。
主机可以从另一台主机获取文件,即对等方可以帮助分发文件
问题:
N台主机从服务器获取大小为F的文件最少需要多长时间?
答:
设总分发时间为 D p 2 p D_{p2p} Dp2p
服务器至少上传一份文件: F u s \frac{F}{u_s} usF。【服务器发送过的文件可能不必由服务器再次发送,因为对等方之间可以彼此分发这个文件】
每台主机至少下载一次: F d m i n \frac{F}{d_{min}} dminF 【取最大的】
整体系统可提供的上载能力: u s + ∑ u i u_s+∑u_i us+∑ui
因此整体系统的最小分发时间为: N ⋅ F u s + ∑ u i \frac{N\cdot F}{u_s+∑u_i} us+∑uiN⋅F【分子是一共要下载N份F大小的文件;分母是服务器上载带宽+ ∑ u i ∑u_i ∑ui是各主机共同提供的上载带宽】
则 D p 2 p ≥ m a x { F u s , F d m i n , N ⋅ F u s + ∑ u i } D_{p2p}≥max\{\frac{F}{u_s},\frac{F}{d_{min}},\frac{N\cdot F}{u_s+∑u_i}\} Dp2p≥max{usF,dminF,us+∑uiN⋅F}
∴最少时间= m a x { F u s , F d m i n , N ⋅ F u s + ∑ u i } max\{\frac{F}{u_s},\frac{F}{d_{min}},\frac{N\cdot F}{u_s+∑u_i}\} max{usF,dminF,us+∑uiN⋅F}
随着n的增加,获取文件时间在增加,但并非线性增加,增加较为缓慢。
通过上图可知,C/S体系结构随着对等方的数量增加,分发时间呈线性增长并没有上界。P2P体系结构的分发时间总是小于C/S体系结构的分发时间,且随着对等方的数量增加,会缓慢增长。
因为P2P的对等方除了是文件的消费者还是文件的重新分发者,所以P2P体系结构的应用程序是能够自扩展的。
BitTorrent是一种用于分件分发的流行P2P协议。
BitTorrent术语
BitTorrent流程举例:
如下图;一个新的对等方Alice加入到洪流中,追踪器随机从参与对等方的集合中选择对等方的一个子集,并将这个子集的IP地址发送给Alice。
Alice获得对等方的IP列表后,尝试与列表上的所有对等方创建TCP连接;我们称成功与Alcie创建TCP连接的对等方为“邻近对等方”。下图中有3个邻近对等方与Alice创建了TCP连接。
随着时间的流逝,某些对等方可能会离开,原本子集以外的对等方会试图与Alice创建TCP连接;因此一个对等方的邻近对等方将随着时间而波动。
- 某个对等方收到所需要的全部资源,可以“无私”的留下为其他对等方提供上载能力,也可以“自私”的离开洪流。
- 同时,任何对等方可能在仅拥有文件子集的时候退出洪流,并在以后重新加入洪流
在某个时间点,每个对等方将具有来自文件的块的子集,且不同对等方拥有不同的块子集。
【各对等方不一定有全部的文件块,但完整的文件块一定在洪流中】
Alice会周期性的通过TCP连接询问每个邻近对等方它所具有的文件块列表。有了这个列表就可以通过TCP连接发出还没有的块的请求。
两个问题:
这里采用最稀缺优先的技术。优先申请Alice没有的块且该块在她的邻近中副本数量最少的,即优先申请最稀缺的块。
所以最稀缺的块能够得到更迅速的分发,能够均衡每个块在洪流中的数量。
2.Alice收到诺干个对等方申请后,应该先响应谁呢?
Alice会根据能够以最高速率向她提供数据的邻居,给出其优先权。Alice会持续的对她的每个邻居测量收到比特的速率,并确定4个最高速率流入的邻居。每隔10s就会重新计算并更新这4个对等方集合,这过程称为“疏通”。
除此之外,没过30s,Alice还会随机选择一个邻居进行响应。这位新的邻居收到了Alice的响应,那么Alice可能会称为新邻居的前4位响应对象;反之同理,新邻居也可能会晋升为Alice的前4位响应对象。
随机响应效果是对等方会趋向于找到彼此的协调的速率上载,同时也允许新的对等方得到块,让它们具有对换的东西。
所以Alice除了响应前4个对等方+1个试探对等方外。其他对等方均被“阻塞”。