26close会阻塞?

https://bbs.csdn.net/topics/380166111

及《java网络编程精解》p42页都说close可能阻塞

本文实践:

 

 

 

 

结论:

1 fin在1s以内就发出了,close未阻塞

2 5s内,5s后

JoycedeMacBook:netty-test joyce$ netstat -an|grep 8000
tcp4 0 0 192.168.1.9.58834 49.235.75.155.8000 FIN_WAIT_2
JoycedeMacBook:netty-test joyce$ netstat -an|grep 8000
tcp4 0 0 192.168.1.9.58834 49.235.75.155.8000 TIME_WAIT

3 书中有两个勘误:

1)天真的以为服务端sleep了5s就以为没有读,实际上内核都读了,而且还ack了(只是用户进程sleep没从内核copy走,只要内核缓冲未满,会继续读),抓包显示,包并不会积压在本地没发送而导致close等待阻塞

2)即使对方没读(比如内核读缓冲区接收窗口耗尽),本地包积压了,只要发送缓冲区还有地方,write、close就不会阻塞,fin会写入内核发送缓冲区然后返回

4 在11读缓冲区(滑动窗口)耗尽与write阻塞、拆包、延迟(一)中确实有write阻塞的情况,我们推导一下close阻塞的情况-可能是发送缓冲区满了,像write阻塞一样

5 编号54,由5s后的服务端程序退出隐式发出fin包

posted on 2020-01-01 22:27  silyvin  阅读(262)  评论(0)    收藏  举报