文档

Java™ 教程
隐藏目录
网络基础知识
路径:自定义网络
课程:网络概述

网络基础

通过互联网进行通信的计算机使用传输控制协议(TCP)或用户数据报协议(UDP)进行通信,如下图所示:

网络通信示例。

当您编写通过网络进行通信的Java程序时,您是在应用层编程。通常情况下,您不需要关注TCP和UDP层。相反,您可以使用java.net包中的类。这些类提供了与系统无关的网络通信。然而,为了决定您的程序应该使用哪些Java类,您确实需要了解TCP和UDP的区别。

TCP

当两个应用程序希望可靠地相互通信时,它们建立一个连接并在该连接上来回发送数据。这类似于打电话。如果您想与肯塔基州的Beatrice阿姨通话,当您拨打她的电话号码并她接听时,就建立了一次连接。通过电话线,您可以在连接上相互交流。与电话公司类似,TCP保证从连接的一端发送的数据实际上到达另一端,并且以发送时的相同顺序。否则,会报告错误。

TCP为需要可靠通信的应用程序提供了一种点对点的通道。超文本传输协议(HTTP)、文件传输协议(FTP)和Telnet都是需要可靠通信通道的应用程序的示例。数据在网络上传输的顺序对于这些应用程序的成功至关重要。当使用HTTP读取URL时,数据必须按照发送时的顺序接收。否则,您将得到一个错乱的HTML文件、损坏的zip文件或其他无效的信息。


定义: 

TCP(传输控制协议)是一种基于连接的协议,用于在两台计算机之间提供可靠的数据流。


UDP

UDP协议提供了两个应用程序之间不保证的通信。UDP不像TCP那样基于连接。相反,它从一个应用程序发送独立的数据包,称为数据报,到另一个应用程序。发送数据报类似于通过邮政服务发送信件:交付顺序并不重要,也不能保证,每个消息都独立于其他消息。


定义: 

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


对于许多应用程序,可靠性的保证对于信息从连接的一端传输到另一端的成功至关重要。然而,其他形式的通信不需要如此严格的标准。实际上,它们可能会被额外的开销或可靠连接的无效性所拖慢。

举个例子,考虑一个时钟服务器,当被请求时向其客户端发送当前时间。如果客户端丢失了一个数据包,重新发送它其实是没有意义的,因为当客户端第二次接收到它时,时间将是不正确的。如果客户端发出两个请求并接收到服务器发送的数据包顺序不对,其实并没有关系,因为客户端可以确定数据包的顺序不对,并再次发出请求。在这种情况下,TCP的可靠性是不必要的,因为它会导致性能下降,并可能影响服务的实用性。

另一个不需要可靠通道保证的服务的例子是ping命令。ping命令的目的是测试网络上两个程序之间的通信。事实上,ping需要知道丢失或顺序错乱的数据包,以确定连接的好坏。可靠的通道将完全无效化这个服务。

UDP协议提供了在网络上两个应用程序之间不保证通信的方式。UDP不像TCP那样是基于连接的。相反,它从一个应用程序发送独立的数据包到另一个应用程序。发送数据报就像通过邮政服务发送信件一样:传递的顺序并不重要,也不保证,每个消息都是独立的。


注意: 

许多防火墙和路由器被配置为不允许UDP数据包。如果在防火墙外连接到服务时遇到问题,或者客户端无法连接到您的服务,请向系统管理员询问是否允许UDP。


理解端口

一般来说,计算机通过单个物理连接与网络相连。所有针对特定计算机的数据都通过该连接到达。但是,这些数据可能是针对计算机上运行的不同应用程序的。那么计算机如何知道将数据转发给哪个应用程序呢?通过使用端口

通过互联网传输的数据附带有标识计算机和目标端口的寻址信息。计算机通过其32位IP地址进行标识,IP使用此地址将数据传递到网络上正确的计算机。端口由16位数字进行标识,TCP和UDP使用它将数据传递到正确的应用程序。

在基于连接的通信中,例如TCP,服务器应用程序将套接字绑定到特定的端口号。这样做的效果是将服务器注册到系统中,以接收所有针对该端口的数据。然后客户端可以在服务器的端口与服务器会合,如下图所示:

客户端通过其端口与服务器通信

定义: 

TCP和UDP协议使用端口将传入的数据映射到计算机上运行的特定进程。


在基于数据报的通信中,如UDP,数据报包含其目标端口号,并且UDP将数据包路由到适当的应用程序,如下图所示:

将数据包路由到适当的应用程序

端口号的范围是从0到65,535,因为端口由16位数字表示。从0到1023的端口是受限制的,它们被保留供HTTP、FTP和其他系统服务等众所周知的服务使用。这些端口被称为众所周知的端口。您的应用程序不应尝试绑定到它们。

JDK中的网络类

通过java.net中的类,Java程序可以使用TCP或UDP在Internet上进行通信。 URLURLConnectionSocketServerSocket类都使用TCP在网络上进行通信。 DatagramPacketDatagramSocketMulticastSocket类用于UDP。


上一页: 关于Java中网络的已知信息
下一页: 使用URLs