1. 概述

在本篇教程中,我们将重点讲解端口(Port)与套接字(Socket)之间的关键区别。对于从事网络编程的开发人员来说,这两个概念非常重要,但又容易混淆。通过本文的梳理,希望帮助大家清晰理解它们各自的含义与作用。

2. 什么是端口(Port)?

端口是传输层的一部分,用于网络通信。它本质上是一个逻辑标识符,用于在网络系统中唯一标识一个进程。当两个网络设备进行通信时,它们通过发送数据包完成交互,而每个接收到的数据包中都包含一个端口号,这个端口号决定了该数据包应该被送往哪个进程。

⚠️ 并非所有网络协议都使用端口。例如 ICMP 就不使用端口;而像 TCP、UDP、HTTP 这样的协议则会使用端口来完成通信。

✅ 举个例子:客户端通过端口 23 向服务器发起 Telnet 连接请求。由于 Telnet 协议是基于 TCP/IP 的,并且默认使用端口 23,服务器识别到该请求后就会启动 Telnet 服务进行响应:

port 1

3. 什么是套接字(Socket)?

两个运行在同一台计算机不同计算机上的进程可以通过套接字进行通信。套接字可以看作是进程间通信的端点(Endpoint),它本质上是一个进程通信的接口。

在通信过程中,套接字依赖于一个文件描述符(File Descriptor),通常用于客户端-服务器模型Client-Server Model)中。

套接字由两部分组成:系统的 IP 地址和程序的端口号。其中,IP 地址标识了目标系统,端口号标识了目标程序:

socket 1

✅ 套接字主要分为三类:

  • 流式套接字(Stream Socket):面向连接,通常使用 TCP。
  • 数据报套接字(Datagram Socket):无连接,通常使用 UDP。
  • 原始套接字(Raw Socket):面向数据报,允许使用 ICMP 协议进行通信。

4. 端口 vs 套接字

我们已经了解了端口和套接字的基本概念,接下来我们从多个维度对比它们之间的区别:

特性 端口(Port) 套接字(Socket)
定义 一个数字,用于标识计算机中运行的程序 由 IP 地址和端口号组成的通信端点
唯一性 多台计算机上的程序可以使用相同端口号,因此端口号不能唯一标识一台计算机 套接字可以唯一标识一台计算机及其上的某个程序
所在层级 传输层 应用层,是应用层与传输层之间的接口
作用 用于将数据传递到正确的应用程序 用于监听和处理客户端请求与响应

5. 总结

通过本文的讲解,我们了解了网络通信中端口与套接字的基本概念及其关键区别。简单总结:

  • 端口用于标识一个程序,是传输层的概念;
  • 套接字用于建立通信连接,是应用层与传输层之间的接口;
  • 一个套接字 = IP 地址 + 端口号;
  • 端口号是有限资源,合理分配很重要;
  • 在编写网络程序时,理解这两个概念有助于避免一些常见的连接与通信问题(踩坑)。

希望这篇文章能帮助你更清晰地理解“端口”与“套接字”的关系与区别。如果你是做网络编程或服务端开发的工程师,这些基础概念一定要掌握扎实。


原始标题:The Difference Between a Port and a Socket