• Leon📷 置顶
    2019-08-23
    net.ipv4.tcp_tw_recycle是客户端和服务器端都可以复用,但是容易造成端口接收数据混乱,4.12内核直接砍掉了,老师是因为内核去掉了所以没提了嘛

    作者回复: BINGO。太多了,大家也不好接受,我想我还是不求面面俱到,但求有所启发和引领。

    
     6
  • 何某人
    2019-08-23
    老师,那么通过setsockopt设置SO_REUSEADDR这个方法呢?网上资料基本上都是通过设置这个来解决TIME_WAIT。这个方法有什么优劣吗?

    作者回复: 这个是解决端口复用的问题,并不是解决TIME_WAIT,这个是告诉内核,即使TIME_WAIT状态的套接字,我也可以继续使用它做为新的套集字使用。

     5
     10
  • alan
    2019-08-23
    TIME_WAIT的作用:
    1. 确保主动断开方的最后一个ACK成功发到对方
    2. 确保残留的TCP包自然消亡
     1
     6
  • NeilMatthew
    2019-09-04
    TIME_WAIT的作用:
    1) 确保对方能够正确收到最后的ACK,帮助其关闭;
    2) 防迷走报文对程序带来的影响。
    TIME_WAIT的危害:
    1) 占用内存;
    2) 占用端口。
    展开

    作者回复: 总结很到位。

     1
     4
  • magicnum
    2019-09-01
    1.记录一个值,比如60s,经过一个网关就减去一定短值,值=0的时候网关决定丢弃;
    2.不需要。timestamp不需要交互,只是发送方使用的
     1
     3
  • 吴光庆
    2019-08-26
    为什么是2MSL,不是3 MSL,4 MSL。

    作者回复: 因为是一来一返。

     1
     3
  • JasonZhi
    2019-09-10
    SO_REUSEADDR和SO_REUSEPORT可以详细说下作用吗?有点迷糊,文章都没有说明这两个参数,评论区就冒出一大堆关于这两个参数的评论。

    作者回复: 哈哈,提前剧透啊。

    这是为了解决如何快速复用处于TIME_WAIT的连接,如果不设置这个选项,处于TIME_WAIT的连接是不能被快速复用的,必须等待系统回收连接才可以,如果这个时候开启服务器端口,会报地址已被占用的错误。

    这块在第15讲里会有详细阐述。

    
     2
  • Geek_9a0180
    2019-08-23
    印象中是当一端关闭socket连接,另一端如果尝试从TCP连接中读取数据,则会报connect reset,如果偿试向连接中写入数据,则会报connect reset by peer,好像和老师说的正相反,还请老师帮忙解答一下,谢谢:)

    作者回复: 首先,我不明白connect reset和connect reset by peer有啥区别哎,这两个不是一回事么?都是RST信号。

    其次,我确认读的时候会读到FIN报文,连续写则会得到RST结果。

     1
     2
  • tongmin_tsai
    2019-09-30
    老师,我有疑问的是,IP包中TTL每经过一次路由就少1,那么2MSL怎么确保可以一定大于TTL的?

    作者回复: 只要每次经过一跳的时间肯定大于1秒以上就可以了,实际处理的时间肯定大于这个值的。

    2MSL设置的为60秒,TTL设置为60,只有每次一跳都大于1秒,那么肯定时间总和大于60秒了。

     1
     1
  • 网络人
    2019-09-04
    老师,能讲下windows平台下有没有提供更安全的选择呢?有没有类似的方法?可以提供代码参考下吗?

    作者回复: windows下没有研究过,不过应该大差不差的,类似的机制吧,你可以读读MSDN。

    
     1
  • 扬~
    2019-08-31
    当机器出现大量的time wait 状态,原因该如何排查呀,谢谢老师

    作者回复: netstat看一下,看看是什么进程,什么端口,为什么会有这个现象。

     1
     1
  • 沉淀的梦想
    2019-08-24
    使用SO_REUSEADDR和SO_REUSEPORT这两个选项是好的方法吗?

    作者回复: 大部分程序是需要这么干的,不是什么"坏"习惯。

     1
     1
  • 传说中的成大大
    2019-08-23
    关于第二个问题,思考了第二遍,因为是发送方的当前时间戳和从对方接受到的最新时间戳,如果接收方改了时间然后再从网络里面取出来自己上一次的发送的时间戳有很大差异就会出问题了,比如往前改或者往后改!最关键我觉得还是看怎么通过时间戳判断生存时间!
    
     1
  • 许童童
    2019-08-23
    1. MSL的意思是最长报文段寿命。IP头部中有个TTL字段意思是生存时间。TTL每经过一个路由器就减1,到0就会被丢弃,而MSL是由RFC里面规定的2分钟,但实际在工程上2分钟太长,因此TCP允许根据具体的情况配置大小,TTL与MSL是有关系的但不是简单的相等关系,MSL要大于TTL。MSL内部应该就是一个普通的定时器实现的。
    2.不需要统一时钟,可以在第一次交换双方的时钟,之后用相对时间就可以了。
    
     1
  • Dovelol
    2019-08-23
    老师好,想问个问题,一般我们服务器上运行一个服务,比如tomcat,zk这种,然后监听8080或2181端口,这时候外部直连(不再经过web服务器转发)的话,虽然有很多连接但服务端应该都是只占用一个端口,也就是说netstat -anp命令看到的本机都是ip+固定端口,那么此时如果服务端主动关闭一些连接的话,也会有大量time_wait问题对吧,但此时好像并没有消耗更多端口,那这个影响对于服务端来说是什么呢?老师讲的出现大量time_wait应该都是在客户端的一方吧,因为客户端发起请求会占用一个新端口,主动关闭到time_wait阶段就相当于这个新的端口一直被占用。我还有个疑问是,这种大量time_wait在连接数多的情况下是肯定会出现的,是不是可以从减少连接的方向去解决问题呢,比如用连接池这种技术可以解决吗?

    作者回复: 这个时候你看到的连接都是服务器端被动建立的连接,本地端口都是服务器监听的端口,类似
    <127.0.0.1, 80, ip1, 51231>
    <127.0.0.1, 80, ip2, 51331>
    ...
    所以,不会存在我讲到的那个问题,这些个连接过了一段时间自然会被回收。

    连接池是为了多个线程复用连接,减少TCP连接的数量,是为了更高效的使用TCP,确实也客观减少了连接的数量。

     3
     1
  • 丹枫无迹
    2020-02-02
    由于引入了时间戳,我们在前面提到的 2MSL 问题就不复存在了,因为重复的数据包会因为时间戳过期被自然丢弃。
    这个没理解,为什么 2MSL 问题就不存在了?老师能解释下吗?
    
    
  • 刘忽悠
    2020-01-22
    1. ip协议里面有一个ttl字段,这个字段的值每次经过一个路由器就-1,减到0就丢弃,返回一个icmp消息;
    2 rtt时间是通过回显的方式,发送方收到以后,根据自己的时间计算的
    
    
  • 刘忽悠
    2020-01-22
    2msl一定能保证服务器正常关闭吗?
    如果服务器一直收不到最后的ack呢?假如说当服务器发送fin以后,客户端也收到了,但是因为网络状态不好,ack传不过去,导致客户端2msl计时器到时了,接着关闭了,那服务器是不是一直处在last_lack状态,服务器的rto计时器不停超时重传,一直到客户端收到fin以后,发现自己已经关闭了,发送rst报文给服务器,服务器收到rst以后出错呢?

    作者回复: 服务器在LAST_ACK状态,如果收到RST,自然认为自己是一个"终止"的连接,将自己的状态置为closed即可。

    
    
  • 雷神的盛宴
    2019-12-20
    net.ipv4.tcp_tw_reuse 要慎用,当客户端与服务端主机时间不同步时,客户端的发送的消息会被直接拒绝掉

    作者回复: 学到了

    
    
  • xbl
    2019-12-19
    本节课还是有些难理解 需要多读几遍 如果老师能讲的更详细些就好了
    
    
我们在线,来聊聊吧