Java网络编程之网络基础 – skyWalker

运行在网络上的计算或者使用TCP(传输控制协议)或者使用UDP(用户数据报协议)进行通讯,如下图所示:

当你编写通过网络通信的Java程序时,就是在上图的应用层编写程序。通常情况下,自己不需要关心TCP或者UDP层,替代的是可以使用java.net包中的类。该包中的类提供了系统独立的网络通信,但是在决定程序应该使用哪些Java类时,需要理解TCP和UDP之间的区别。

TCP

TCP(传输控制协议)是基于连接的协议,在两台电脑之间提供了可靠的数据流。当两个应用程序想彼此之间可靠地通信时,它们建立连接,然后在该连接上来回地传送数据,这与打电话相似。如果你想与北京的张三通话,当你拨打他的号码并且他接听你的电话时,连接建立起来了,你们通过电话线路建立的连接彼此通话。就像电话公司,TCP确保发自连接一端的数据确实到达另一端,并且与数据发送相同的顺序到达,也就数据1先于数据2发送则数据1必须先于数据2到达,否则就会报错。

TCP为要求可靠通信的应用程序提供了点对点的通道,超文本传输协议(HTTP)、文件传输协议(FTP)和Telnet都是要求可靠通信通道的应用程序的例子。网络上数据发送和接收的顺序是这些应用程序成功的关键。当使用HTTP从一个URL读取时,数据必须以发送的顺序被接收,否则会收到乱七八糟的HTML文件、损坏的zip文件或者其它的无效的信息。

UDP

UDP(用户数据报协议)从一台计算机到另一台计算机发送称为数据报的独立的数据包,但不保证数据的到达,UDP不是基于连接的协议。

UDP协议为网络上的两个应用程序提供了无保障的通信,不像TCP是基于连接的协议,而是从一个程序发送数据报到另一个程序。发送数据报很像从邮局发送一封信件:信件送达的顺序是不重要的也是无法保障的,每封信件与其它信件是相互独立的。

对于很多应用程序,可靠性的保障是从连接的一端传送信息到另一端成功的关键,但是其它形式的通信不要求如此严格的标准。事实上,它们可能被额外的开销降低速度或者可靠的连接可能使服务完全失效。例如,考虑发送当前时间到客户端的时间服务器。如果客户端丢失了一个包,再次发送该包是没有意义的,因为当客户端在第二次尝试时接收到该包,时间已经不正确了。如果客户端提交了两个请求并且收到的数据包次序颠倒,这是无关紧要的,因为客户端可以发现数据包次序颠倒并做出另一个请求。在这个例子中,TCP的可靠性是不必要的,因为会导致性能的降低和阻碍服务的有用性。

另一个不需要可靠通道保障服务的例子是ping命令。Ping命令的目的是测试网络上两个程序的连通性。实际上,ping需要知道丢包或者次序颠倒的包以判断连接的好坏程度。一个可靠地通道将会使该服务完全失效。


注意: 许多防火墙和路由器被设置为不允许UDP包。如果在连接防火墙外的服务时遇到麻烦,或者客户端不能连接你的服务,询问系统管理员UDP是否是允许的。


端口

通常来讲,一台计算机有单独的物理连接到网络上,所有去往特定计算机的数据通过该连接到达,但是数据可能是发送给该计算机上运行着的不同应用程序的。那么计算机如何知道向哪个应用程序转发数据?答案是通过端口(Port)。

传输在网络上的数据附有地址信息,该信息用于识别数据到达的计算机和端口。计算机由32位的IP地址标示,IP使用改地址将数据传输到网络上正确的计算机。端口由16位比特数字标示,TCP和UDP使用该数字将数据发送到正确的应用程序。TCP和UDP使用端口将传输进来的数据映射到计算机上运行的特定进程。

像TCP这种基于连接的通信,服务器应用程序将socket绑定到特定的端口,该行为起到将服务器注册到系统以接收发送到该端口的数据的效果。客户端可以和服务器在该端口通信,如下图所示:

像UDP这种基于数据报的通信,数据报包含要到达的端口号,UDP将该包路由到正确的应用程序,像下图所示:

端口号的范围从0-65535因为端口由16位比特数字标示。1-1023的端口号是受限的,它们已经为像HTTP、FTP这样众所周知的服务和其它系统服务预留了。1-1023的端口被称为知名端口,自己编写的应用程序不应尝试绑定它们。

JDK中的网络编程类

Java程序可以使用TCP或者UDP在网络上通信。URL、URLConnection、Socket和ServerSocket类使用TCP在网络上通信,DatagramPacket、DatagramSocket和MulticastSocket类使用UDP。

明天的希望,让我们忘了今天的痛苦

Java网络编程之网络基础 – skyWalker

相关文章:

你感兴趣的文章:

标签云: