tcp nonblock connection rst

客户端(>5w)异步connect连接到server端,server端listen backlog设置为1024,发现存在部分客户端建立连接后,收到服务端的rst包。

先看下tcp监听套接字维护的两个队列(来自Unix网络编程)

测试模拟抓包如下:

解释:异步connect过快,导致server端listen已完成连接队列满了,后面接着来的connect请求放到未完成连接对列(SYN--->SYN,ACK, 等待客户端的ACK)中,当客户端的握手包ACK到来时,由于已完成连接队列已满,无法继续接受连接,因此丢弃该ACK,而未完成队列一段时间后仍为收到ACK,会重传SYN,ACK包,这就出现了下图所示的多次重传,默认重传5次(可通过sysct -a | grep synack查看和设置。)5次重传后,将该未完成连接从未完成连接队列移出。而客户端看来连接正常,接着发送速度,收到服务端的RST包。

详解介绍请看:http://blog.csdn.net/justlinux2010/article/details/8604676

tcp nonblock connection rst

时间: 2024-11-09 09:47:10

tcp nonblock connection rst的相关文章

TCP中的RST复位信号

TCP中的RST复位信号 在TCP协议中RST表示复位,用来关闭异常的连接,在TCP的设计中它是不可或缺的. 发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓存区的包发送RST包.而接收端收到RST包后,也不必发送ACK包来确认. TCP报文中有一个RST标志位,如下图: 产生RST的原因 1.端口未打开 服务器程序端口未打开而客户端来连接,例如telnet一个未打开的TCP的端口可能会出现这种错误. 比如主机A向主机B发送一个SYN请求,表示想要连接主机B的40000端口,但是主

TCP--RST复位攻击

1.RST标识位 RST表示复位,用来异常的关闭连接,在TCP的设计中它是不可或缺的.发送RST包关闭连接时,不必等缓冲区的包都发出去(FIN包),直接就丢弃缓存区的包发送RST包.而接收端收到RST包后,也不必发送ACK包来确认.TCP处理程序会在自己认为的异常时刻发送RST包. 2个例子: 1)A向B发起连接,但B之上并未监听相应的端口,这时B操作系统上的TCP处理程序会发RST包.2)A和B已经正常建立连接,正在通讯时,A向B发送了FIN包要求关连接,B发送ACK后,A网断了,A通过若干原

TCP中的RST标志(Reset)详解

在谈RST攻击前,必须先了解TCP:如何通过三次握手建立TCP连接.四次握手怎样把全双工的连接关闭掉.滑动窗口是怎么传输数据的.TCP的flag标志位里RST在哪些情况下出现.下面我会画一些尽量简化的图来表达清楚上述几点,之后再了解下RST攻击是怎么回事. 1.TCP是什么? TCP是在IP网络层之上的传输层协议,用于提供port到port面向连接的可靠的字节流传输.我来用土语解释下上面的几个关键字: port到port:IP层只管数据包从一个IP到另一个IP的传输,IP层之上的TCP层加上端口

TCP协议: SYN ACK FIN RST PSH URG 详解

TCP的三次握手是怎么进行的了:发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行连接,这是第一次握手:接收端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它,可以通讯了,并且让发送端发送一个确认数据包,这是第二次握手:最后,发送端发送一个SYN=0,ACK=1的数据包给接收端,告诉它连接已被确认,这就是第三次握手.之后,一个TCP连接建立,开始通讯. *SYN:同步标志同步序列编号(Synchronize Sequence Numbers

几种TCP连接中出现RST的情况

http://my.oschina.net/costaxu/blog/127394 在TCP协议中RST表示复位,用来异常的关闭连接,在TCP的设计中它是不可或缺的.发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓存区的包发送RST包.而接收端收到RST包后,也不必发送ACK包来确认. 其实在网络编程过程中,各种RST错误其实是比较难排查和找到原因的.下面我列出几种会出现RST的情况. 1 端口未打开 服务器程序端口未打开而客户端来连接.这种情况是最为常见和好理解的一种了.去tel

几种TCP连接中出现RST的情况(转载)

TCP RST 网络 linux 目录[-] 1 端口未打开 2 请求超时 3 提前关闭 4 在一个已关闭的socket上收到数据 总结 参考文献: 应该没有人会质疑,现在是一个网络时代了.应该不少程序员在编程中需要考虑多机.局域网.广域网的各种问题.所以网络知识也是避免不了学习的.而且笔者一直觉得TCP/IP网络知识在一个程序员知识体系中必需占有一席之地的. 在TCP协议中RST表示复位,用来异常的关闭连接,在TCP的设计中它是不可或缺的.发送RST包关闭连接时,不必等缓冲区的包都发出去,直接

TCP内核源码分析笔记

Table of Contents 1 术语 1.1 ABC 1.2 SACK 1.3 D-SACK 1.4 F-RTO 1.5 template 2 tcp_v4_connect() 3 sys_accept() 3.1 tcp_accept() 4 三次握手 4.1 客户端发送SYN段 4.2 服务端接收到SYN段后,发送SYN/ACK处理 4.3 客户端回复确认ACK段 4.3.1 tcp_rcv_synsent_state_process() 4.4 服务端收到ACK段 5 数据传输 5

第5章-unix网络编程 TCP/服务端程序示例

这一章主要是完成一个完整的tcp客户/服务器程序.通过一很简单的例子.弄清客户和服务器如何启动,如何终止,发生了某些错误会发生什么.这些事很重要的 客户端代码 #include "unp.h" //static void str_cli1(FILE*fp,int sockfd); int main(int argc,char *argv[]) { int sockfd; struct sockaddr_in servaddr; sockfd=Socket(AF_INET,SOCK_ST

TCP连接如何断开连接

我们知道,一个基于TCP/IP的客户端-服务器的程序中,正常情况下,我会是启动服务器使其在一个端口上监听请求,等待客户端的连接:通过TCP的三次握手,客户端能够通过socket建立一个到服务器的连接:然后,两者就可以基于这个socket连接通信了.连接结束后,客户端(进程)会退出:在不需要继续处理客户请求的情况下,服务器(进程)也将退出.而且,当一个进程退出的时候,内核会关闭所有由这个进程打开的套接字,这里将触发TCP的四次挥手进而关闭一个socket连接.但是,在一些异常的情况下,譬如:服务器