注:本文是《大数据量报表技术研究》专著的一部分
一、问题的提出
w 适用于Web方式传输文件的网络协议有哪些?各有哪些优劣?
w 这些协议如何在Web应用中实现?
二、问题的研究
网络协议,在ISO标准的“OSI模型”中分为7层:应用层、传输层、网络层、数据链路层、物理层。与互联网相关的,我们只需要考虑“TCP/IP协议族”就可以了。
“TCP/IP协议”是“TCP/IP协议族”的简称,是一系列协议的合集,按“TCP/IP参考模型”划分,这些协议可以分为4层:应用层、传输层、网络互连层、网络接口层。
在TCP/IP协议族旗下,常用协议有:
w 应用层:
DNS(域名解析)、HTTP(超文本传输)、
FTP(文件传输)、SSH(安全外壳)、SOAP(简单对象访问)
POP3(邮局协议)、SMTP(简单邮件传输)
w 传输层:
TCP(传输控制)、UDP(用户数据报)
至于更底层的协议,和操作系统和硬件设施有关,不是本课题关注的重点。更具体来说,本课题只需要关注的是TCP、UDP、HTTP和FTP等协议。
1、UDP协议和TCP协议的区别
在传输层,主要就两个协议,UDP和TCP,其对比如下图:
表2.1 TCP和UDP的对比
TCP | UDP | |
是否建立连接 | 连接 | 非连接 |
传输可靠性 | 可靠 | 不可靠 |
速度 | 慢 | 快 |
适合数据量 | 大量数据 | 少量数据 |
简单的讲,UDP唯一的优点就是传输速度快,比TCP要快得多。我们看到的QQ、飞秋等软件最开始都是采用UDP协议来传输消息和文件(但MSN是采用的TCP),而且P2P下载软件、视频文件的传送也通常是建立在UDP协议(或者类似协议)之上的。实际上,因为UDP传输数据不可靠,会丢包,所以不宜用于恶劣的互联网环境中,但是在局域网环境下,UDP用得比较多。另外,我们看到,UDP在进步,已经有很多RUDP (可信的UDP)、EUDP(增强的UDP协议)面世,但实际的应用还不是很广泛,有兴趣的读者可以自己去研究。
对于基于B/S的Web应用,终端是浏览器,受浏览器的限制,通常不能直接使用UDP协议传输数据(除非自己写相关的浏览器组件)。总之,在Web应用中UDP用得比较少,UDP的主要应用是在局域网中。
2、HTTP和FTP
在应用层中,能用于传输文件的,主要就是FTP、TFTP和HTTP。
TFTP一般都是工作在UDP协议上的,不在我们的考虑中。剩下的就是HTTP协议和FTP协议,他们都是工作在TCP协议上的。Web应用的文件传输,理论上可以借助这两种协议来实现。
通常来说,FTP协议(即“文件传输协议”),是比较稳定的,而且能够传输很大的文件,但是安全性不高,特别是在Web应用场合下。
而HTTP协议呢,虽然也可以传输文件,但是毕竟不是很专业,特别是对于文件“上传”,10M大小的文件还可以,但是不能过大,因为“如果上传的文件过大的话,任何一个HTTP服务器都有可能在文件传输的过程中中断传输”。
通过HTTP上传有3方式:PUT、WebDAV、RFC1867,前2种不适合大文件上传,目前我们使用的普通Web上传都是基于RFC1867标准,即在HTML中基于表单的文件上传。这种方式,简单地说,就是在HTML表单中为input元素的type属性增加了一个file选项(即<input type="file">),并且定义了一种新的MIME类型:multipart/form-data,对于这个标准,大多数的Web服务器都是支持的。
至于文件的下载,可以直接通过HTTP服务器,将文件传输给浏览器客户端。通常有两种方式:
1) 直接访问文件的url去下载
文件放到Web服务器目录下,可以直接访问文件名称的全url去下载。
2) 通过应用程序将文件推送到客户端
文件不在Web服务器目录下,比如在应用服务器磁盘上,此时需要通过应用程序将文件推送到客户端(比如通过response.getOutputStream()或者socket)。
对于Web模式下的基于FTP方式的文件传输,客户端是浏览器,仅仅靠HTML和JS是不行的,因为需要在客户端做一些处理,所以需要引入RIA(Rich Internet Application,富客户端),即编写一些运行在浏览器上的插件来支持——常见的方式ActiveX、Java Applet、JavaFX、Flex、Silverlight。技术上是可行的,比如通过Java Applet去做,可能稍微有一点麻烦,要求客户的计算机要安装jre环境,但是效果可能比http方式要好很多。目前大家可以看到,有些网站支持大文件的上传和下载,基本上都是需要安装浏览器插件的,比如QZone相册高速上传、115网盘高速下载等。
3、其他(非TCP/IP)协议
其他协议基本上都很难使用到报表这种具体的业务场景中。
比如PPP协议,那是一个较底层(数据链路层)的协议,采用了和TCP不一样的底层数据传输技术。它适用于那种没有Server-Client概念的结构中。比如网络上的共享文件下载,可以直接从其他Client那里去建立点对点的连接。