tcp bind 端口分析

bind系统调用 是指定源端口的。 大多数情况下 我们在 listen之前调用,但是在connect之前也可以调用这个系统调用,指定发起连接的源端口。
在TCP bind系统调用中,会创建一个 inet_bind_bucket的实体。系统会把这个结构记录在一个hash表中,后续bind时使用它来判定是否可以bind。
在以下四种情况下 可以共享本地端口
1. sockets bound 到了不同的 接口上。
2.sockets 设置了 REUSEADDR,且没有sockets处于listen状态。
3.sockets 设置了REUSEADDR,且有sockets处于listen状态,如果还设置了REUSEPORT也可以共享。
4.所有的sockets 绑定在不同的地址上。
判断是否有冲突的函数是 inet_csk_bind_conflict,有兴趣可以进去仔细看。

需要注意的是,除了在bind 函数中会创建inet_bind_bucket的实体外,如果在connect前没有进行bind,同样会创建inet_bind_bucket实体,并将该实体插入 bhash hash表中。只是在connect判断端口是否可以复用采用了更加简单地判定方法。具体可以看__inet_hash_connect函数。
bind 系统调用的调用链如下

__sys_bind --> inet_bind --> __inet_bind --> inet_csk_get_port(get_port) --> inet_csk_bind_conflict

bind 关键点在于判定 端口是否可用。判定条件是前文中提到的四个。

喜欢 1

这篇文章还没有评论

发表评论