初步认识TCP协议——TCP的reset报文

当本次TCP接收到不正确的TCP报文(即端口号与IP地址为本机,但对方的IP地址本机不认识,或是对应端口上没有TCP连接)时,会发送reset报文通知对方放弃连接。TCP连接是通过socket对来标识连接的(即本机与对方的IP地址加端口号)。

发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓冲区中的包,发送RST

在如下情况会发送reset报文:

1、发送连接请求到没有进程监听(处于LISTEN状态)的端口

2、客户端和服务器的某一方在交互的过程中发生异常(如程序崩溃等)该方系统将向对端发送TCP reset报文,告之对方释放相关的TCP连接,当应用程序想要发送reset报文时,会将还未处理的本次TCP连接的报文全部丢弃,然后发送reset报文,接收方TCP会通知应用程序直接放弃本次连接,同时不会发送ACK。

3、接收端收到TCP报文,但是发现该TCP的报文,并不在其已建立的TCP连接列表内,则其直接向对端发送reset报文

4、在交互的双方中的某一方长期未收到来自对方的确认报文,则其在超出一定的重传次数或时间后,会主动向对端发送reset报文释放该TCP连接

5、有些应用开发者在设计应用系统时,会利用reset报文快速释放已经完成数据交互的TCP连接,以提高业务交互的效率

6、检测半关闭连接

    如果一方已经关闭或异常终止连接而另一方却还不知道,我们将这样的TCP连接称为半打开的。任何一端的主机异常都可能导致发生这种情况。只要不打算在半打开连接上传输数据,仍处于连接状态的一方就不会检测另一方已经出现异常。下面介绍一种建立半打开连接的情形。在bsdi上运行Telnet客户程序,通过它和svr4上的丢弃服务器建立连接。接着断开服务器主机与以太网的电缆,并重启服务器主机。这可以模拟服务器主机出现异常(在重启服务器之前断开以太网电缆是为了防止它向打开的连接发送FIN,某些TCP在关机时会这么做)。服务器主机重启后,我们重新接上电缆,并从客户向服务器发送一行字符。由于服务器的TCP已经重新启动,它将丢失复位前连接的所有信息,因此它不知道数据报文段中提到的连接。TCP处理的原则是接收方以复位作为应答。

由于发送reset报文不会有ACK,若reset报文丢失,且半开放方一直未发送报文,是否意味着TCP会一直处于半关闭的状态?

不会,TCP有一个存活计数器,用于判断对方是否还与自己建立连接,若在规定时间里未接受到对方的报文,则会reset本次连接。

发送完reset报文后,若建立socket相同的连接,之前连接的在网络上的延迟报文会不会被误认为是新建立连接的报文?

不会,如果序列号与确认号不同,则不会接收相应的报文,在RFC754中规定,ISN每隔4ms ISN的值就会递增,在32位的情况下,从0开始增长到最大值需要4.5小时,所以之前连接的报文与当前连接ack相等的概率很低,基本可以忽略。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值