Java网络编程之传输控制协议(一)
2008-01-05 19:36:04 来源:WEB开发网核心提示:一、概述TCP提供的网络通讯接口与用户数据报协议(UDP)截然不同,TCP的特性使网络编程很具魅力,Java网络编程之传输控制协议(一),而且它删除了UDP的很多干扰部分(例如数据包的排序和丢失),简化了网络通讯,总之,你不会希望你自己的电子邮件被在相同系统上运行软件的其它用户访问,UDP关心的是数据包的传输,而TCP
一、概述
TCP提供的网络通讯接口与用户数据报协议(UDP)截然不同。TCP的特性使网络编程很具魅力,而且它删除了UDP的很多干扰部分(例如数据包的排序和丢失),简化了网络通讯。UDP关心的是数据包的传输,而TCP关注的是建立网络连接,并在网络连接中发送和接收字节流。 数据包可以通过网络用多种方法发送,并且它们到达的时间可能不同。这有利于性能的提高和程序的健壮性,因为单个包的丢失不一定干扰其它包的传输。但是,这样的系统使程序员必须作更多的工作,他们必须保证数据的送达(delivery)。TCP通过对发送和次序的保证消除了这些额外的工作,为客户端和支持两路(two-way)通讯的服务器之间提供了可靠的字节通讯流。它在两台计算机之间建立了"虚拟连接",可以通过虚拟连接发送数据流。
TCP使用更低层的(lower-level)的ip通讯协议在两台计算机之间建立连接。这种连接提供了一个答应字节流发送和接收的接口,并且采用透明的方式把数据转换为IP数据报。数据报(datagram)的问题之一是不能保证数据包到达目的地。TCP解决了这个问题,它提供了有保证的数据字节的送达。当然,网络错误影响了送达也是可能的,但是TCP通过类似重新发送数据包解决了这种实现的问题,并且只在情况很严重(例如没有到网络主机的路由或连接丢失了)的时候才提醒程序员。
两台计算机之间的虚拟连接表现为套接字(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:本地端口识别了其它程序建立的到某个应用程序的连接,
更多精彩
赞助商链接