博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP/IP详解--发送ACK和RST的场景
阅读量:5806 次
发布时间:2019-06-18

本文共 765 字,大约阅读时间需要 2 分钟。

在有以下几种情景,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。

 

转载地址:http://vrkbx.baihongyu.com/

你可能感兴趣的文章
centos 6.3 禁用selinux、ipv6 的无奈
查看>>
flannel 的连通与隔离 - 每天5分钟玩转 Docker 容器技术(61)
查看>>
python3下multiprocessing、threading和gevent性能对比
查看>>
AsyncTask的版本差异
查看>>
PHP标准库介绍(SPL)
查看>>
我的友情链接
查看>>
DU(1)
查看>>
C程序设计语言--第一章 导言
查看>>
Linux的作业控制
查看>>
饺子播放器
查看>>
我的友情链接
查看>>
SQL Server 2012 AlwaysON
查看>>
3月中国数据域名总量净增1,602个 增长过程曲折
查看>>
1月第1周网络安全报告:被篡改.COM网站占74.5%
查看>>
走进Java报表工具--Style Report、润乾报表等报表软件(认识篇)
查看>>
单用户(emergency) 模式、救援(rescue)模式、VMware克隆、两台机器密钥登录
查看>>
阿里云重磅推出物联网安全运营中心Link SOC
查看>>
浅谈栈帧(一)
查看>>
Centos下搭建Zabbix监控系统
查看>>
Spring实战3-笔记1
查看>>