免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2856 | 回复: 6
打印 上一主题 下一主题

[网络子系统] tcp_rcv_state_process函数中3次握手的问题 [复制链接]

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-06 10:57 |只看该作者 |倒序浏览
大家好!

在阅读tcp_rcv_state_process函数中关于3次握手中local方收到client发来的最后一个ACK后,进入到如下的step 5:

5730     /* step 5: check the ACK field */
  5731     if (th->ack) {
  5732         int acceptable = tcp_ack(sk, skb, FLAG_SLOWPATH);
  5733
  5734         switch (sk->sk_state) {
  5735         case TCP_SYN_RECV:                      /* for child sock */
  5736             if (acceptable) {
  5737                 tp->copied_seq = tp->rcv_nxt;
  5738                 smp_mb();
  5739                 tcp_set_state(sk, TCP_ESTABLISHED);
  5740                 sk->sk_state_change(sk);        /* call sock_def_wakeup */                  ...

我的问题是这里为啥要调用sock_def_wakeup呢,此时作为被动打开的服务端怎么会有正在此套接字上有用户进程在操作而等待被唤醒继续进行呢?这到底是什么意思,望斑竹和各位前辈指教,谢谢!

论坛徽章:
0
2 [报告]
发表于 2012-09-06 13:58 |只看该作者
问内核问题,首先要把针对的内核版本言明。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
3 [报告]
发表于 2012-09-06 14:45 |只看该作者
回复 2# lenky0401


    抱歉,刚才忘写版本了,我一直在阅读的版本是2.6.23,这个代码从该版本直到3.x都是有的,谢谢!

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
4 [报告]
发表于 2012-09-07 11:01 |只看该作者
本帖最后由 jiufei19 于 2012-09-07 15:39 编辑

回复 1# jiufei19


    自己顶!

   我的问题是既然此时还在3次握手的最后处理阶段,应用只是在执行accept时被阻塞,根本没有执行任何read,write操作。

   另外,我将sock_def_wakeup函数代码拷贝出来,如下所示:

  1462 static void sock_def_wakeup(struct sock *sk)
  1463 {           
  1464     read_lock(&sk->sk_callback_lock);
  1465     if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
  1466         wake_up_interruptible_all(sk->sk_sleep);
  1467     read_unlock(&sk->sk_callback_lock);
  1468 }

从这个代码可以看出,此时sk->sk_sleep一定为NULL,因为在创建该child sock的代码中会调用sk_clone从父套接字复制数据,并且sk_clone中有newsk->sk_sleep  = NULL,所以显然既然这个newsk->sk_sleep肯定为NULL,那么sock_def_wakeup函数的调用对3次握手的中的child sock来讲就没有意义了,那么代码中为啥有这句呢?

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
5 [报告]
发表于 2012-09-08 16:03 |只看该作者
自己顶,希望能有人答复啊

论坛徽章:
0
6 [报告]
发表于 2012-11-17 10:19 |只看该作者
        后面有点注视  我也正在 学习
/* Note, that this wakeup is only for marginal
* crossed SYN case. Passively open sockets
* are not waked up, because sk->sk_sleep ==
* NULL and sk->sk_socket == NULL.
*/
不是很懂 我再看看 共同学习

论坛徽章:
0
7 [报告]
发表于 2012-11-17 10:46 |只看该作者
发送信号给哪些将通过该套接口发送数据的进程 通知他们套接口目前已经可以传送数据了
//望 参考
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP