首先,我们要构建一个场景,一个服务端和一个客户端,连接建立之后,客户端一直给服务端发送数据,而服务端程序并没有及时读取客户端发送过来的数据,即让服务端线程阻塞,数据一直留在服务端的TCP缓冲区中,然后某个时间点,服务端突然关闭连接,这个时候服务端的TCP就会发送一个RST包给客户端.
在这里我们使用Netty构建这样的场景.并不会贴出所有代码,文章内容要求你对Netty有比较高的认识.
服务端核心代码
@Override
protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception{
Thread.sleep(1000 * 60);
ctx.channel().close();
}
这里先让服务端线程睡眠60秒,就是让它不读取TCP接收缓冲区的数据,在这个时间段内客户端疯狂发送数据给服务端,让服务端的TCP接收缓冲区里的数据一直增多.
60秒之后,服务端突然关闭连接,这个时候,其实TCP接收缓冲区里面的数据就被丢弃了.
客户端核心代码
@Override
protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
for (;;) {
Thread.sleep(1000 * 3);
ctx.writeAndFlush("xxoo");
}
}
客户端疯狂给服务端发送数据.
我们通过Wireshark观察
三次握手之后,客户端疯狂给服务端发送数据.
我们再通过netstat命令查看服务端TCP接收缓冲区数据
实验环境是MAC系统
服务端TCP接收缓冲区数据一直在增多.等到我们设置的60秒时间到之后,服务端关闭连接,这个时候在看Wireshark
服务端向客户端发送了RST.
服务端操作系统TCP模块,在服务端关闭连接的时候,发现接收缓冲区还有未处理的数据,于是向客户端发送RST, 如果接收缓冲区没有数据的话,那么就是正常的四次挥手过程.
接收端Netty出现异常
请关注我的个人网站和公众号