bljswpu 发表于 2016-09-08 00:41

tcp在clsoe后,如果缓冲区有数据,何时发送fin包?

现有一个客户端和一个服务器,客户端一直往服务器发送数据,服务器不read数据,此时服务器的接受缓冲区已满,客户端的发送缓冲区也已满,客户端进入阻塞。如果此时直接退出进程,客户端会发给服务器发送一个rst包,客户端发送缓冲区的数据也丢掉了。如果是先close fd后再退出进程,客户端不会马上发送fin包,也不会发送rst包。客户端要等到服务器read data, 接受缓冲区有空间后,会把留在发送缓冲区的发送出去以后才会发送fin的包。那么问题来了,如果服务器一直不read data,那么客户端已close的这个socket什么时候才会给服务器发送fin包,释放资源呢?

bljswpu 发表于 2016-09-08 20:15

没人回答一下吗?

_nosay 发表于 2016-09-08 20:47

关掉客户端{:qq23:}

bljswpu 发表于 2016-09-08 21:44

回复 3# _nosay

客户端进程已退出

_nosay 发表于 2016-09-09 09:46

回复 4# bljswpu


那你说的这种情况是不是和DDOS攻击类似,客户端伪造源地址发个SYN包,服务端回SYNACK,但始终收不到第三次握手,就一直有个半连接在那,要等好长时间的超时才释放。
只不过它是处心积虑的,你说的这种情况是正常情况下就会出现的,你是担心好多客户端关闭,造成服务端的压力是吧?

bljswpu 发表于 2016-09-09 13:45

回复 5# _nosay

我就是想知道如果客户端发送缓冲器还有数据,而且服务器一直不读取对应socket的数据,客户端的的数据就一直不会发出去,因为对端的接受窗口为0. 此时 如果客户单关闭socket,从抓包的数据上看,此时客户端是不会发fin的包给服务器的。等5分之后,服务器读取了该socket中的数据。接受窗口不为0,客户端会把缓冲区的数据发送出去才会发送fin的包。如果服务器一直不读取该socket的数据,那么接受窗口一直是0,客户端就一直不会把缓冲区的数据和fin的包发送出。那么这个客户端对应的socket资源什么时候释放呢。

bljswpu 发表于 2016-09-09 13:47

回复 5# _nosay

和服务器压力无关啊 只是客户端资源释放的问题

_nosay 发表于 2016-09-09 14:54

回复 7# bljswpu


{:qq10:} 噢,不懂了,等会的人回答吧。

goingstudy 发表于 2016-09-09 18:35

你不知道有timer吗?如果是tcp的话,长时间不接受,那么就不会收到ack,不会受到ack,timer超时,这时会重传,根据拥塞算法进行拥塞控制,具体的窗口变化要看算法,然后最终发送窗口会变为0,停止发送。然后长时间没有活动,保活定时器会启动,如果仍然没有反应,会自动断开连接。
个人理解

bljswpu 发表于 2016-09-10 12:31

回复 9# goingstudy

我知道保鲜定时器啊,我现在诱惑的是我没有close直接退出进程,客户端会直接丢掉发送缓冲器的数据,直接发给服务器rst包,但是我close再退出进程,客户端为什么不能丢掉发送缓冲器的数据,发送fin包呢。难道rst包优先级太高。
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: tcp在clsoe后,如果缓冲区有数据,何时发送fin包?