Web日志出现Broken pipe错误:tcp如何产生Broken pipe

tcp是如何产生Broken pipe错误的呢?我使用packetdrill来进行了一次模拟,packetdrill的脚本如下:

// 服务端建立好监听,默认端口是8080,虚拟网卡是tun0,抓包命令是tcpdump -i tun0
0       socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+9      setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0      bind(3, ..., ...) = 0
+0      listen(3, 1) = 0
// 客户端进行三次握手
+0      < S  0:0(0) win 1000 <mss 1000>
+0      > S. 0:0(0) ack 1 <...>
+0      < .  1:1(0) ack 1 win 1000
// 服务端接收请求并写入1000字节数据
+0      accept(3, ..., ...) = 4
+0      write(4, ..., 1000) = 1000
// 客户端直接发rst包断开连接
+0      < R.  1:1(0) win 1000
// 服务端继续写数据,得到错误:Connection reset by peer
+0      write(4, ..., 1000) = -1
// 服务端继续写数据,得到错误:Broken pipe
+0      write(4, ..., 1000) = 1000

上面的例子是客户端关闭了连接,服务端第二次写的时候连接已经关闭了,所以报错Broken pipe。下面还有一种情况,是服务端主动关闭了写端,再写的时候报错Broken pipe,代码如下:

// 服务端建立好监听
0       socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+9      setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0      bind(3, ..., ...) = 0
+0      listen(3, 1) = 0
// 客户端进行三次握手
+0      < S  0:0(0) win 1000 <mss 1000>
+0      > S. 0:0(0) ack 1 <...>
+0      < .  1:1(0) ack 1 win 1000

+0      accept(3, ..., ...) = 4
// 这里服务端主动关闭了写端,shutdown(4, 1)是一样的效果
+0      shutdown(4, 2) = 0
+0      write(4, ..., 1000) = 1000
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!