潇傲江湖
2025-11-08
来自黑龙江
感谢老师加餐分享,有下面几个不懂得地方,请老师解惑: 1、优先发起fin挥手的一方大多数情况下都是调用shutdown(SHUT_WR)嘛?比如服务端优先发起fin,然后一般之后服务端还可以对接收的数据回复ack,而被动fin的一侧一般是调用close()嘛?因为他不需要再读取和写入任何数据了。不知道可以不可以这么理解。 2、服务端同时发送了15、16、17三个报文,其中15和16是有载荷的数据报文,17是FIN报文,那么理论上客户端15和16应该都不会读取吧,怎么会只读取了15而没有读取16呢?那么15没有读取的话,那么整个http事务应该就不完整了吧。 3、客户端没有读取接收缓存区中的16号报文数据,导致了客户端发送rst。我不明白的是,既然客户端没有读取数据,为什么客户端19号报文ACK确认到6309(确认了15和16号报文载荷)?我的理解是只要内核收到了16号报文,那么内核在发送19号报文时就会正常进行ack确认(也就是文中提到的,序列号、确认号、flag位等等都是内核层面的),但是__tcp_close() 函数检查的“接收缓冲区中还有未读数据”,是指应用程序是否读取了该16号报文数据,因此即使19号报文ack确认了也只是表示内核收到了,但是不代表应用程序读取了。不知道这个理解是否正确?
展开