服务器程序端口未打开而客户端来连接。这种情况是最为常见和好理解的一种了。去 telnet 一个未打开的 TCP 的端口可能会出现这种错误。这个和操作系统的实现有关。在某些情况下,操作系统也会完全不理会这些发到未打开端口请求 。
比如在下面这种情况下,主机 241 向主机 114 发送一个 SYN 请求,表示想要连接主机 114 的 40000 端口,但是主机 114 上根本没有打开 40000 这个端口,于是就向主机 241 发送了一个 RST 。这种情况很常见。特别是服务器程序 core dump 之后重启之前连续出现 RST的情况会经常发生 。当然在某些操作系统的主机上,未必是这样的表现。比如向一台 WINDOWS7 的主机发送一个连接不存在的端口的请求,这台主机就不会回应 。
2 请求超 时
曾经遇到过这样一个情况 : 一个客户端连接服务器, connect 返回 -1 并且 error=EINPROGRESS 。 直接 telnet 发现网络连接没有问题。 ping 没有出现丢包。用抓包工具查看,客户端是在收到服务器发出的 SYN 之后就莫名其妙的发送了 RST 。
比如像下面这样 :有 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 。4 在一个已关闭的 socket 上收到数 据
如果某个 socket 已经关闭,但依然收到数据也会产生 RST 。
一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”, 地址范围从1.0.0.0 到126.0.0.0。可用的A类网络有126个,每个网络能容纳1亿多个主机。
2. B类IP地址
一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,地址范围从128.0.0.0到191.255.255.255。可用的B类网络有16382个,每个网络能容纳6万多个主机 。
3. C类IP地址
一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。范围从192.0.0.0到223.255.255.255。C类网络可达209万余个,每个网络能容纳254个主机。
4. D类地址用于多点广播(Multicast)。
D类IP地址第一个字节以“lll0”开始,它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。
5. E类IP地址
以“llll0”开始,为将来使用保留。 在IP地址3种主要类型里,各保留了3个区域作为私有地址,其地址范围如下:
A类地址:10.0.0.0~10.255.255.255
B类地址:172.16.0.0~172.31.255.255
C类地址:192.168.0.0~192.168.255.255
另外IPv6地址长度为128位,是IETF(互联网工程任务组,Internet Engineering Task Force)设计的用于替代现行版本IP协议(IPv4)的下一代IP协议。