[CentOS] local ephemeral ports usage and distribution / inet_csk_get_port()

Wed May 24 14:45:39 UTC 2017
Ferreol Lnx <ferreol.lnx at gmail.com>


I'm using CentOS Linux release 7.3.1611 (Core) with
kernel 3.10.0-514.16.1.el7.x86_64

Using iperf for bond benchmarking, and opening several sockets, I noticed a
strange behavior.

My Centos using iperf as a client to connect to an iperf server (running
either CentOS or Debian) requesting N parallel TCP connections.

I notice that the local ephemeral ports used are not consecutive and are
always even ports numbers.
This can change to "only odd ports numbers" depending on the
setting net.ipv4.ip_local_port_range, but basically, the idea is the Centos
kernel does "+2" when finding a local port for socket, not doing +1.

Doing a netstat, generally speaking, only even (or odd) local ports are
used so this does not seem application dependent.
It's possible, however, to request both odd and even local ports, when
requesting to bind them explicitly and not letting kernel function
"inet_csk_get_port" determining it.
To compare to another distro, Debian 7  3.2.78-1 x86_64 does increment
local port number by +1 when opening sockets, using both even and odd local
sockets numbers.

This has an influence when doing network interfaces bonding with LACP
801.3ad with layer3+4 hashing policy, because the trafic to one remote
host/service will improperly be balanced over bonded interfaces with Centos.

Is there any known kernel patch or reason to explain this behavior ?

thanks for any hints.
best regards