• 刘晓林
    2019-09-07
    关于tcp_tw_reuse和SO_REUSEADDR的区别,可以概括为:tcp_tw_reuse是为了缩短time_wait的时间,避免出现大量的time_wait链接而占用系统资源,解决的是accept后的问题;SO_REUSEADDR是为了解决time_wait状态带来的端口占用问题,以及支持同一个port对应多个ip,解决的是bind时的问题。

    作者回复: 总结得不错。

    
     16
  • G先生
    2019-10-13
    UDP的SO_REUSEADDR使用场景比较多的是组播网络,好处是,如我们在接收组播流的时候,比如用ffmpeg拉取了一个组播流,但是还想用ffmpeg拉取相同的组播流,这个时候就需要地址重用了

    作者回复: 👍

    
     4
  • xupeng1644
    2020-01-15
    老师 思考题第二题的答案是什么啊

    作者回复: 因为SO_REUSEADDR是针对新建立的连接才起作用,对已建立的连接设置是无效的。

    
     1
  • 传说中的成大大
    2019-09-04
    我竟然是沙发
    第一问: 百度出来的 针对udp是允许完全的重复的捆绑 就是是udp允许把ip地址绑定到多个套接口上,大概是为了在同一机器上运行多个多播程序的情况下,具体的实例却想不出来
    2. 因为我觉得bind函数时告诉内核我要监听这个ip地址和端口是在内核层的事情, 如果bind过后再进行设置套接字选项的话虽然是在应用层对套接字进行了修改,但是没告诉内核,这个地址需要避开timewait状态直接重用,大意就是没有影响到内核的处理

    作者回复: UDP用的比较少,实例确实比较难以想到。

    
     1
  • HerofH
    2019-12-26
    老师您好,我有个疑问,根据我的理解,TIME_WAIT是主动关闭方才会存在的状态,而服务端很多时候都是被动关闭方,为什么也会有TIME_WAIT状态呢?还是说服务端套接字设置SO_REUSEADDR只是用于服务端主动关闭的情况(比如快速重启)呢?

    作者回复: 你的理解是对的。

    
    
  • Geek_68d3d2
    2019-12-07
    没明白复用socket,如果复用了socket是不是就是相当于旧有的socket连接没有了time_wait时间了?也就是说对端可能收不到fin而一直处于等待状态?

    作者回复: 应该这样说是将原来处于TIME_WAIT状态的连接变成可利用的,而FIN是在TIME_WAIT状态之前已经发送出去了,不会引起对端一直处于等待状态。

     2
    
  • godtrue
    2019-11-23
    最佳实践:
    服务器端程序,都应该设置 SO_REUSEADDR 套接字选项,以便服务端程序可以在极短时间内复用同一个端口启动。
    在所有 TCP 服务器程序中,调用 bind 之前请设置 SO_REUSEADDR 套接字选项。

    实际开发,这个遇到的确实多一点,自己都是找到是谁占用的端口,然后弄死它,再重启应用。

    最早时都不知道怎么找,直接重启机器,再重启应用。
    展开

    作者回复: 太暴力了吧

     1
    
  • 林林
    2019-11-01
    老师,我们项目也存在服务器无法快速重启的问题,然而底层代码不开放,无法加上so_reuseaddr,不知道有没有其他办法可以解决?

    作者回复: 这个,给他们提issue吧。

     1
    
  • chs
    2019-10-30
    老师请讲一下SO_REUSEPORT

    作者回复: SO_REUSEPORT用在多个不同的socket监听在同一个端口上,这种情况比较罕见,容易出现所谓的"惊群"现象。当然,如果用的好,也可以解决一些特定场景的问题。

    
    
  • 小美
    2019-10-15
    使用SO_REUSEADDR感觉跟前面讲的time_wait状态持续2MSL的原因有冲突呀。服务能立即重启的话,就能收到上一次连接的旧数据包呀

    作者回复: 不是冲突的,SO_REUSEADDR是直接复用TIME_WAIT状态的连接,上一次连接的旧数据包会被忽略掉。

     1
    
  • 石将从
    2019-09-07
    怎么用telnet连接,求老师回答

    作者回复: $telnet 127.0.0.1 43211

    
    
  • 不动声色满心澎湃
    2019-09-04
    老师 有个疑问想问下:如果我的服务器是双网卡。一个192.168.1.220 一个是192.68.1.221 然后我让220和端口8010 处于time_wait状态, 这个时候再用221和8010去启动一个程序,那会报addr in use吗

    作者回复: 当然不会,TCP四元组,里面就有你这里提到的server_port。它改变了,四元组就不唯一了呀。

    
    
  • 不动声色满心澎湃
    2019-09-04
    老师, 希望可以多讲一点。 感觉听了很爽 但是觉得不够 哈哈哈

    作者回复: 哈哈,我写得很累的说。

    
    
  • nil
    2019-09-04
    学生时代写网络编程作业,调试的时候经常有遇到这个问题,然后通过每次改变端口号绕过这个问题。想想当时遇到问题一知半解,也不知道去寻找根本原因,哈哈哈,估计心思都在完成作业上,而根本不是想要掌握这个技术底层的原理

    作者回复: 哈哈,好在我们有大把的端口可以使用的。

    
    
我们在线,来聊聊吧