jiufei19 发表于 2022-10-05 18:35

SYN_RECV状态在还未创建子套接字时,是怎么设置的?

根据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是怎么知道的呢?

请各位解惑,谢谢!
页: [1]
查看完整版本: SYN_RECV状态在还未创建子套接字时,是怎么设置的?