免费注册 查看新帖 |

Chinaunix

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

[网络子系统] SYN_RECV状态在还未创建子套接字时,是怎么设置的? [复制链接]

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2022-10-05 18:35 |只看该作者 |倒序浏览
根据TCP的状态变迁图可知,通常当服务端在Listen状态下收到客户端发来的SYN请求后,返回SYN+ACK后,服务端TCP就从LISTEN状态变迁到SYN_RECV状态,这点可以在发起TCP主动连接的客户端执行如下iptables命令后,使得服务器端不能收到客户端的最后一个ACK来获得:
sudo iptables -A INPUT -p tcp --sport 9000 -j DROP  /* 假设TCP服务器在9000端口监听 */


之后在服务器端通过netstat命令即可看到每当一个客户端发来SYN后,服务器就为此客户端对应设立了一个SYN_RECV状态,如下图所示:



但是,这里有一个问题,即通过跟踪TCP的三次握手代码,可以看到实际上只有当服务端收到了客户端最后发来的ACK后,服务端会创建子套接字,并且此时会将子套接字的状态临时设置为TCP_SYN_RECV状态,之后再将其设置为TCP_ESTABLISHED状态。换句话讲,当服务端没有收到客户端的最后一个ACK时,是不可能创建子套接字的,那么在服务器端上执行netstat所看到的SYN_RECV这个状态,究竟是从哪里获得的,源码中根本没有这个状态的设置,netstat是怎么知道的呢?

请各位解惑,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP