作者回复: BINGO。太多了,大家也不好接受,我想我还是不求面面俱到,但求有所启发和引领。
作者回复: 这个是解决端口复用的问题,并不是解决TIME_WAIT,这个是告诉内核,即使TIME_WAIT状态的套接字,我也可以继续使用它做为新的套集字使用。
作者回复: 总结很到位。
作者回复: 因为是一来一返。
作者回复: 哈哈,提前剧透啊。
这是为了解决如何快速复用处于TIME_WAIT的连接,如果不设置这个选项,处于TIME_WAIT的连接是不能被快速复用的,必须等待系统回收连接才可以,如果这个时候开启服务器端口,会报地址已被占用的错误。
这块在第15讲里会有详细阐述。
作者回复: 首先,我不明白connect reset和connect reset by peer有啥区别哎,这两个不是一回事么?都是RST信号。
其次,我确认读的时候会读到FIN报文,连续写则会得到RST结果。
作者回复: 只要每次经过一跳的时间肯定大于1秒以上就可以了,实际处理的时间肯定大于这个值的。
2MSL设置的为60秒,TTL设置为60,只有每次一跳都大于1秒,那么肯定时间总和大于60秒了。
作者回复: windows下没有研究过,不过应该大差不差的,类似的机制吧,你可以读读MSDN。
作者回复: netstat看一下,看看是什么进程,什么端口,为什么会有这个现象。
作者回复: 大部分程序是需要这么干的,不是什么"坏"习惯。
作者回复: 这个时候你看到的连接都是服务器端被动建立的连接,本地端口都是服务器监听的端口,类似
<127.0.0.1, 80, ip1, 51231>
<127.0.0.1, 80, ip2, 51331>
...
所以,不会存在我讲到的那个问题,这些个连接过了一段时间自然会被回收。
连接池是为了多个线程复用连接,减少TCP连接的数量,是为了更高效的使用TCP,确实也客观减少了连接的数量。
作者回复: 服务器在LAST_ACK状态,如果收到RST,自然认为自己是一个"终止"的连接,将自己的状态置为closed即可。
作者回复: 学到了