zoukankan      html  css  js  c++  java
  • 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的场景

  • 相关阅读:
    PHP header函数使用教程
    mysql show processlist 命令检查mysql lock
    MySQL
    background-position 用法详细介绍
    Windows下Mysql主从配置(Mysql5.5)
    Tcl介绍和基础语法
    研发项目管理
    VCS 查看代码覆盖率
    Openrisc的or1200
    MY $MYVIMRC
  • 原文地址:https://www.cnblogs.com/549294286/p/5100076.html
Copyright © 2011-2022 走看看