从tcp原理角度理解Broken pipe和Connection reset by peer的区别

场景:
  1. 服务端往socket里写一次数据,返回继续做select
  2. 服务端连续写两次数据,必须保证两次的buffer都是有数据的,也就是保证ByteBuffer的pos和limit要不是一个值
  结果:
  1. 会抛出Connection reset by peer

  

  

  1. 会抛出Broken pipe

  

分析:
  1. 当我们往一个对端已经close的通道写数据的时候,对方的tcp会收到这个报文,并且反馈一个reset报文,tcpdump的结果如下所示,当收到reset报文的时候,继续做select读数据的时候就会抛出Connect reset by peer的异常,从堆栈可以看得出
  1. 当第一次往一个对端已经close的通道写数据的时候会和上面的情况一样,会收到reset报文,当再次往这个socket写数据的时候,就会抛出Broken pipe了 ,根据tcp的约定,当收到reset包的时候,上层必须要做出处理,调用将socket文件描述符进行关闭,其实也意味着pipe会关闭,因此会抛出这个顾名思义的异常。

posted @ 2020-09-21 20:09  鬼手三  阅读(457)  评论(0)    收藏  举报