linux内核端口分配策略

linux内核端口分配策略

Posted by lwk on January 3, 2020

TCP端口分配策略:

具体在什么时候、谁调用tcp_v4_connect?是在发起客户端发起connect的时候通过系统调用访问tcp_v4_connect的。具体系统调用可以参考我之前的文章—-说一说linux的系统调用 image image image 其中port_offset是个随机数,初始化为0,如果sk->inet_num为0,即没有分配端口号,则将port_offset分配一个随机数。分配随机数的策略是:根据源ip、目的ip和目的端口号随机选择一个端口初始偏移值 net/ipv4/inet_hashtables.c :__inet_hash_connect

image

image Sk是sock类型,sock是个结构体,在include/net/sock.h文件中定义,部分定义如下,里面包含了常见的端口号、地址、协议等基本信息

image net/ipv4/inet_connection_sock.c: inet_get_local_port_range获取本机可用端口号范围

image include/net/ip.h:inet_is_local_reserved_port:检查port是否是保留端口号

image

整体流程图:

image

UDP端口分配策略:

客户端调用bind的时候,通过系统调用.get_port,最终调用udp_v4_get_port

net/ipv4/udp.c:udp_v4_get_port image

net/ipv4/udp.c: udp_lib_get_port

image

image 从代码逻辑可以看出,UDP端口分配是按照随机方式。

总结一下:

TCP端口分配策略非随机的,即首先从偶数端口号开始分配,若未分配成功,则进行从奇数端口遍历分配

UDP是随机的分配,随机选择一个端口(满足非保留端口且未被占用)