12c4
两台计算机之间的虚拟连接表现为套接字(socket)。套接字允许数据的发送和接收,但是UDP套接字和TCP套接字之间有本质的区别。首先TCP套接字连接到单个计算机,然而UDP套接字可以向多台计算机传输或接收数据;其次,UDP套接字只能发送和接收数据包,然而TCP允许通过字节流的数据传输(表现为输入流(InputStream)和输出流(OutputStream))。为了在网络上传输,它们被转换为数据包,不需要程序员干涉(如图2所示)。
 图2:TCP把数据流处理为协议的命令,但是为在网络上传输把流转换为IP数据报
1、 UDP(用户数据报协议)上的TCP的优点
⑴自动化地错误控制
TCP流上的数据传输比通过UDP的信息包的传输更可靠。在TCP下层,通过虚拟连接发送的数据包括一个检查机制以确保它们没有被破坏(与UDP类似)。但是,TCP保证了数据的送达--在传输过程中丢失的数据包将被重新传输。
你也许想知道这是如何实现的--实际上,IP和UDP不保证送达,当数据包丢失的时候它们也不会发出任何警告。在TCP使用数据包发送了某个数据集合的时候就会启动一个计时器。在UDP中,我们使用 DatagramSocket.setSoTimeout为receive()操作启动一个计时器。在TCP中,如果接收者发送一个肯定的应答就禁止计时器,但是如果在超时前还没有收到肯定的应答,数据包就被重新传输。这意味着写入某个TCP套接字的任何数据将到达另一方而不需要程序员的进一步干涉(除非发生大的事故造成整个网络瘫痪)。错误控制的代码都由TCP处理了。
⑵可靠性
因为在TCP连接中有多方参与的两台计算机之间发送的数据通过IP数据报传输,数据包到达的次序可能经常出现不同。这可能需要使用一个循环从TCP套接字读取信息,因为字节流的次序可能被打乱并且频繁遇到不可靠的问题。幸运的是,次序等问题已经被TCP处理好了--每一个数据包都包含一个用于排序的序列号。后发送、先到达的数据包将保持在一个队列中,直到排好次序的数据可以使用为止。接着数据就可以通过套接字的接口传递到应用程序中。
⑶易于使用
尽管把信息存储为数据包的确没有超越程序员的范围,但这不会是计算机之间通讯的最高效率的途径。还应该有另外一些的复杂性,你可以讨论在某个底线之上设计和建立软件,为程序员提供足够的复杂性。典型情况下开发者欢迎软件开发复杂性的降低,TCP就实现了这种功能。TCP允许程序员用一种完全不同的方式思考问题,而这种方式更加现代化。数据不是被处理为不连续的单元(数据报包),而是被处理为连续的流,就像目前读者所熟悉的I/O流。TCP套接字延续了传统的Unix编程,在Unix编程中通讯与文件输入和输出是一样处理的。无论开发者写入网络套接字、通讯管道、数据结构、用户控制台或文件的时候,这种机制都时相同的。当然它也同样应用与读取信息。这使得通过TCP套接字进行通讯比通过数据报包通讯更加简单。
2、使用端口在应用程序之间通讯
很明显,TCP与UDP之间差别巨大,但是在两种协议之间也有一项重要的相似性。两种都共享了通讯端口的概念,它可以区别各个应用程序。在相同的端口上可以运行多个服务和客户端,而且希望不给它们分配端口号而挑选出某个应用程序是不可能的。当TCP套接字建立到某台计算机的连接的时候,它需要两部分非常重要的信息才能连接到远程客户端--该计算机的IP地址和端口号。此外,本地的IP地址和端口号也将绑定到它上面,因此远程计算机能够识别是哪一个应用程序建立了连接(图3所示)。总之,你不会希望你自己的电子邮件被在相同系统上运行软件的其它用户访问。
 图3:本地端口识别了其它程序建立的到某个应用程序的连接,
允许多个TCP应用程序在同一台计算机上运行
TCP中的端口与UDP中的端口相似--它们的数字范围都是1-65535。1024以下的端口是受限制的,只能被知名的服务(例如HTTP、FTP、SMTP、POP3和telnet)使用。表1列举了一些知名的服务以及与它们对应的端口。
表1:协议和与它们相关的端口
知名的服务 服务端口 Telnet 23 SMTP(简单邮件传输协议) 25 HTTP(超文本传输协议) 80 POP 3 110
3、套接字操作
TCP套接字可以执行多种操作,包括:
建立到某个远程主机的连接。 给远程主机发送数据。 从远程主机接收数据。 关闭连接。
此外还有一些特殊类型的套接字,它们提供绑定到特定端口号的服务。这类套接字通常用在服务器中,可以执行下面一些操作:
绑定到某个本地端口 从远程主机接收输入的连接 从本地端口取消绑定。
这两种套接字可以被分为不同的类,要么是客户端使用的,要么是服务器使用的(由于某些客户端可以象服务器一样操作,还有些服务器可以象客户端一样操作)。但是,客户端和服务器的角色还是可以靠经验区分的。
15b
|