免费注册 查看新帖 |

Chinaunix

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

[网络子系统] tcp_rcv_state_process()函数中的一个疑问 [复制链接]

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-08-05 15:31 |只看该作者 |倒序浏览
本帖最后由 jiufei19 于 2016-08-05 15:34 编辑

http://bbs.chinaunix.net/thread-4251832-1-1.html这个帖子中,我谈到了由于存在一个时间窗口,故源码必须有一句判断。今天在继续阅读3次握手的tcp_rcv_state_process函数时,又有一个地方不太精确理解,请大家解惑。

  4699 int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
  4700               struct tcphdr *th, unsigned len)
  4701 {
               ...
  4794     /* step 5: check the ACK field */
  4795     if (th->ack) {
  4796         int acceptable = tcp_ack(sk, skb, FLAG_SLOWPATH);
  4797
  4798         switch (sk->sk_state) {
  4799         case TCP_SYN_RECV:
  4800             if (acceptable) {
  4801                 tp->copied_seq = tp->rcv_nxt;
  4802                 smp_mb();
  4803                 tcp_set_state(sk, TCP_ESTABLISHED);
  4804                 sk->sk_state_change(sk);
             ...

上面红色字体语句,究竟是要唤起什么进程?此时还在3次握手的最后阶段,虽然子套接字已经创建好了,但是显然尚未完全结束对第3次握手ack的全部处理,那么此时要唤起什么?我实在想不出来这里红色语句的作用是什么?

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
2 [报告]
发表于 2016-08-05 15:51 |只看该作者
本帖最后由 jiufei19 于 2016-08-05 15:52 编辑

好像有点明白了,似乎是这样的原因,即如果采用的是deffer方式进行握手,那么此次发来的ack中携带有tcp的数据,则此时叫醒用户进程的read操作就有意义了

论坛徽章:
0
3 [报告]
发表于 2016-09-09 14:34 |只看该作者
deffer方式握手是说什么意思?
tcp fast open倒是在握手的时候可以携带数据。  
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP