TCP端口分配策略:
具体在什么时候、谁调用tcp_v4_connect?是在发起客户端发起connect的时候通过系统调用访问tcp_v4_connect的。具体系统调用可以参考我之前的文章—-说一说linux的系统调用 其中port_offset是个随机数,初始化为0,如果sk->inet_num为0,即没有分配端口号,则将port_offset分配一个随机数。分配随机数的策略是:根据源ip、目的ip和目的端口号随机选择一个端口初始偏移值 net/ipv4/inet_hashtables.c :__inet_hash_connect
Sk是sock类型,sock是个结构体,在include/net/sock.h文件中定义,部分定义如下,里面包含了常见的端口号、地址、协议等基本信息
net/ipv4/inet_connection_sock.c: inet_get_local_port_range获取本机可用端口号范围
include/net/ip.h:inet_is_local_reserved_port:检查port是否是保留端口号
整体流程图:
UDP端口分配策略:
客户端调用bind的时候,通过系统调用.get_port,最终调用udp_v4_get_port
net/ipv4/udp.c:udp_v4_get_port
net/ipv4/udp.c: udp_lib_get_port
从代码逻辑可以看出,UDP端口分配是按照随机方式。
总结一下:
TCP端口分配策略非随机的,即首先从偶数端口号开始分配,若未分配成功,则进行从奇数端口遍历分配
UDP是随机的分配,随机选择一个端口(满足非保留端口且未被占用)