Linux的端口和套接字

Linux 的端口是一个逻辑概念,其由 TCP/IP 协议定义,是一个 0–65535 之间的数字,可以分为常用的“固定”端口和通用端口两个部分。

“固定”端口是指一些常用的软件或者 TCP/IP 协议中确定和公布的,通常来说不会被其他程序使用。

Linux 中的常见“固定”端口和对应的协议

协议 端口号
FTP 21
TELNET 23
TFTP 69
SNMP 161
SSH 23
HTTP 80
SMTP 25
DNS 53

套接字(Sockets),即网络进程的进程 ID ,和普通的进程 ID 不同,网络进程的ID 是由运行这个进程的计算机的 IP 地址以及这个进程使用的端口(Port)组成的,在同一台计算机上,一个端口只能分配给一个进程,这样就可以确定网络中计算机上的一个进程。

套接字的组成
Linux的端口和套接字
可以使用“netstat-all”命令来查看当前系统中网络应用进程的套接字和端口。

Linux 的套接字包括了BSD套接字和INET套接字两部分。

BSD套接字接口是Linux套接字的基础,套接字可以看成一种特殊的管道, BSD套接字通常包括以下几种类型。

  • Steam(数据流):该套接字提供了两个方向的序列数据流,这些数据流保证在传输过程中数据不丢失、不破坏或不重复,数据流套接字由 Internet(INET)地址族的 TCP 协议所支持。
  • Datagram(数据报):该套接字也提供两个方向上的数据传送,但不像数据流套接字,它们不提供消息到达的保证。即使到达也不保证这些数据报按照一定的顺序到达(或丢失、重复)。这种类型的套接字由 Internet 地址族的 UDP 协议所支持。
  • Raw(原始套接字):该套接字允许进程直接访问底层协议。例如,可以为以太网设备打开一个 Raw Socket,以使用原始 IP 数据进行传输。
  • Reliable Delivered Message(可靠传递消息):该套接字非常类似于数据报套接字,但是可保证数据的可靠传输。
  • Sequenced Packets(顺序数据报):这个套接字类似于数据流套接字,但数据包的大小固定。
  • Packet(包):这不是标准的 BSD 套接字类型,它是一个 Linux 特定的扩展,允许进程在设备层直接访问 Packet。

在 Linux 网络编程中最常使用的是支持 TCP 协议的数据流套接字、支持 UDP 协议的数据报套接字和可以直接对底层协议 IP 进行访问的原始格式套接字。