tcp在clsoe后,如果缓冲区有数据,何时发送fin包?
现有一个客户端和一个服务器,客户端一直往服务器发送数据,服务器不read数据,此时服务器的接受缓冲区已满,客户端的发送缓冲区也已满,客户端进入阻塞。如果此时直接退出进程,客户端会发给服务器发送一个rst包,客户端发送缓冲区的数据也丢掉了。如果是先close fd后再退出进程,客户端不会马上发送fin包,也不会发送rst包。客户端要等到服务器read data, 接受缓冲区有空间后,会把留在发送缓冲区的发送出去以后才会发送fin的包。那么问题来了,如果服务器一直不read data,那么客户端已close的这个socket什么时候才会给服务器发送fin包,释放资源呢?没人回答一下吗? 关掉客户端{:qq23:} 回复 3# _nosay
客户端进程已退出 回复 4# bljswpu
那你说的这种情况是不是和DDOS攻击类似,客户端伪造源地址发个SYN包,服务端回SYNACK,但始终收不到第三次握手,就一直有个半连接在那,要等好长时间的超时才释放。
只不过它是处心积虑的,你说的这种情况是正常情况下就会出现的,你是担心好多客户端关闭,造成服务端的压力是吧?
回复 5# _nosay
我就是想知道如果客户端发送缓冲器还有数据,而且服务器一直不读取对应socket的数据,客户端的的数据就一直不会发出去,因为对端的接受窗口为0. 此时 如果客户单关闭socket,从抓包的数据上看,此时客户端是不会发fin的包给服务器的。等5分之后,服务器读取了该socket中的数据。接受窗口不为0,客户端会把缓冲区的数据发送出去才会发送fin的包。如果服务器一直不读取该socket的数据,那么接受窗口一直是0,客户端就一直不会把缓冲区的数据和fin的包发送出。那么这个客户端对应的socket资源什么时候释放呢。
回复 5# _nosay
和服务器压力无关啊 只是客户端资源释放的问题 回复 7# bljswpu
{:qq10:} 噢,不懂了,等会的人回答吧。 你不知道有timer吗?如果是tcp的话,长时间不接受,那么就不会收到ack,不会受到ack,timer超时,这时会重传,根据拥塞算法进行拥塞控制,具体的窗口变化要看算法,然后最终发送窗口会变为0,停止发送。然后长时间没有活动,保活定时器会启动,如果仍然没有反应,会自动断开连接。
个人理解 回复 9# goingstudy
我知道保鲜定时器啊,我现在诱惑的是我没有close直接退出进程,客户端会直接丢掉发送缓冲器的数据,直接发给服务器rst包,但是我close再退出进程,客户端为什么不能丢掉发送缓冲器的数据,发送fin包呢。难道rst包优先级太高。