• TCP/IP详解--发送ACK和RST的场景


    在有以下几种情景,TCP会把ack包发出去:

    1.收到1个包,启动200ms定时器,等到200ms的定时器到点了(第二个包没来),于是对这个包的确认ack被发送。这叫做“延迟发送”;

    2.收到1个包,启动200ms定时器,200ms定时器还没到,第二个数据包又来了(两个数据包一个ack);

    3.收到1个包,启动200ms定时器,还没超时,正好要给对方发点内容。于是对这个包的确认ack就跟着捎过去。这叫做“捎带发送”;

    4.每当TCP接收到一个超出期望序号的失序数据时,它总是发送一个确认序号为其期望序号的ACK;

    5.窗口更新或者也叫做打开窗口(接收端窗口达到最大的时候,接收缓存中的数据全部推向进程导致接收缓存为空),通知发送端可以继续发送;

    6.正常情况下对对方保活探针的响应,详见TCP keepalive

     

    有以下情况会发送RST包

    1.connect一个不存在的端口;

    2.向一个已经关掉的连接send数据;

    3.向一个已经崩溃的对端发送数据(连接之前已经被建立);

    4.close(sockfd)时,直接丢弃接收缓冲区未读取的数据,并给对方发一个RST。这个是由SO_LINGER选项来控制的;

    5.a重启,收到b的保活探针,a发rst,通知b。

    TCP socket在任何状态下,只要收到RST包,即可进入CLOSED初始状态。


    值得注意的是RST报文段不会导致另一端产生任何响应,另一端根本不进行确认。收到RST的一方将终止该连接。程序行为如下:
    阻塞模型下,内核无法主动通知应用层出错,只有应用层主动调用read()或者write()这样的IO系统调用时,内核才会利用出错来通知应用层对端RST。

    非阻塞模型下,select或者epoll会返回sockfd可读,应用层对其进行读取时,read()会报错RST。

     

    TCP/IP详解--发送ACK和RST的场景

  • 相关阅读:
    【原创】禁止快播自动升级到最新版本,自己发现的方法
    又一灵异事件 Delphi 2007 在 Win7
    [DCC Error] E2161 Error: RLINK32: Error opening file "_____.drf"
    单例模式 改进
    estackoverflow with message 'stack overflow'
    所有可选的快捷键列表[转自万一博客]
    SQL server 除法运算
    正则表达式的一个坑[.\n]无效引起的血案
    getcwd()和__DIR__区别
    并发处理的技巧php
  • 原文地址:https://www.cnblogs.com/549294286/p/5100076.html
Copyright © 2020-2023  润新知