网络端口号是如何分配的?除了给常用服务保留的Well-known Port numbers之外,给客户端的端口号通常是动态分配的,称为ephemeral port(临时端口),在Linux系统上临时端口号的取值范围是通过这个内核参数定义的:net.ipv4.ip_local_port_range (/proc/sys/net/ipv4/ip_local_port_range),端口号动态分配时并不是从小到大依次选取的,而是按照特定的算法随机分配的。
临时端口号的分配发生在以下两处:
– bind();
– connect()。
bind()通过inet_csk_get_port()获取端口号,利用了net_random()产生的随机数 :
// SLES12 kernel 3.12.69-60.64.32:
0104 int inet_csk_get_port(struct sock *sk, unsigned short snum)
0105 {
0106 struct inet_hashinfo *hashinfo = sk->sk_prot->h.hashinfo;
0107 struct inet_bind_hashbucket *head;
0108 struct inet_bind_bucket *tb;
0109 int ret, attempts = 5;
0110 struct net *net = sock_net(sk);
0111 int smallest_size = -1, smalles