# 网络基础知识

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

当您编写通过网络进行通信的 Java 程序时,您是在应用程序层进行编程的。通常,您不需要关心 TCP 和 UDP 层。相反,您可以使用 java.net 包中的类。这些类提供了与系统无关的网络通信。但是,要决定您的程序应该使用哪种 Java 类,您需要了解 TCP 和 UDP 的差异

# TCP

当两个应用程序想要可靠地相互通信时,它们建立连接并通过该连接来回发送数据。这与拨打电话相似。如果你想和肯塔基州比阿特丽斯阿姨谈话,当你拨打她的电话号码并且她回答时,就建立了连接。您可以通过电话线互相通话,在连接上来回发送数据。与电话公司一样,TCP 保证从连接的一端发送的数据实际上到达另一端,并按照相同的顺序发送。否则,会报告一个错误。

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

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

# UDP

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

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

对于许多应用来说,可靠性的保证对于从连接的一端到另一端的信息传输的成功至关重要。但是,其他形式的交流并不需要这样严格的标准。事实上,它们可能会由于额外的开销而减慢,或者可靠的连接可能会使服务完全失效。

如果客户错过了一个包,那么重新发送它是没有意义的,因为当客户端在第二次尝试时收到它时,时间将是不正确的。如果客户端发出两个请求,并按顺序从服务器接收数据包,那么这并不重要,因为客户端可以发现数据包是无序的,并发出另一个请求。在这种情况下,TCP 的可靠性是不必要的,因为它会导致性能下降,并且可能会阻碍服务的有效性。

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

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

# 了解端口

一般而言,计算机具有到网络的单一物理连接。所有发往特定计算机的数据都通过该连接到达。但是,这些数据可能适用于在计算机上运行的不同应用程序。那么计算机如何知道转发数据的应用程序?通过使用 端口

通过因特网传输的数据伴随着寻址信息,该信息标识计算机和它所指定的端口。计算机由其 32 位 IP 地址标识,该 IP 地址用于将数据传送到网络上的正确计算机。端口由 16 位数字标识,TCP 和 UDP 用这些数字将数据传送到正确的应用程序。

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

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

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

端口号范围从 0 到 65,535,因为端口由 16(2 的 16 次方,一个 byte 8 位,2 byte) 位数字表示。范围从 0到 1023 的端口号受到限制; 它们被保留供诸如 HTTP 和 FTP 以及其他系统服务等众所周知的服务使用。这些端口被称为知名端口。您的应用程序不应尝试绑定到它们。

# JDK 中的网络类

通过 java.net 中的类,Java 程序可以使用 TCP 或 UDP 在 Internet 上进行通信。URL, URLConnection, Socket, and ServerSocket 类都是用了 TCP 在网络上通信。DatagramPacket, DatagramSocket, and MulticastSocket 则使用了 UDP