韩国客户、读写缓慢和Socket缓存区

刚才记录了一个网络问题,一下子就把这个问题想起来了,就顺手记录一下。
先说问题表现:

  • 客户通过VPN程序连接到内网
  • 然后通过这条Tunnel 用FTP传输超大的文件
  • 单独上传和下载都没有问题,但是只要同时进行,就有可能直接速度降到0

解决的思路(都是不成功的):

  • 偶然事件,直接鸵鸟算法,不予理会 。但实际上韩国客户这个问题的重现几率超级大。
  • 在Server端的ip rules太多导致一个包要经过多个Filter从而导致速度太慢
    • 无法解释为什么刚开始很快
    • 而且Linux的iptable效率很高

最后的原因与解决方案:

  • 在上传和下载同时进行的时候,Socket的缓存区会被瞬间写满
  • 但是我们在处理Socket写的时候并没有用非阻塞的写法,而是用了阻塞的写法
  • 这就造成当上传和下载同时写数据的时候因为缓存区满了,大家都等着另外一方(这里指的是FTP)把数据写完自己写。所以就死锁在这里,速度降到了零
  • 最后在write的时候也对Socket进行Select,只有在是可写状态时才进行写操作,这样就可以了

P.S. 其实我也没有说的太明白,主要这个问题是别人解决的,我的印象深刻但是细节忽略了不少。
反正,在考虑高速的网络转发的程序时,一定要用非阻塞的写法,否则死锁的概率很高。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容