第二章 网络应用
第二章 网络应用
2.1 网络应用的基本原理
2.1 网络应用的基本原理
一、网络应用体系结构
网络应用相比于单机应用,它的特点在于:在网络的基础环境之上,有一部分软件像单机应用一样运行在我们自己的计算机上,而另一部分软件以及数据信息运行在互联网的某个角落,这两部分软件会进行交互,这样才能构成网络应用。
既然网络应用是由不同的部分组成的,那么就存在结构问题。不同的部分到底采用什么样的结构来构成一个整体?又有哪些结构可供选择呢?
1. 客户机/服务器结构(Client-Server,C/S)
⑴ 服务器
① 7*24小时提供服务;
② 永久性访问地址/域名;
③ 利用大量服务器实现可扩展性(满足大量同时请求服务的并发用户)。
⑵ 客户机
① 与服务器通信,使用服务器提供的服务;
② 间歇性接入网络;
③ 可能使用动态IP地址;
④ 不会与其他客户机直接通信。
⑶ 举例:
Web(如下图)。
2. 点对点结构(Peer-to-peer,P2P)
⑴ 特点:
① 没有永远在线的服务器;
② 任意端系统/节点之间可以直接通讯;
③ 节点间歇性接入网络;
④ 节点可能改变IP地址。
⑵ 优缺点:
① 优点:高度可伸缩(后面解释意思);
② 缺点:难以管理。
⑶ 举例:
文件共享。
3. 混合结构(Hybrid)
能否将两种结构混合在一起使用?混合能够利用两者的优点同时规避两者的缺点吗?
Napster结构:
⑴ 文件传输使用P2P结构;
⑵ 文件的搜索采用C/S结构——集中式。
① 每个节点向中央服务器登记自己的内容;
② 每个节点向中央服务器提交查询请求,查找感兴趣的内容。
二、网络应用进程通信
自己计算机上的进程要与服务器上的进程进行通信,这样才能完成网络应用的特定功能。
1. 网络应用的基础:进程间通信
进程:主机上运行的程序。
同一主机上运行的进程之间如何通信?进程间通信机制;操作系统提供。
不同主机上运行的进程间如何通信?消息交换技术(也叫报文交换)。
⑴ 客户机进程: 发起通信的进程。
⑵ 服务器进程: 等待通信请求的进程。
2. 套接字(Socket)
不同进程之间的通信是通过一种叫做套接字(Socket)的机制实现的。进程间通信利用socket发送/接收消息。
类似于寄信:发送方将消息送到门外邮箱;发送方依赖(门外的)传输基础设施将消息传到接收方所在主机,并送到接收方的门外;接收方从门外获取消息。
3. 如何寻址进程?
不同主机上的进程间通信,那么每个进程必须拥有标识符,这样才能把消息送到指定主机。
⑴ 寻址主机
如何寻址主机?——IP地址
Q:主机有了IP地址后,是否足以定位进程?
A:否。同一主机上可能同时有多个进程需要通信。
⑵ 寻址进程
如何在一台主机上寻址进程?——端口号(Port number):
为主机上每个需要通信的进程分配一个端口号
有些端口已经被占用了,就不能再使用。例如HTTP服务运行在80号端口,Mail服务运行在25号端口。
⑶
进程的标识符 = IP地址 + 端口号
。
4. 应用层协议
具体来说,消息交换应该使用什么格式?应该遵循怎样的顺序?这些问题都由应用层协议来确定。
⑴ 网络应用需遵循应用层协议。
⑵ 公开协议
① 由RFC(Request For Comments)定义;
② 允许互操作;
③ HTTP,SMTP,……
⑶ 私有协议
多数P2P文件共享应用。
5. 应用层协议的内容
⑴ 消息的类型(type):
① 请求消息;
② 响应消息。
⑵ 消息的语法(syntax)/格式:
① 消息中有哪些字段(field)?
② 每个字段如何描述?
⑶ 字段的语义(semantics):
字段中信息的含义。
⑷ 规则(rules):
① 进程何时发送/响应消息?
② 进程如何发送/响应消息?
三、网络应用需求与传输层服务
1. 网络应用对传输服务的需求
⑴ 数据丢失(data loss)/ 可靠性(reliability)
① 某些网络应用能够容忍一定的数据丢失:网络电话;
② 某些网络应用要求100%可靠的数据传输:网上银行,文件传输,telnet。
⑵ 时间(timing)/ 延迟(delay)
有些应用只有在延迟足够低时才“有效”,例如:网络电话、网络游戏。
⑶ 带宽(bandwidth)
① 某些应用只有在带宽达到最低要求时才“有效”:网络视频;
② 某些应用能够适应任何带宽——弹性应用:emai。
⑷ 其他要求
安全性等。
⑸ 举例:典型网络应用对传输服务的需求
可以看到,e-mail要求数据无丢失,但是对带宽和延迟没有要求;视频电话允许有数据丢失,但是对带宽和延迟要求很高。
2. Internet提供的传输服务
⑴ TCP服务
① 面向连接:客户机/服务器进程间需要建立连接;
② 可靠的传输;
③ 流量控制:发送方不会发送速度过快,超过接收方的处理能力;
④ 拥塞控制:当网络负载过重时能够限制发送方的发送速度;
⑤ 不提供时间 / 延迟保障;
⑥ 不提供最小带宽保障。
⑵ UDP服务
① 无连接;
② 不可靠的数据传输;
③ 不提供可靠性保障;
④ 不提供流量控制;
⑤ 不提供拥塞控制;
⑥ 不提供延迟保障;
⑦ 不提供带宽保障。
⑧ 但是UDP给了应用层自由。
⑶ 典型网络应用所使用的传输层服务
可以看到,e-mail选择了最可靠的TCP服务;而互联网电话则选择了UDP,虽然UDP不提供任何保障,但是可以采取其他措施来保障互联网电话的带宽和延迟。
2.2 Web网络应用
2.2 Web网络应用
一、Web应用和HTTP协议概述
1. Web应用概述
⑴ Web的要素
① 网页
② 网页互相链接
⑵ 网页(Web Page)
网页(Web Page)包含多个对象(objects)
① 对象:HTML文件、JPEG图片、视频文件、动态脚本等
② 基本HTML文件:包含对其他对象引用的链接
⑶ 对象的寻址(addressing)
① URL(Uniform Resoure Locator):统一资源定位器(又叫统一资源地址)。
② Scheme://host:port/path(协议://主机域名、IP地址:端口号/文件路径)
③ www.someschool.edu/someDept/pic.gif:其中http://协议省略, www.someschool.edu是主机域名,someDept是文件目录,pic.gif是文件名;他们在一起构成了URL,URL使得互联网上所有的文件都有了唯一的标识符。
2. HTTP协议概述
万维网应用遵循什么协议?
⑴ 超文本传输协议(HyperText Transfer Protocol)
⑵ HTTP采用C/S结构
① 客户——Browser:请求、接收、展示Web对象;
② 服务器——Web Server:响应客户的请求,发送对象。
⑶ HTTP版本:
① HTTP1.0;
② HTTP1.1。
⑷ TCP传输服务
Web网络的应用层协议是HTTP,那么传输层协议是什么呢?是TCP。
① 服务器在80端口等待客户的请求;
② 浏览器发起到服务器的TCP连接(创建套接字Socket);
③ 服务器接受来自浏览器的TCP连接;
④ 浏览器(HTTP客户端)与Web服务器(HTTP服务器)交换HTTP消息(请求消息和响应消息);
⑤ 关闭TCP连接。
⑸ HTTP协议是一个无状态(stateless)协议
① 服务器不维护任何有关客户端过去所发请求的信息;
② 意思是,若客户2分钟前请求过HTTP消息,现在再请求HTTP消息,服务器不会因为这2分钟之内HTTP消息没有更改过而拒绝客户的请求。
③ 有状态的协议有什么问题?需维护状态(历史信息);如果客户或服务器失效,会产生状态的不一致,解决这种不一致代价高(比如重启,若状态不一致,协议就无法工作)。
二、HTTP连接类型
Web所遵循的应用层协议是HTTP,而HTTP依靠TCP来建立连接。在对TCP的使用上,有两种不同的使用方法(也叫两种不同的HTTP连接类型)。
1. 非持久性连接(NonpersistentHTTP)
⑴ 特点:
① 每个TCP连接最多允许传输一个对象;
② 每次连接只传输一个文件,传输完毕就关闭连接;
③ HTTP 1.0版本使用非持久性连接。
⑵ 工作流程
① 第1步 建立连接;
② 第2步 传输文件;
③ 第4步 体现“非持久性连接”的特点,每次连接只传输一个文件,传输完毕就关闭连接;
④ 第5步 网页图片没显示全,只能再向服务器要。
⑶ 响应时间分析与建模
① RTT(Round Trip Time):从客户端发送一个很小的数据包到服务器并返回所经历的时间。
② 响应时间(Response time):
ⅰ 发起、建立TCP连接:1个RTT;
ⅱ 发送HTTP请求消息到HTTP响应消息的前几个字节到达:1个RTT;
ⅲ 响应消息中所含的文件/对象传输时间。
③ 每一次传输的Total = 2RTT + 文件发送时间。在上例中,所有建立连接的时间为2+10×2RTT=22RTT,因此Total = 22RTT + 文件发送时间。
⑷ 非持久性连接的问题
① 每个对象需要2个RTT;
② 操作系统需要为每个TCP连接开销资源(overhead);
③ 浏览器会怎么做?
• 打开多个并行的TCP连接以获取网页所需对象;一旦知道还需要请求10个文件,就并行地建立10个TCP连接;
• 给服务器端造成什么影响?十分慢。
2. 持久性连接(Persistent HTTP)
⑴ 特点:
① 每个TCP连接允许传输多个对象;
② 发送响应后,服务器保持TCP连接的打开;
③ 后续的HTTP消息可以通过这个连接发送;
④ HTTP 1.1版本默认使用持久性连接。
⑵ 无流水(pipelining)的持久性连接
① 客户端只有收到前一个响应后才发送新的请求;
② 每个被引用的对象耗时1个RTT;
③ 上例Total = 12RTT + 文件发送时间。(2+1×10)
⑶ 带有流水机制的持久性连接
① HTTP 1.1的默认选项;
② 客户端只要遇到一个引用对象就尽快发出请求;
③ 理想情况下,收到所有的引用对象只需耗时约1个RTT;
④ 上例Total = 3RTT + 文件发送时间。(2+1)
三、HTTP消息格式
HTTP协议有两类消息:请求消息(request)、响应消息(response)。
1. HTTP请求消息
⑴ 请求消息使用ASCII码写的
以下图为例:
① 请求行:请求命令(GET),URL,HTTP版本;
② 头部行:要访问的地址;
③ 头部行:浏览器类型(不同的浏览器对网页有不同的解释,不完全兼容);
④ 头部行:连接可以关闭了;
⑤ 头部行:接受的语言。
⑥ 空行表示消息结束。
⑵ HTTP请求消息的通用格式
下图大致与上图相同,其中Entity Body是数据,比如登陆邮箱需要上传密码,填写信息需要上传表单。
那么上传信息应该采用什么方式?
⑶ 上传输入的方法
① POST方法:替代上面的GET;网页经常需要填写表格(form),POST可以在请求消息的消息体(entity body)中上传客户端的输入。
② URL方法:如果数据比较少,可以仍使用GET方法,在输入信息的request行的URL字段上传。例如:www .somesite.com/animalsearch?monkeys&banana。
⑷ 请求命令(方法)的类型
① HTTP/1.0:
ⅰ GET;
ⅱ POST;
ⅲ HEAD:请Server不要将所请求的对象放入响应消息中(用于测试)。
② HTTP/1.1:
ⅰ GET、POST、HEAD;
ⅱ PUT:将消息体中的文件上传到URL字段所指定的路径;
ⅲ DELETE:删除URL字段所指定的文件。
2. HTTP响应消息
⑴ 响应消息也是用ASCII码写的
以下图为例:
① 状态行:HTTP版本,返回的状态代码,解释(OK代表请求已满足);
② 头部行:连接可以关闭了;
③ 头部行:Web服务器生成响应消息的时间;
④ 头部行:服务器软件类型;
⑤ 头部行:上次修改时间;
⑥ 头部行:文本长度;
⑦ 头部行:文本类型;
⑧ 空行表示消息结束;
⑨ 数据。
⑵ HTTP响应状态代码
① 响应消息的第一行;
② 示例:
200 OK
301 Moved Permanently
400 Bad Request
404 Not Found
505 HTTP Version Not Supported
四、Cookie技术
⑴ 为什么需要Cookie?
① HTTP协议无状态;
② 但是很多应用需要服务器掌握客户端的状态,如网上购物,应如何实现状态的记录?
⑵ Cookie技术
实际上,最原始的Cookie技术是:客户的信息保存在本地,客户每次访问网站时,把自己的信息添加到头部行中,发送给服务器,这样一来的话,用户每次发送的请求消息会很庞大。为了解决这个问题,可以使用由Cookie技术延伸而来的Session技术,与原始的Cookie技术不同的是,Session技术会在服务器建立一个数据库,把用户的信息存储在服务器的数据库里,每次用户发送请求消息时,只需要携带自己的ID即可。
① Cookie技术:某些网站为了辨别用户身份、进行会话(session)跟踪而储存在用户本地终端上的数据(通常经过加密)。
② Cookie的组件:
ⅰ 在HTTP响应消息中添加一个cookie头部行;
ⅱ 在HTTP请求消息中添加一个cookie头部行;
ⅲ 添加一个保存在客户端主机上的cookie文件,由浏览器管理;
ⅳ 在Web服务器端建立一个后台数据库。
⑶ Cookie的原理
以下图为例:
① 发送不带Cookie行的常规HTTP请求消息;
② 服务器发现该用户是新用户,为他创建ID:1678;
③ 将ID与客户的信息放入服务器的数据库;
④ 返回响应消息时多加一个cookie头部行Set-Cookie;
⑤ 浏览器解析响应消息的cookie头部行,在自己的Cookie文件中加一行Cookie;
⑥ 再次访问网站时,请求消息就多了一个cookie头部行;
⑦ 服务器就可以通过请求消息的cookie头部行来标识该用户,并作出面向该用户的特定动作(如喜好推荐);
⑧ 在此之后,重复上述操作。
⑷ Cookie的作用
① Cookie能够用于:身份认证、购物车、推荐、Web、e-mai。
② Cookie涉及的隐私问题十分严重。
五、Web缓存/代理服务器技术
⑴ 功能和好处
① 功能:在不访问服务器的前提下满足客户端的HTTP请求。
② 好处:
ⅰ 缩短客户请求的响应时间;
ⅱ 减少机构/组织的流量;
ⅲ 在大范围内(Internet)实现有效的内容分发。
⑵ 如何实现?
① 在用户和服务器之间建立代理服务器;
② 用户设定浏览器通过缓存进行Web访问;
③ 浏览器向缓存/代理服务器发送所有的HTTP请求;
ⅰ 如果所请求对象在缓存中,缓存返回对象
ⅱ 否则,缓存服务器向原始服务器发送HTTP请求,获取对象,返回给客户端,并将该对象保存在代理服务器中;
④ 缓存既充当客户端,也充当服务器;
⑤ 一般由ISP(Internet服务提供商)架设。
⑶ Web缓存示例
① 假定:
ⅰ 对象的平均大小 = 100,000比特;
ⅱ 机构网络中的浏览器平均每秒有15个到原始服务器的请求;
ⅲ 从机构路由器到原始服务器的往返延迟(RTT) = 2秒;
② 网络性能分析:
ⅰ 局域网(LAN)的利用率 = 15%(15个对象 × 100,000b ÷ 10Mbps);
ⅱ 接入互联网的链路的利用率 = 100%,延迟非常大(1.5M ÷ 1.5M);
ⅲ 总的延迟 = 互联网上的延迟 + 访问延迟 + 局域网延迟 = 2秒 + 几分钟 + 几微秒。
⑷ 解决方案1
① 解决方案1:
提升互联网接入带宽 = 10Mbps;
② 网络性能分析:
ⅰ 局域网(LAN)的利用率 = 15%;
ⅱ 接入互联网的链路的利用率 = 15%(1.5M ÷ 10M);
ⅲ 总的延迟=互联网上的延迟+访问延迟+局域网延迟=2秒 + 几微秒 + 几微秒;
③ 问题:
成本太高。
⑸ 解决方案2
① 解决方案1:
安装Web缓存,假定缓存命中率是0.4;
② 网络性能分析:
ⅰ 40%的请求立刻得到满足,60%的请求通过原始服务器满足;
ⅱ 接入互联网的链路的利用率下降到60%,从而其访问延迟可以忽略不计,例如10微秒;
ⅲ 总的延迟 = 互联网上的延迟 + 访问延迟 + 局域网延迟 = 0.6 × 2秒 + 10微妙 + 0.4 × 几微秒;
③ 优点:
成本低,效果好。
⑹ 条件性GET方法
上述解决方案有一个问题:如何知道缓存的内容就是服务器上最新的版本呢?
① 目标(基本思想):如果缓存有最新的版本,则缓存服务器不需要发送请求对象;
② 实现:
ⅰ 在HTTP请求消息中声明所持有版本的日期 If-modified-since: < date >;
ⅱ 如果在该日期之后内容有改动,则服务器发回内容(如下图虚线上方),否则只需告诉没改,不用发回内容(如下图虚线上方);
2.3 Email网络应用
2.3 Email网络应用
一、Email应用的构成
1. Email应用的构成组件
⑴ 邮件客户端(user agent)
① 读、写Email消息;
② 与服务器交互,收、发Email消息;
③ Outlook,Foxmail,Thunderbird等典型邮件客户端;
④ Web客户端,浏览器也可以是邮件客户端。
⑵ 邮件服务器
① 为每一个用户分配一个邮箱:存储发给该用户的Email;
② 创建一个消息队列(message queue):存储等待发送的Email。
⑶ SMTP协议(Simple Mail Transfer Protocol)
① 邮件服务器之间传递消息所使用的协议;
② 客户端是指:发送消息的服务器;
③ 服务器是指:接收消息的服务器。
2. SMTP协议
⑴ 使用TCP进行email消息的可靠传输;
⑵ 端口25;
⑶ 传输过程的三个阶段:
① 握手,建立连接;
② 消息的传输;
③ 关闭。
⑷ 命令/响应交互模式
① 命令(command): ASCII文本;
② 响应(response): 状态代码和语句。
(HTTP使用的是请求/响应模式)
⑸ Email消息只能包含7位ASCII码
过于古老,只能处理文本。那么如何处理图片、音频、视频呢?
3. SMTP交互示例
① S(服务器):发送220,表明自己是hamburger.edu;
② C(客户):发送HELO打招呼,表明自己是crepes.fr;
③ S:回复250,Hello打招呼,成功建立连接;
④ C:有一封邮件,来自<alice @crepes.fr>;
⑤ S:回复250,确认发送者邮箱;
⑥ C:邮件要发给<bob @hamburger.edu>;
⑦ S:回复250,确认接收者邮箱;
⑧ C:发送数据;
⑨ S:回复354,请提供Mail消息,用一个点标志结束;
⑩ C:回复邮件消息本身;
⑩① S:消息已经顺利接收;
⑩② C:用户退出;
⑩③ S:回复221,关闭连接。
4. SMTP协议的特点
⑴ 使用持久性连接;
⑵ 要求消息必须由7位ASCII码构成;
⑶ SMTP服务器利用CRLF.CRLF(回车换行、点、回车换行)确定消息的结束。
⑷ 与HTTP对比:
① HTTP: 拉式(pull)(使用服务器的一方主动把服务器拉回本地);
② SMTP: 退式(push)(由发送方主动把消息推送到接收方);
③ 都使用命令/响应交互模式;
④ 命令和状态代码都是ASCII码;
⑤ HTTP:每个对象封装在独立的响应消息中;
⑥ SMTP:多个对象在由多个部分构成的消息中发送;
二、Email消息格式与POP协议
1. Email消息格式
⑴ 文本消息格式标准
① 头部行(header)
To(收件人)
From(发件人)
Subject(邮件标题)
② 消息体(body)
消息本身
只能是ASCII字符
与服务器交互,收、发Email消息;
⑵ 多媒体扩展
① MIME:多媒体邮件扩展
通过在邮件头部增加额外的行以声明MIME的内容类型。
2. 邮件访问协议
邮件的传输协议是SMTP,从服务器获取邮件要使用邮件的访问协议。(Email应用使用了不止一个应用层协议)
⑴ POP: Post Office Protocol
认证/授权(客户端←→服务器)阶段和下载阶段
⑵ IMAP: Internet Mail Access Protocol
① 更多功能;
② 更加复杂;
③ 能够操纵服务器上存储的消息。
⑶ HTTP:163,QQ Mail等。
基于Web的网络应用的确使用HTTP进行邮件访问。
3. POP协议
⑴ 认证过程
① 客户端命令
User:声明用户名;
Pass:声明密码。
② 服务器响应
+OK:合法用户;
-ERR:密码错误。
⑵ 事务阶段
① List:列出消息数量;
② Retr:用编号获取消息;
③ Dele:删除消息;
④ Quit:退出。
上图中,S:1 498 代表1号邮件大小为498,1即所谓编号;retr为下载,dele为删除。
⑶ 模式
① “下载并删除”模式:
用户如果换了客户端软件,无法重读该邮件,但是节省空间,历史上用得多;
② “下载并保持”模式:
不同客户端都可以保留消息的拷贝,但是浪费空间,现在用得多。
⑷ POP3协议是无状态的
3. IMAP协议
⑴ 所有消息统一保存在一个地方:服务器;
⑵ 允许用户利用文件夹组织消息;
⑶ IMAP支持跨会话(Session)的用户状态(即所有客户端均同步)。
2.4 DNS网络应用
2.4 DNS网络应用
一、DNS概述
1. 域名解析系统(DNS)简介
在网络连接中,存在着Internet上主机/路由器的识别问题。解决这个问题很简单:给每一台主机一个唯一的标识符,即IP地址。但是IP地址是一串数字,不利于日常使用,因此我们平时使用的是域名,例如www.xxx.edu.cn。
那么问题就来了,域名和IP地址之间如何映射?
域名解析系统(DNS):能够将域名翻译为IP地址。
⑴ DNS是多层命名服务器构成的分布式数据库;
⑵ DNS是应用层协议,用于完成名字的解析。
2. DNS提供的服务
⑴ 域名向IP地址的翻译;
⑵ 别名服务;
⑶ 负载均衡:
某些网站的访问量十分巨大,一个服务器不能满足需求,就需要为一个域名配置多个服务器。当进行域名向多个服务器的IP地址的翻译时,可以提供一个域名到多个IP地址的映射,只需要调整多个IP地址的顺序,让用户访问排名第一的IP地址,而多个IP地址轮流排名第一,就能实现负载均衡。
3. 为什么不使用集中式的DNS?
⑴ 单点失败问题
如果这一个DNS服务器出现故障,整个互联网都将瘫痪;
⑵ 流量问题
全世界的主机都将访问这一台DNS服务器,届时流量将非常巨大;
⑶ 距离问题
这一台DNS设置在什么位置,离哪个国家近,哪个国家远,都是难以解决的问题;对于那些距离这一台DNS服务器距离很远的国家而言,时间延迟的问题很严重;
⑷ 维护性问题
流量巨大、稳定性要求极高的服务器,维护难度非常高。
4. 分布式层次式数据库
⑴ 根服务器
⑵ 顶级域名服务器(com)
⑶ 权威域名服务器(企业、学校)
5. 查询IP地址举例
客户端想要查询www.amazon.com的IP
① 客户端查询根服务器,找到com域名解析服务器;
② 客户端查询com域名解析服务器,找到amazon.com域名解析服务器;
③ 客户端查询amazon.com域名解析服务器,获得www.amazon.com的IP地址。
集中式不可取,分布式也有其缺点:查询次数非常多,效率比较低。
6. 根域名服务器
① 本地域名解析服务器无法解析域名时,访问根域名服务器;
② 根域名服务器如果知道该域名的映射,就直接返回给本地域名服务器;
③ 如果不知道映射,就访问权威域名服务器,获得映射,再向本地域名服务器返回映射。
7. 顶级域名服务器(TLD, top-level domain)
负责com,org,net,edu等顶级域名和cn,uk,fr等国家顶级域名。
Network Solutions维护com顶级域名服务器;Educause维护edu顶级域名服务器。
8. 权威(Authoritative)域名服务器
组织(企业、学校)的域名解析服务器,提供组织内部服务器的解析服务。
9. 本地域名解析服务器
⑴ 不严格属于层级体系;
⑵ 每个ISP有一个本地域名服务器;
① ISP:Internet服务提供商
② 本地域名服务器也称为默认域名解析服务器
⑶ 当主机进行DNS查询时,查询被发送到本地域名服务器。
① 若本地域名服务器已经缓存了该域名,就直接返给主机;
② 否则由本地域名服务器作为代理(proxy),将查询转发给上面所说的(层级式)域名解析服务器系。
10. DNS查询示例
例如Cis.poly.edu的主机想获得gaia.cs.umass.edu的IP地址:
⑴ 迭代查询
① 被查询服务器返回域名解析服务器的名字;
② “我不认识这个域名,但是你可以问题这个服务器”。
⑵ 递归查询
将域名解析的任务交给所联系的服务器。
11. DNS记录缓存和更新
⑴ 只要域名解析服务器获得域名—IP映射,即缓存这一映射;
① 一段时间过后,缓存条目失效(删除);
② 本地域名服务器一般会缓存顶级域名服务器的映射,因此根域名服务器不经常被访问。
⑵ 记录的更新和通知都有一定的机制。
二、DNS记录和消息格式
DNS是多层命名服务器构成的分布式数据库,那么数据库里存储信息的格式是什么样的?
1. DNS记录
⑴ 也称做资源记录(RR,resource records)。
⑵ 格式:四元组(name,value,type,ttl)。
① Type=A
Name: 主机域名
Value: IP地址
② Type=NS
Name: 域(edu.cn)
Value: 该域权威域名解析服务器的主机域名
③ Type=CNAME
Name: 某一真实域名的别名 www.ibm.com -> servereast.backup2.ibm.com
Value: 真实域名
④ Type=MX
Value是与name相对应的邮件服务器
2. DNS协议与消息格式
⑴ DNS协议:
① 查询(query)和回复(reply消息);(HTTTP:请求响应 SMTP:命令响应)
② 查询和回复的消息格式相同。
⑵ 消息头部
① Identification: 16位查询编号,回复使用相同的编号;
② flags(标志位)(标志是查询或回复、是否期望递归、递归是否可用、是否是权威回答)
3. 如何注册域名?
例子:你刚刚创建了一个公司 “Network Utopia”:
⑴ 在域名管理机构(如Network Solutions)注册域名networkutopia.com;
① 向域名管理机构提供你的权威域名解析服务器的名字和IP地址;
② 域名管理机构向com顶级域名解析服务器中插入两条记录。
⑵ 在权威域名解析服务器中为www.networkuptopia.com加入Type A记录,为networkutopia.com加入Type MX记录。
2.5 P2P应用:原理与文件分发
2.5 P2P应用:原理与文件分发
前面已经学习过了Web应用、Email应用、DNS应用,这些都是CS架构的应用,下面来学习P2P结构的应用。
一、纯P2P架构的特点
1. 没有服务器;
2. 任意端系统之间直接通信;
3. 节点阶段性接入Internet;
4. 节点可能更换IP地址;
5. 缺点:复杂、难以管理。
二、以文件分发为例:C/S vs. P2P
问题 : 从一个服务器向N个节点分发一个文件需要多长时间?
1. 客户机/服务器架构下文件分发
⑴ 服务器串行地发送N个副本,所需时间:
N
F
u
s
\frac{NF}{u_{s}}
u
s
NF
⑵ 客户机
i
i
i
需要
F
d
i
\frac{F}{d_{i}}
d
i
F
时间下载
总的时间为:
一般来说,
N
N
N
非常大,因此总时间一般是随着
N
N
N
线性增大的。
2. P2P架构下文件分发
P2P的特点在于,每台主机之间都可以进行文件共享。
⑴ 服务器必须发送一个副本,时间:
F
u
s
\frac{F}{u_{s}}
u
s
F
⑵ 客户机
i
i
i
需要
F
d
i
\frac{F}{d_{i}}
d
i
F
时间下载
⑶ 总共需要下载
N
F
NF
NF
比特
⑷ 最快的可能上传速率:
u
s
+
Σ
u
i
u_{s}+\Sigma u_{i}
u
s
+
Σ
u
i
总的时间为:
3. 具体的例子
客户端上传速率
=
u
= u
=
u
,
F
u
=
\frac{F}{u} =
u
F
=
1小时,
u
s
=
10
u
u_{s} = 10u
u
s
=
10
u
,
d
m
i
n
≥
u
s
d_{min} ≥ u_{s}
d
min
≥
u
s
可以看出,P2P对于文件分发这个应用,具有很好的扩展性。
4. 文件分发协议:BitTorrent
⑴ torrent: 交换同一个文件的文件块(chunk)的节点组(即哪些主机正在相互传输同一个文件);
⑵ tracker: 跟踪参与torrent的节点(即记录torrent);
⑶ 某个节点(Alice)申请加入torrent,要先从tracker获取节点列表,然后和某些其他节点建立连接,传输文件块(chunk)。
5. BitTorrent的特点
⑴ 文件划分为256KB的chunk;
⑵ 节点在加入torrent时,没有chunk,但是会逐渐积累,向tracker注册以获得节点清单,与某些节点(“邻居”)建立连接;
⑶ 下载的同时,节点需要向其他节点上传chunk;
⑷ 节点可能加入或离开;
⑸ 一旦节点获得完整的文件,它可能(自私地)离开或(无私地)留下。
6. BitTorrent的获取发送规则
⑴ 获取chunk:
① 给定任一时刻,不同的节点持有文件的不同chunk集合;
② 节点(Alice)定期查询每个邻居所持有的chunk列表;
③ 节点发送请求,请求获取缺失的chunk。
• 稀缺优先(如果此时Alice需要两个文件,一个文件有3个节点提供,另一个文件有100和节点提供,那么一定要先获取第一个文件,因为3个节点同时退出的可能性高于100个节点同时退出的可能性)
⑵ 发送chunk:tit-for-tat(以牙还牙,一报还一报)
① 假如Alice一共向4个邻居发送chunk,那么这4位邻居的选取规则是:正在向Alice发送Chunk的邻居中速率最快的4个;
• 每10秒重新评估top 4
② 每30秒随机选择一个其他节点,向其发送chunk。
• 新选择节点可能加入top 4
• 称为“optimistically unchoke”
7. BitTorrent技术对网络性能有哪些潜在的危害?
⑴ 版权危害:
用户可以随意分享文件,无需顾虑版权;
⑵ 带宽危害:
P2P传输占用大量的带宽,影响用户使用其他网络应用;
⑶ 硬盘危害:
频繁的上传下载,损害硬盘。
2.6 P2P应用:索引技术
2.6 P2P应用:索引技术
一、索引的目的:搜索信息
P2P系统的索引:信息到节点位置(IP地址+端口号)的映射。
⑴ 文件共享(电驴)
① 利用索引动态跟踪节点所共享的文件的位置;
② 节点需要告诉索引它拥有哪些文件;
③ 节点搜索索引,从而获知能够得到哪些文件。
⑵ 即时消息(QQ)
① 索引负责将用户名映射到位置(IP地址+端口号) ;
② 当用户开启IM应用时,用户需要通知索引它自己的位置;
③ 其他节点检索索引,确定该用户的IP地址。
二、方案一:集中式索引
⑴ 节点加入时,通知中央服务器该节点的IP地址和内容;
⑵ Alice查找文件“Hey Jude”;
⑶ Alice从Bob处请求文件;
⑷ 缺点:
① 内容和文件传输是分布式的,但是内容定位是高度集中式的;
② 单点失效问题:一旦服务器失效,全体节点都无法再访问索引;
③ 性能瓶颈:所有节点都通过中央服务器查询,会成为性能瓶颈;
④ 版权问题:中央服务器容易称为版权保护组织的重点打击目标。
⑸ 因此,可以采用分布式索引,例如洪泛式查询。
三、 方案二:洪泛式查询(Query flooding)
⑴ 完全分布式架构;
⑵ 每个节点对它共享的文件进行索引,且只对它共享的文件进行索引;
⑶ 覆盖网络(overlay network): Grap;
① 节点X与Y之间如果有TCP连接,那么构成一个边;
② 所有的活动节点和边构成覆盖网络;
③ 边:虚拟链路;
④ 节点一般邻居数少于10个。
⑷ 查询过程:
① 查询消息通过已有的TCP连接发送;
② 节点转发查询消息;
③ 如果查询命中,则利用反向路径发回查询节点。
⑸ 缺点
① 消息会像洪水一样泛滥,给网络带来巨大负担;
② 能不能结合集中式与分布式来发扬各自优点,规避各自缺点?可以,层次式覆盖网络。
四、方案三:层次式覆盖网络
⑴ 介于集中式索引和洪泛查询之间的方法;
⑵ 每个节点或者是一个超级节点,或者被分配一个超级节点;
① 节点和超级节点间维持TCP连接;
② 某些超级节点对之间维持TCP连接。
⑶ 超级节点负责跟踪子节点的内容。
五、P2P案例应用:Skype
⑴ 本质上是P2P的:用户/节点对之间直接通信;
⑵ 私有应用层协议;
⑶ 索引时采用层次式覆盖网络架构;
⑷ 索引负责维护用户名与IP地址间的映射;
⑸ 索引分布在超级节点上。
要注意,只时索引时要经过超级节点,数据传输时不经过超级节点,数据传输仍是P2P的,。
2.7 Socket编程
2.7 Socket编程
一、Socket编程简介
前面介绍了很多典型的网络应用,这一节将介绍我们如何开发自己的网络应用程序。
在现有的网络应用程序开发过程中,使用较多的是套接字(Socket)网络应用编程接口,这一节就将介绍Socket编程的相关内容。
我们先简单了解一下,想要开发自己的网络应用程序,有哪些途径可选。
在网络应用程序的不同层次上,可以进行不同的开发工作,也对应着不同的开发技术,如下图。显然我们要讲的,是位于应用层和传输层之间的Socket编程方法,我们只进行端系统 (主机) 上的编程开发,而不包含路由器。
二、应用编程接口 API
根据五层参考模型,两个端系统从功能上来看都可以看作是五个层次,而应用编程接口就是应用层和传输层之间的接口。
两台主机的应用层之间的通信绝不是按照应用层协议直接通信的,而是要利用底层来传输。通常传输层之下都是操作系统在控制,应用层是应用进程在控制。应用层传输数据一定要遵循应用层协议,但是实际上传输时还是要经过下层。
那么应用进程控制的应用层和操作系统控制的其他层之间如何交互呢?显然,需要一个接口。这个接口在应用进程和底层协议之间起到桥梁作用,通过这个接口把应用进程的数据传给下层。这样的接口就称作应用编程接口。
应用编程接口API:就是应用进程的控制权和操作系统的控制权进行转换的一个系统调用接口。
几种典型的应用编程接口:
Berkeley UNIX 操作系统定义了一种 API,称为套接字接口 (socket interface),简称套接字 (socket)。
微软公司在其操作系统中采用了套接字接口API,形成了一个稍有不同的 API,并称之为Windows Socket Interface,WINSOCK。包含了套接字接口的绝大部分内容。
AT&T 为其 UNIX 系统 V 定义了一种 API,简写为 TLI (Transport Layer Interface)。
后面在介绍例子时,都是以 WINSOCK 为例。
三、Socket API概述
Socket 是一种典型的应用编程接口 API
✦ 事实上的工业标准
✦ 绝大多数操作系统都支持
✦ Internet网络应用最典型的API接口
✦ 面向客户/服务器 (C/S) 通信模型
✦ 提供应用进程间通信的抽象机制
就像是用插头把客户和服务器的套接字插在一起一样。
这里有一个问题,通常在一个主机上有很多个应用进程 (例如Web应用、电子邮件服务等等),而每一个应用进程为了支持通信,都必须创建套接字,甚至创建多个套接字。那么客户如何明确和服务器上的哪一个应用进程进行通信?即应该与哪一个套接字进行连接?
一个IP地址标识唯一的一台主机,一个端口号对应一个套接字。
标识通信端点 (对外):
✦ IP地址+端口号 (端点地址)
操作系统/进程如何管理套接字 (对内)?
✦ 套接字描述符 (socket descriptor) (是一个小整数)
四、Socket抽象
当应用进程创建套接字时,操作系统分配一个数据结构存储该套接字相关信息。
返回套接字描述符。
五、地址结构
已定义结构sockaddr_in:
Socket API 最初是面向 TCP/IP 协议栈的,但是后来可以适应各类协议栈,只需要改变地址族参数即可。
六、Socket API函数 (WinSock)
WSAStartup 和 WSACleanup 只能在 WinSock 中使用,后续不带 WSA 的函数在 UNIX 和 Linux 的 Berkeley Socket 中也可以使用。
⑴ WSAStartup
使用Socket的应用程序在使用Socket之前必须首先调用WSAStartup函数
两个参数:
✦ 第一个参数指明程序请求使用的WinSock版本
• 高位字节指明副版本、低位字节指明主版本
• 十六进制整数,例如0x102表示2.1版
✦ 第二个参数返回实际的WinSock的版本信息
• 指向WSADATA结构的指针
例:使用2.1版本的WinSock的程序代码段
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
wVersionRequested = MAKEWORD( 2, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
⑵ WSACleanup
应用程序在完成对请求的Socket库的使用, 最后要调用WSACleanup函数
解除与Socket库的绑定
释放Socket库所占用的系统资源
⑶ socket
创建套接字
操作系统返回套接字描述符 (sd)
第一个参数 (协议族): protofamily = PF_INET (TCP/IP)
第二个参数 (套接字类型):
✦ type = SOCK_STREAM, SOCK_DGRAM or SOCK_RAW (TCP/IP)
第三个参数 (协议号):0为默认
例:创建一个流套接字的代码段
struct protoent *p;
p = getprotobyname("tcp");
SOCKET sd = socket(PF_INET,SOCK_STREAM,p->p_proto);
Socket面向TCP/IP的服务类型
TCP:可靠、面向连接、字节流传输、点对点
UDP:不可靠、无连接、数据报传输
⑷ Closesocket
关闭一个描述符为sd的套接字
如果多个进程共享一个套接字,调用closesocket将套接字引用计数减1,减至0才关闭
一个进程中的多线程对一个套接字的使用无计数
✦ 如果进程中的一个线程调用closesocket将一个套接字关闭,
该进程中的其他线程也将不能访问该套接字
返回值:
✦ 0:成功
✦ SOCKET_ERROR:失败
⑸ bind
绑定套接字的本地端点地址
✦ IP地址+端口号
参数:
✦ 套接字描述符 (sd)
✦ 端点地址 (localaddr)
• 结构sockaddr_in
客户程序一般不必调用bind函数
✦ 操作系统会帮助我们设置
服务器端:
✦ 端口号使用熟知端口号
✦ IP地址呢?一个服务器通常有多个网卡多个IP地址,应该绑定哪一个?
✦ 解决方案:使用地址通配符 INADDR_ANY,IP地址赋值为 INADDR_ANY 即可
✦ 也就意味着客户可以通过任意的IP地址访问服务器
⑹ listen
置服务器端的流套接字处于监听状态
✦ 仅服务器端调用
✦ 仅用于面向连接的流套接字
设置连接请求队列大小 (queuesize):当很多请求到来时,可以在队列中缓存
返回值:
✦ 0:成功
✦ SOCKET_ERROR:失败
⑺ connect
客户程序调用connect函数来使客户套接字 (sd) 与特定计算机的特定端口 (saddr) 的套接字 (服务) 进行连接
仅用于客户端
可用于TCP客户端也可以用于UDP客户端
✦ TCP客户端:建立TCP连接
✦ UDP客户端:并不建立连接,只是指定服务器端点地址
⑻ accept
服务程序调用accept函数从处于监听状态的流套接字sd的客户连接请求队列中取出排在最前的一个客户请求,并且创建一个新的套接字来与客户套接字创建连接通道
✦ 仅用于TCP套接字
✦ 仅用于服务器
利用新创建的套接字 (newsock) 与客户通信
由于TCP连接是点对点的,因此如果服务器使用主套接字与客户连接的话,其他客户就无法连接服务器。所以要建立一个新套接字用以和客户连接,这样才能实现并发的功能。
⑼ send, sendto
send函数用于TCP套接字 (客户与服务器) 或调用了connect函数的UDP客户端套接字 (已经连接或者已经指定目的地址,因此参数中没有地址)
sendsendto函数用于UDP服务器端套接字与未调用connect函数的UDP客户端套接字 (未指定地址,因此参数中有地址)
⑽ recv, recvfrom
recv函数从TCP连接的另一端接收数据,或者从调用了connect函数的UDP客户端套接字接收服务器发来的数据 (已经知道数据来源的地址,因此参数中没有地址)
recvfrom函数用于从UDP服务器端套接字与未调用connect函数的UDP客户端套接字接收对端数据 (并不知道数据来源的地址,因此参数中有地址)
⑾ setsockopt, getsockopt
setsockopt()函数用来设置套接字sd的选项参数
getsockopt()函数用于获取任意类型、任意状态套接口的选项当前值,并把结果存入optval
Socket API函数小结
七、关于网络字节顺序
当客户端和服务器的数据表示方法不同的时候,应该如何去实现表示方法的转换?
TCP/IP的协议头中存储的二进制整数都用 网络字节顺序 (network byte order) 来表示,这是一种独立于操作系统的表示方法。
要求某些Socket API函数的参数存储为网络字节顺序 (如IP地址、端口号等)
可以实现本地字节顺序与网络字节顺序间转换的函数:
✦ htons: 本地字节顺序→网络字节顺序(16bits)
✦ ntohs: 网络字节顺序→本地字节顺序(16bits)
✦ htonl: 本地字节顺序→网络字节顺序(32bits)
✦ ntohl: 网络字节顺序→本地字节顺序(32bits)
八、网络应用的Socket API (TCP) 调用基本流程
2.8 Socket编程-客户端软件设计
2.8 Socket编程-客户端软件设计
一、解析服务器IP地址
客户端可能使用域名 (如:study.163.com) 也可能使用IP地址 (如:123.58.180.121) 标识服务器
而IP协议需要使用32位二进制IP地址
因此需要将域名或IP地址转换为32位IP地址
✦ 函数inet_addr( ) 实现点分十进制IP地址到32位IP地址转换
✦ 函数gethostbyname( ) 实现域名到32位IP地址转换
二、解析服务器(熟知)端口号
客户端还可能使用服务名 (如HTTP) 标识服务器端口
因此需要将服务名转换为熟知端口号
✦ 函数getservbyname( )
三、解析协议号
客户端可能使用协议名 (如:TCP) 指定协议
需要将协议名转换为协议号 (如:6)
✦ 函数getprotobyname ( ) 实现协议名到协议号的转换
四、TCP客户端软件流程
1. 确定服务器IP地址与端口号
2. 创建套接字
3. 分配本地端点地址 (IP地址+端口号) (操作系统自动完成)
4. 连接服务器 (套接字)
5. 遵循应用层协议进行通信
6. 关闭/释放连接
五、UDP客户端软件流程
1. 确定服务器IP地址与端口号
2. 创建套接字
3. 分配本地端点地址 (IP地址+端口号) (操作系统自动完成)
4. 指定服务器端点地址,构造UDP数据报
5. 遵循应用层协议进行通信
6. 关闭/释放套接字
2.9 Socket编程-服务器软件设计
2.9 Socket编程-服务器软件设计
4种类型基本服务器:
✦ 循环无连接 (Iterative connectionless) 服务器
✦ 循环面向连接 (Iterative connection-oriented) 服务器
✦ 并发无连接 (Concurrent connectionless) 服务器
✦ 并发面向连接 (Concurrent connection-oriented) 服务器
一、循环无连接服务器
1. 基本流程
所谓循环,即一次只处理一个客户的服务请求,处理完之后才能处理下一个客户的请求,又称顺序处理的、非并发的。无连接即基于UDP协议。
循环无连接服务器基本流程如下:
1. 创建套接字
2. 绑定端点地址 (通配符INADDR_ANY+端口号)
3. 反复接收来自客户端的请求
4. 遵循应用层协议,构造响应报文,发送给客户
2. 数据发送
服务器端不能使用connect()函数
无连接服务器使用sendto()函数发送数据报
3. 获取客户端点地址
调用recvfrom()函数接收数据时,自动提取
二、循环面向连接服务器基本流程
1. 创建 (主) 套接字,并绑定熟知端口号;
2. 设置 (主) 套接字为被动监听模式,准备用于服务器;
3. 调用accept()函数接收下一个连接请求 (通过主套接字) ,创建新套接字用于与该客户建立连接;
4. 遵循应用层协议,反复接收客户请求,构造并发送响应 (通过新套接字);
5. 完成为特定客户服务后,关闭与该客户之间的连接,返回步骤3
可以看到,无论循环面向连接服务器还是循环无连接服务器,都倾向于使用一个循环来反复不断接收客户的请求。
三、并发无连接服务器基本流程
主线程1: 创建套接字,并绑定熟知端口号;
主线程2: 反复调用recvfrom()函数,接收下一个客户请求,并创建新线程处理该客户响应;
子线程1: 接收一个特定请求;
子线程2: 依据应用层协议构造响应报文,并调用sendto()发送;
子线程3: 退出(一个子线程处理一个请求后即终止)
四、并发面向连接服务器基本流程
主线程1: 创建 (主) 套接字,并绑定熟知端口号;
主线程2: 设置 (主) 套接字为被动监听模式,准备用于服务器;
主线程3: 反复调用accept()函数接收下一个连接请求 (通过主套接字) ,并创建一个新的子线程处理该客户响应;
子线程1: 接收一个客户的服务请求 (通过新创建的套接字) ;
子线程2: 遵循应用层协议与特定客户进行交互;
子线程3: 关闭/释放连接并退出 (线程终止)
并发的含义是,在一个主进程运行的同时,还会有多个子线程在运行。
例1 无连接循环DAYTIME服务器
例2 面向连接并发DAYTIME服务器