其实这里保鲜定时器并没有被激活,当服务器接受窗口为0的时候,客户端每隔一分钟会向服务器发送一个窗口探测包(探测现在服务器现在接受窗口的大小),服务器会相应ack包。所以这个tcp探测到这个连接是存货的 就不会启动保鲜定时器 回复 10# bljswpu
客户断为什么要丢掉缓存?你确定,你close后没有发送fin吗?
按我的理解,根据tcp转换,你close,客户端会发送fin,然后有established-》fin_wait_1,如果受到ack那么进入fin_wait_2,那么tcp处于半连接的状态,也就是没有数据可以发送,但是仍然可以接收数据,tcp协议栈会保证数据发送出去;如果没有受到ack,那么还会处于fin_wait_1。
回复 12# goingstudy
如果发送缓冲区没有数据当然会直接发送fin但是此时如果发送缓冲区还有数据,是不会立刻发送fin包的他会等发送缓冲区的数据全部发送出去以后 才会发送fin的包 close的语义应该是尽量保证握手完成吧?
丢数据发FIN包应该是不允许的,那样TCP就不叫可靠传输了。
(这样接收端会认为发送端完成所有数据的传输并正常结束,但实际是有数据丢失了)
没有close就退出进程的行为类似与shutdown?
不确定,这个得对着代码说话。 回复 14# nswcfd
shutdown 也会发送fin包也直接退出进程发送的是rst包。如果close 不丢掉缓冲区的数据发送fin的包的话 那么如果对端一直不read数据,本端发送缓冲器的数据就没法发出去,fin包也没法发出去,那么这个socket对应的资源就一直维护着? 刚刚测试了一下 只有客户端在Windows环境下才会出现在不close的情况想 直接退出进程才会出现直接发送rst包在Linux环境下的客户端 要等缓冲器的数据全部发送出去才会发送fin的包
bljswpu 发表于 2016-09-10 12:31
回复 9# goingstudy
我知道保鲜定时器啊,我现在诱惑的是我没有close直接退出进程,客户端会直接丢掉发 ...
你退出进程就会close fd
fd不会不close的
页:
1
[2]