TCP源码浅读(2)服务端 bind & listen

版本:linux 4.18.1

作为学习笔记,本篇只讨论常规的交互过程,旨在理清 linux 内核对 TCP 相关的信息管理。

在连接开启以前,服务端 首先要调用 bind() 将 sock 绑定到某个端口,然后调用 listen() 使 sock 处于 被动监听状态,然后客户端才可以向服务端发起连接请求

bind()

 bind() 函数主要流程:

首先根据 端口号 计算一个 hash 值,然后通过这个 hash 值在定位到 inet_bind_hashbucket 某个 slot;

定位到 slot 后,遍历指向的链表,看这个端口是否已经存在:

        如果端口不存在,就新建一个 inet_bind_bucket 并添加到链表中;

        如果端口已经存在,则要检查是否已经有连接使用了该端口:

                如果已经有连接使用,则报错(不考虑端口重用);

执行到这里,已经有一个 inet_bind_bucket 表示这个端口了,接下来,只要把调用 bind 函数的 sock 加入到 inet_bind_bucket.owners 即可。

listen()

 listen() 函数主要流程:

首先将 sock 状态设置为 TCP_LISTEN

然后根据端口号计算哈希值定位到 listening_hash 某个 slot,将 sock 添加进来;

最后按类似的方式,把 sock 也添加到 lhash2 中。

下图表示某个服务器程序绑定端口 9090 ,调用 bind 和 listen 函数后,内核中保存的 tcp 相关信息。

 

未完待续... 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值