Linux内核中为TCP/UDP客户端分配可用端口的位置是哪里?
你之前梳理的是端口分配完成后的发包链路,所以找不到端口分配逻辑,客户端临时端口的分配逻辑确实位于传输层,TCP、UDP场景的调用链路如下:
核心公共端口分配逻辑
所有IPv4场景下的临时端口分配最终都会调用核心函数inet_select_port,该函数会读取系统配置的临时端口范围(对应/proc/sys/net/ipv4/ip_local_port_range参数),结合端口复用规则、端口占用冲突检测逻辑选出可用端口,写入套接字对应的struct sock结构体的sk_num字段。
TCP 场景端口分配调用链路
TCP客户端默认会在connect系统调用阶段完成临时端口分配,仅当套接字未提前调用bind绑定固定端口时才会触发分配逻辑,完整调用链:
sys_connect():系统调用入口inet_stream_connect():流式套接字连接通用处理tcp_v4_connect():IPv4协议族TCP连接处理inet_hash_connect():套接字哈希绑定处理inet_select_port():核心端口分配逻辑
UDP 场景端口分配调用链路
UDP有两个触发端口分配的时机:
- 调用
connect绑定对端地址时触发分配,调用链:sys_connect()->inet_dgram_connect()->__inet_dgram_connect()->udp_lib_get_port()->inet_select_port() - 未调用
connect,首次调用sendto/sendmsg发数据时自动触发分配,调用链:sys_sendmsg()->udp_sendmsg()->udp_autobind()->udp_lib_get_port()->inet_select_port()
内容的提问来源于stack exchange,提问作者tyChen
相关产品推荐
相关产品推荐

