服务端没有listen客户端发起连接建立 会发生什么
需积分: 0 138 浏览量
更新于2023-05-15
收藏 896KB PDF 举报
"服务端没有listen客户端发起连接建立会发生什么"
当服务端没有listen客户端发起连接建立时,会发生什么?这个问题是很多开发者都曾经遇到的问题。为了解答这个问题,我们需要先了解TCP/IP协议栈的工作机制。
在TCP/IP协议栈中,客户端和服务端之间的连接建立需要经过三次握手机制。客户端会向服务端发送SYN包,以请求建立连接。服务端收到SYN包后,会回复一个SYN+ACK包,以确认客户端的请求。客户端会回复一个ACK包,以确认服务端的回复。
但是,如果服务端没有listen客户端发起连接建立,那么会发生什么呢?答案是,服务端会回复一个RST包,以断开连接。
这是为什么呢?因为当服务端没有listen客户端发起连接建立时,服务端并不知道客户端的连接请求。因此,当客户端发送SYN包时,服务端会认为这是一个非法的连接请求,并回复一个RST包,以断开连接。
在Linux内核中,处理收到TCP报文的入口函数是tcp_v4_rcv。在收到TCP报文后,会调用__inet_lookup_skb函数找到TCP报文所属的socket。inet_lookup_skb函数首先查找连接建立状态的socket(inet_lookup_established),如果找到了对应的socket,就会调用该socket的回调函数。如果没有找到对应的socket,就会回复一个RST包,以断开连接。
在我们的实验中,我们使用了一个简单的TCP服务器程序,绑定了IP地址和端口,但是没有调用listen函数。然后,我们使用浏览器访问这个地址,并使用抓包工具抓了这个过程。结果显示,客户端对服务端发起SYN包后,服务端回复了RST包。
因此,我们可以得出结论,如果服务端没有listen客户端发起连接建立,那么服务端会回复一个RST包,以断开连接。
在QUIC协议中,这种情况下客户端和服务器可以各自选择一组ID来标记自己,因此即使移动设备的网络变化后,导致IP地址变化了,只要仍保有上下文信息(比如连接ID、TLS密钥等),就可以“无缝”地复用原连接,消除重连的成本,没有丝毫卡顿感,达到了连接迁移的功能。
我们可以看到,如果服务端没有listen客户端发起连接建立,那么服务端会回复一个RST包,以断开连接。这也是为什么我们需要在服务端调用listen函数,以便监听客户端的连接请求,并建立连接。