Networking Basics

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

网络通信示例。

编写通过网络进行通信的 Java 程序时,就是在应用程序层进行编程。通常,您无需担心 TCP 和 UDP 层。相反,您可以使用java.net包中的类。这些类提供独立于系统的网络通信。但是,要确定程序应使用哪些 Java 类,您确实需要了解 TCP 和 UDP 有何不同。

TCP

当两个应用程序希望彼此可靠地通信时,它们将构建连接并通过该连接来回发送数据。这类似于拨打电话。如果您想与肯塔基 State 的比阿特丽斯姨妈说话,则在您拨打她的电话 Numbers 并接听电话时便构建了联系。您可以通过电话线相互通话,通过连接来回发送数据。像电话公司一样,TCP 保证从连接的一端发送的数据实际上以到达时的 Sequences 到达另一端。否则,将报告错误。

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

Definition:

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

UDP

UDP 协议提供了网络上两个应用程序之间无法保证的通信。 UDP 不像 TCP 那样基于连接。相反,它从一个应用程序向另一个应用程序发送独立的数据包,称为* datagrams *。发送数据报就像通过邮局发送一封信:传递 Sequences 并不重要,也不保证,每条消息彼此独立。

Definition:

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

对于许多应用程序而言,可靠性的保证对于信息从连接的一端到另一端的成功传输至关重要。但是,其他形式的通讯不需要如此严格的标准。实际上,它们可能会因额外的开销而减慢速度,或者可靠的连接可能会使服务完全失效。

例如,考虑一个时钟服务器,该时钟服务器在被请求时将当前时间发送到其 Client 端。如果 Client 端错过了一个数据包,则重新发送它实际上没有任何意义,因为当 Client 端在第二次try时收到它的时间将不正确。如果 Client 端发出两个请求并从服务器接收到乱序的数据包,那没关系,因为 Client 端可以确定数据包乱序并发出另一个请求。在这种情况下,TCP 的可靠性是不必要的,因为它会导致性能下降并可能阻碍服务的实用性。

不需要保证可靠通道的服务的另一个示例是 ping 命令。 ping 命令的 Object 是测试网络上两个程序之间的通信。实际上,Ping 需要了解丢失或乱序的数据包,以确定连接的好坏。可靠的 Channel 将完全使该服务无效。

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

Note:

许多防火墙和 Router 已配置为不允许 UDP 数据包。如果无法连接到防火墙外部的服务,或者 Client 端无法连接到服务,请询问系统 管理 员是否允许 UDP。

Understanding Ports

一般而言,计算机与网络具有单个物理连接。发送到特定计算机的所有数据都通过该连接到达。但是,数据可能打算用于计算机上运行的不同应用程序。那么计算机如何知道将数据转发到哪个应用程序?通过使用* port *。

通过 Internet 传输的数据伴随有寻址信息,这些信息标识了计算机及其发往的端口。该计算机由其 32 位 IP 地址标识,该 IP 地址用于将数据传递到网络上正确的计算机。端口由 16 位数字标识,TCP 和 UDP 使用该 16 位数字将数据传递到正确的应用程序。

在基于连接的通信(例如 TCP)中,服务器应用程序将套接字绑定到特定的端口号。这具有将服务器注册到系统以接收发往该端口的所有数据的效果。然后,Client 端可以在服务器的端口与服务器会合,如下所示:

Client 端通过其端口与服务器通信

Definition:

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

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

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

端口号的范围是 0 到 65,535,因为端口由 16 位数字表示。端口号的范围是 0-1023;它们保留供 HTTP 和 FTP 等知名服务以及其他系统服务使用。这些端口称为知名端口。您的应用程序不应try绑定到它们。

JDK 中的网络类

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