资源描述
几种TCP连接中出现RST的情况(比较详细)收藏人:hh37552013-07-02 1 阅:4725 转:16I来源回H|分享几种TCP连接中出现RST的情况17人收藏此文章,我要收藏发表于1个月前(2013-05-04 11:40),已有314次阅读, 共0个评论目录:- 1端口未打开 2请求超时 3提前关闭 4在一个已关闭的socket上收到数据总结参考文献:应该没有人会质疑,现在是一个网络时代了。应该不少程序员在编程中需要考虑多机、 局域网、广域网的各种问题。所以网络知识也是避免不了学习的。而且笔者一直觉得T CP/IP网络知识在一个程序员知识体系中必需占有一席之地的。在TCP协议中RST表示复位,用来异常的关闭连接,在TCP的设计中它是不可或缺 的。发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓存区的包发 送RST包。而接收端收到RST包后,也不必发送ACK包来确认。其实在网络编程过程中,各种RST错误其实是比较难排查和找到原因的。下面我列出 几种会出现RST的情况。1端口未打开服务器程序端口未打开而客户端来连接。这种情况是最为常见和好理解的一种了。去t elnet 个未打开的TCP的端口可能会出现这种错误。这个和操作系统的实现有关。 在某些情况下,操作系统也会完全不理会这些发到未打开端口请求。比如在下面这种情况下,主机241向主机114发送一个SYN请求,表示想要连接主 机114的40000端口,但是主机114上根本没有打开40000这个端口,于是就向 主机241发送了一个RST。这种情况很常见。特别是服务器程序core dump之后重 启之前连续出现RST的情况会经常发生。10 : 24; 00.766469 IP211. 0064 .114.40000; S 1967 nop wscaleio :zqf.oci.7 8口05空 ipiih. qciiziciizi 、e .zqi.q石斗;r当然在某些操作系统的主机上,未必是这样的表现。比如向一台WINDOWS7的主机 发送一个连接不存在的端口的请求,这台主机就不会回应。2请求超时曾经遇到过这样一个情况:一个客户端连接服务器,connect返回-1并且error =EINP ROGRESS。直接tel net发现网络连接没有问题。pi ng没有出现丢包。用抓包工具查 看,客户端是在收到服务器发出的SYN之后就莫名其妙的发送了 RST。比如像下面这样:15:01;27. 799961 IP89. 37004 mestamp 8543S944 0? nopT wscale 215:01:27. 961886 IP27. 8888 89.1460? sackOK, timestamp 114654795 85435944,. nop, wscale 2)15:01:27.961900 IP MMIHR 89. 37004 27. E有89、27两台主机。主机89向主机27发送了一个SYN,表示希望连接8888端 口,主机27回应了主机89 -个 SYN表示可以连接。但是主机27却很不友好,莫名 其妙的发送了一个RST表示我不想连接你了。后来经过排查发现,在主机89上的程序在建立了 socket之后,用setsockopt的SO _RCVTIMEO选项设置了 recv的超时时间为100ms。而我们看上面的抓包结果表 示,从主机89发出SYN到接收SYN的时间多达110ms。(从15:01:27.799961 到15:01:27.961886,小数点之后的单位是微秒)。因此主机89上的程序认为接 收超时,所以发送了 RST拒绝进一步发送数据。3提前关闭关于TCP,我想我们在教科书里都读到过一句话,TCP是一种可靠的连接。而这可 靠有这样一种含义,那就是操作系统接收到的来自TCP连接中的每一个字节,我都会 让应用程序接收到。如果应用程序不接收怎么办?你猜对了,RST。看两段程序:01/server.c0203int main(int argc, char* argv)0405int listen fd, real fd;06struet sockaddr in listen addr, client addr;07socklen t len = sizeof(struet sockaddr in);08listen fd = socket(AF INET, SOCK STREAM, 0);09if(listen fd = -1)1011perror(socket failed);这一段是server的最简单的代码。逻辑很简单,监听一个TCP端口然后当有客户端来 连接的时候fork 个子进程来处理。注意看的是这一段fork里面的处理:1char pcContent4096;2read(real fd,pcContent,4096);3close(real fd);每次只是读socket的前4096个字节,然后就关闭掉连接。然后再看一下clie nt的代码:16inet pton(AF INET,SER IP,&s addr.sin addr);17s addr.sin port = htons(SER PORT);18if(connect(send sk,(struet sockaddr*)&s addr,len) = 一1) - 1920perror(eonneet fail );21return -1;2223char peContent5000=0;24write(send sk,peContent,5000);25sleep(1);26elose(send sk);27这段代码更简单,就是打开一个socket然后连接一个服务器并发送5000个字节。刚 才我们看服务器的代码,每次只接收4096个字节,那么就是说客户端发送的剩下的4 个字节服务端的应用程序没有接收到,服务器端的socket就被关闭掉,这种情况下会 发生什么状况呢,还是抓包看一看。22char pcContent4096=0;23write(send sk,pcContent,4096);24sleep(1);25write(send sk,pcContent,4096);26close(send sk);27服务端:15:39:36. 154301 IP localbost. 58577 localhost. 9877: Fl: val 4294952126 ecr 0 nopP wscale 4, length 015:39:36. 154377 IP localhost. 9877 localhost. 58577; FL s 16396, sackOK? TS val 4294952126 ecr 4294952126? nop? wsc; 15:39:36. 154506 IP localhost. 58577 localhost. 9877 : FL4294952126, length 015:39:36. 156302 IP localhost. 58577 localhost. 9877 : Fl: 294952126 ecr 4294952126, length 409615:39:36. 156357 IP localbost. 9877 localliost. 58577 : FL ecr 4294952126, length 015:39:36. 158841 IP localhost. 9877 localhost. 58577: Fl localhost. 9877 : Fl; 4294952127, length 015:39:37,. 158758 IP localhost. 58577 localhost. 9877; FL 1 4294952377 ecr 4294952127, length 409615:39:37. 158902 IP localbost. 9877 localliost. 58577 : Fl:总结,本文讲了几种TCP连接中出现RST的情况。实际上肯定还有无数种的RST发 生,我以后会慢慢收集把更多的例子加入这篇文章。参考文献:1 从TCP协议的原理来谈谈 RST攻击 http:92 TCP 客户-服务器程序例子 http:/blog.csd n.n et/youkuxiaobin/a rticle/details/ 6917880
展开阅读全文