您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页TCPIP详解--发送ACK和RST的场景

TCPIP详解--发送ACK和RST的场景

来源:爱go旅游网
TCPIP详解--发送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。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务