Windows Sockets提供了对传输层(OSI第4层)的直接访问,该层在OSI模型中提供了最重要和可见的服务。基于网络应用程序的目标和需求选择传输服务,是一种基本的设计决策。两种可用的服务类型分别是面向连接的和无连接的,UDP和TCP(TCP/IP协议簇中两个主要的协议)提供这两种类型的服务。
3.3.1 无连接的服务:UDP
无连接的传输,也被称为数据报服务,是不可靠的服务。但是,不要把“可靠性”与“质量”混为一谈,这种服务之所以是不可靠的,原因在于:它既不提供有保证的交付,也不维持数据包的顺序。如果一个数据报没有到达目的地,或者在传输过程中被损坏了,那么该服务不会向你通报错误。如果一个应用程序发送了数据报A,然后是数据报B,那么数据报B有可能先于数据报A到达(见图3-2)。
数据报服务可以与邮政投递相类比,我们通常不认为邮政服务有什么不可靠,但是一类(first-dass)邮件并不保证投递(到达),也不维持投递顺序,当然,大多数一类邮件都能顺利地送达(我们通常并不在意送达的顺序)。
无连接传输服务简单,而简单就是其优势,它开销小,所以效率高,因而带来性能上的优势,它也很容易使用。虽然数据报服务是不可靠的,但是采用数据报服务的应用程序却不一定不可靠,任何数据报应用程序都能够实现可靠的服务。
接收数据的应用程序可以针对每个收到的数据报发送确认信息,发送数据的应用程序如果在给定的时间内没有收到确认信息,可以重发这个数据报。每个数据报可以携带一个顺序号或者时间戳,这样接收端可以根据需要重新建立起数据报的顺序,并且能够检测出接收的重复数据,然后丢弃它。通过在基本服务上增加上述功能来提高可靠性,这与向邮局索取发送挂号信的收据没有什么不同。
|
图3-2 当一个应用程序发送了一个数据报,数据报服务并不通告其是否到达,如果应用程序发送了两个数据报,任何一个都有可能先于另一个到达 |
数据报服务对于短事务(short transaction)类的应用比较理想,对于这类应用,创建和拆除一个连接的工作量比数据传输本身还要大。数据报服务对于那些本身就隐含了确认功能的应用也很合适。例如,一个应用程序向数据库服务器发送查询请求并等待回复,如果得到了完整的回复,则应用程序完成任务;如果超时后仍没有得到回复,那么应用程序就会重新发起查询请求(或者采取其他操作,例如向用户显示一个错误信息)。
有些应用程序拿可靠性来换取更高的容量,通过采用数据报服务实现高数据吞吐量,特别是在能够容忍数据丢失的情况下。这些应用程序在应用层上对数据进行排序、提供发送端和接收端之间的应用层同步。如那些发送视频或音频信号或者从实时数据采集设备上接收采样数据的系统,都是这类应用的一些例子。
很奇怪的是,有一些应用程序在采用“可靠”服务后反而变得不可靠。例如,一些实时的音频和视频应用程序,并不希望等待数据重传或者允许传输控制机制干扰“自然的”数据流。
由于数据报服务是无连接的(即不与远程的某单一主机“绑定”),所以,它还能够支持多播和广播。有些应用程序需要使用同一个地址同时与多台主机通信,而面向连接的协议不能提供这种服务。
用户数据报协议(UDP)是TCP/IP簇中的一个主要的数据报协议。因特网控制消息协议(ICMP)则是另一个数据报传输协议,可以通过使用SOCK_RAW socket来访问ICMP。SOCK_RAW socket是Windows Sockets API的一个可选功能,所以,ICMP并不是普遍可用的。
像任何数据报协议一样,UDP发送和接收分离的数据分组。换言之,如果在一次发送操作中传输了一定数量的字节,那么在一次接收操作中也将接收同样数量的字节。数据在网络传输过程中,将保持其分组的边界。UDP也采用TCP/IP标准的校验和算法(16位字的1的补码和)来对所接收的数据进行粗略的校验(UDP校验和计算是TCP/IP协议栈的可选项,但是大多数栈都启用该功能)。
UDP不提供有保证的传输。当TCP/IP实现软件接收到一个UDP数据报时,并不反馈接收验证的确认信息,UDP也不维持传输的顺序。尽管如此,就像在前面所讨论的那样,使用UDP的Windows Sockets应用程序还是能够实现可靠性和顺序化的。
【责任编辑: book TEL:(010)68476606】
|