套接字大致驻留在 OSI 模型的会话层。会话层夹在其上面向应用的层和其下的实时数据通信层之间。会话层为两台计算机 之间的数据流提供管理和控制服务。作为该层的一部分,套接字提供一个隐藏从导线上获取比特和字节的复杂性的抽象。换句话说,套接字允许我们让应用程序表明 它想发送一些字节即可传输数据。套接字隐藏了完成该项工作的具体细节。

 

一般而言,Java 语言中的套接字有以下两种形式:

  • TCP 套接字(由 Socket 类实现,稍后我们将讨论这个类)
  • UDP 套接字(由 DatagramSocket 类实现)

TCP 和 UDP 扮演相同角色,但做法不同。两者都接收传输协议数据包并将其内容向前传送到表示层。TCP 把消息分解成数据包(数据报,datagrams)并在接收端以正确的顺序把它们重新装配起来。TCP 还处理对遗失数据包的重传请求。有了 TCP,位于上层的层要担心的事情就少多了。UDP 不提供装配和重传请求这些功能。它只是向前传送信息包。位于上层的层必须确保消息是完整的并且是以正确的顺序装配的。

一般而言,UDP 强加给您的应用程序的性能开销更小,但只在应用程序不会突然交换大量数据并且不必装配大量数据报以完成一条消息的时候。否则,TCP 才是最简单或许也是最高效的选择。因为多数读者都喜欢 TCP 胜过 UDP,所以我们将把讨论限制在 Java 语言中面向 TCP 的类。