博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP网络编程中RST分节总结
阅读量:5103 次
发布时间:2019-06-13

本文共 965 字,大约阅读时间需要 3 分钟。

RST为“复位”,它是TCP在某些错误情况下所发出的一种TCP分节。

有三个条件可以产生RST:

       1), SYN到达某端口但此端口上没有正在监听的服务器。

       2), TCP想取消一个已有连接

       3), TCP接收了一个根本不存在的连接上的分节。

 

1.  connect 

函数返回错误ECONNREFUSED:

如果对客户的SYN的响应是RST,则表明该服务器主机在我们指定的端口上没有进程在等待与之连接(例如服务器进程也许没有启动),这称为硬错(hard error),客户一接收到RST,马上就返回错误ECONNREFUSED.

TCP为监听套接口维护两个队列。两个队列之和不超过listen函数第二个参数backlog

当一个客户SYN到达时,若两个队列都是满的,TCP就忽略此分节,且不发送RST.这个因为:这种情况是暂时的,客户TCP将重发SYN,期望不久就能在队列中找到空闲条目。要是TCP服务器发送了一个RST,客户connect函数将立即发送一个错误,强制应用进程处理这种情况,而不是让TCP正常的重传机制来处理。还有,客户区别不了这两种情况:作为SYN的响应,意为“此端口上没有服务器”的RST和意为“有服务器在此端口上但其队列满”的RST.

有以下两种处理方法:忽略新的SYN,或为此SYN响应一个RST

2.往一个对端已经关闭的套接字上写入数据会收到一个RST信号

如果此时不判断read , write函数的返回值,就不知道服务器是否响应了RST, 此时客户端如果向接收了RST的套接口进行写操作时,内核给该进程发一个SIGPIPE信号。此信号的缺省行为就是终止进程,所以,进程必须捕获它以免被终止。

3.  服务器主机崩溃后重启

如果服务器主机与客户端建立连接后崩溃,如果此时,客户端向服务器发送数据,而服务器已经崩溃不能响应客户端ACK,客户TCP将持续重传数据分节,试图从服务器上接收一个ACK,如果服务器一直崩溃客户端会发现服务器已经崩溃或目的地不可达,但可能需要比较长的时间; 如果服务器在客户端发现崩溃前重启,服务器的TCP丢失了崩溃前的所有连接信息,所以服务器TCP对接收的客户数据分节以RST响应。

转载于:https://www.cnblogs.com/luiz/p/6828828.html

你可能感兴趣的文章
Linux 基础知识
查看>>
开辟新空间输入成绩
查看>>
Android屏幕适配
查看>>
c#使用XSLT将xml文档转换为html文档
查看>>
管道符、重定向、环境变量
查看>>
python日期,时间函数
查看>>
Timus 1146. Maximum Sum
查看>>
shell脚本学习总结02--数组
查看>>
[HDU3683 Gomoku]
查看>>
【工具相关】iOS-Reveal的使用
查看>>
整体二分——[Poi2011]Meteors
查看>>
数据库3
查看>>
delphi之事件
查看>>
windows server 2008 r2 安装
查看>>
Enigma –> Sadness
查看>>
存储分类
查看>>
下一代操作系统与软件
查看>>
【iOS越狱开发】如何将应用打包成.ipa文件
查看>>
[NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)
查看>>
Hat’s Words (分成两个字符串考虑)
查看>>