2021-06-24 02:26:30
在Linux网络编程中,socket、端口和进程是三个核心概念,它们共同构成了网络通信的基础。以下是它们之间关系的详细解析:
1. Socket的本质与作用公认端口(0-1024):绑定固定服务(如HTTP的80端口、FTP的21端口)。
注册端口(1025-49151):供用户或自定义服务使用(如MySQL的3306)。
动态端口(49152-65535):通常用于临时连接(如客户端发起连接时的随机端口)。
父子进程:通过fork()继承Socket描述符。
跨进程传递:通过sendmsg()传递Socket描述符(如Unix域Socket)。
线程间:同一进程的线程可共享Socket描述符。
创建Socket → bind()绑定特定IP和端口 → listen()监听连接 → accept()返回新Socket(含客户端四元组) → 通过新Socket与客户端通信。
创建Socket → connect()指定服务端IP和端口 → 建立连接后通过Socket通信。
数据包到达网卡后,内核根据四元组(如[src_ip:src_port] → [dst_ip:dst_port])匹配到唯一Socket,再通过Socket描述符关联到目标进程。
Socket是包含四元组的内核对象,端口仅是四元组的一部分。
多个Socket可共享同一端口(如服务端accept()生成的多个Socket)。
Socket是进程与网络的中介,进程通过描述符间接操作Socket。
一个进程可管理多个Socket,但一个Socket通常由一个进程独占(除非显式共享)。
主进程bind()80端口,accept()后为每个客户端创建新Socket,子进程通过该Socket处理请求。
控制连接(端口21)和数据连接(动态端口)使用不同Socket,但均属于同一进程。
这种设计使得Linux能够高效管理多进程、多连接的网络环境,同时保持灵活性和扩展性。