服务端没有listen客户端发起连接建立 会发生什么

preview
需积分: 0 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函数,以便监听客户端的连接请求,并建立连接。
Java后端程序员知识库
  • 粉丝: 1543
  • 资源: 79
上传资源 快速赚钱
voice
center-task 前往需求广场,查看用户热搜