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包
2.向⼀个已经关掉的连接send数据;tcpip详解英文txt
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。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。