服务端没有listen客户端发起连接建立 会发生什么
"服务端没有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函数,以便监听客户端的连接请求,并建立连接。
剩余10页未读,继续阅读
- 粉丝: 1541
- 资源: 79
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Spring Boot框架的博客系统.zip
- (源码)基于Spring Boot框架的博客管理系统.zip
- (源码)基于ESP8266和Blynk的IR设备控制系统.zip
- (源码)基于Java和JSP的校园论坛系统.zip
- (源码)基于ROS Kinetic框架的AGV激光雷达导航与SLAM系统.zip
- (源码)基于PythonDjango框架的资产管理系统.zip
- (源码)基于计算机系统原理与Arduino技术的学习平台.zip
- (源码)基于SSM框架的大学消息通知系统服务端.zip
- (源码)基于Java Servlet的学生信息管理系统.zip
- (源码)基于Qt和AVR的FestosMechatronics系统终端.zip