利志分享
fast_forward
view_headline
开发工具箱
go教程
clickhouse教程
kafka教程
python教程
shell教程
原创杂文
打赏
开发工具箱
go教程
clickhouse教程
kafka教程
python教程
shell教程
原创杂文
打赏
go基础知识
go的环境搭建
go变量
go常量
go字符串
go数组和切片
go的map和range的使用
go的struct的使用
go的函数使用
go的interface的使用
go channel使用
go的routine使用
go的panic和recover使用
go实现http请求
go 复杂的http请求
go实现表单提交
go实现表单验证
go上传附件
go实现mysql连接
go实现redis操作
go对xml操作
go的json操作
go的base64使用
go实现websocket功能
go的单元测试
go的文件操作
go的web服务基础
golang url解析和包介绍使用
go的正则表达式-MatchString,FindString等的使用
golang实现从byte和文件中读取csv格式数据
go进阶
go的类型转换
go的map的多维应用
go的多维数组和slice使用
go的select使用
go的原子性atomic类库使用
go给图片添加水印
go给图片添加文字
go实现http的rpc服务
go实现tcp的rpc服务
go实现json格式的rpc服务
多个defer的执行问题
golang的队列机制实现同步主线程接受子协程的结果
go的值传递和引用传递以及引用类型的问题
go中的make和new的使用问题
golang读文件分析1
golang读文件分析2
golang实现自然周计算
golang实现读写excel
go实战
beego的安装和使用
beego聊天室的基本配置
beego聊天室的生成
Go 写一个类似 cron 的定时任务管理器
Go 调度器 M, P 和 G
AES对称加密算法如何用golang语言实现?
非对称加密的RSA算法如何通过golang来实现?
golang实现http2.0服务端,客户端完整案例
go实战总结
go的日期操作类使用-日常使用类库no.1
go的字符串的连接讲解-日常实战总结no.1
golang实现队列服务-日常实战总结no.2
深入理解golang的channel的使用-日常实战总结no.3
go的sync.pool在实际应用中的讲解和性能分析比较-日常实战总结no.4
go语言中一个典型的引用类型的数据使用案例的注意点-日常实战总结no.5
go的sync包的使用详解1-日常实战总结6
go的sync包的使用详解2-日常实战总结7
深度学习go判断各个类型相等-日常实战总结8
go的排序类使用讲解-日常实战总结9
go的context使用讲解
golang 网络爬虫框架gocolly
golang实现桶排序
golang处理gb2312转utf-8编码的问题
golang实现单链的添加,删除以及翻转
golang的一个err不判断引起的血案(json.Marshal的error到底要不要判断?)
如何控制golang协程的并发数量问题-panic: too many concurrent operations on a single file or socket (max 1048575)
你所要知道的redis客户端返回值知识点
golang实现连续的时间,比如连续的天,月,年等。
go深入
由引用类型引发的概念的深入理解
sync.WaitGroup深入源码理解
golang如何创建动态的struct类型以及如何转换成slice类型
深入理解go的管道数据读写
关于go的只读管道只写管道以及单向管道的理解
深入理解go的slice深入,slice扩容机制
深入理解go的函数参数传递
golang实现动态调用不同struct中不同的方法
如何配置sqlx.DB的SetMaxOpenConns SetMaxIdleConns 和 SetConnMaxLifetime来保证更好的性能
深入理解go的select原理
深入理解golang的GPM模型
精通golang的项目管理go modules
深入理解golang的GC回收机制
超级肝文-深入剖析客户端出现connect reset by peer报错相关的技术知识
Golang源码深入-Go1.15.6发起http请求流程-1
Golang源码深入-Go1.15.6发起http请求流程-2
Golang源码深入-Go1.15.6发起http请求流程-3(http2)
go应用
需求整理-手把手带大家用go开发一个匿名在线聊天室
第二篇-手把手带大家用go开发一个匿名在线聊天室
第三篇-手把手带大家用go开发一个匿名在线聊天室
go面试
【建议收藏】吐血整理Golang面试干货21问-吊打面试官-1
【建议收藏】整理Golang面试第二篇干货13问
【建议收藏】Redis知识干货汇总
【建议收藏】Mysql知识干货(mysql八股文)汇总
目录
go基础知识
go的环境搭建
go变量
go常量
go字符串
go数组和切片
go的map和range的使用
go的struct的使用
go的函数使用
go的interface的使用
go channel使用
go的routine使用
go的panic和recover使用
go实现http请求
go 复杂的http请求
go实现表单提交
go实现表单验证
go上传附件
go实现mysql连接
go实现redis操作
go对xml操作
go的json操作
go的base64使用
go实现websocket功能
go的单元测试
go的文件操作
go的web服务基础
golang url解析和包介绍使用
go的正则表达式-MatchString,FindString等的使用
golang实现从byte和文件中读取csv格式数据
go进阶
go的类型转换
go的map的多维应用
go的多维数组和slice使用
go的select使用
go的原子性atomic类库使用
go给图片添加水印
go给图片添加文字
go实现http的rpc服务
go实现tcp的rpc服务
go实现json格式的rpc服务
多个defer的执行问题
golang的队列机制实现同步主线程接受子协程的结果
go的值传递和引用传递以及引用类型的问题
go中的make和new的使用问题
golang读文件分析1
golang读文件分析2
golang实现自然周计算
golang实现读写excel
go实战
beego的安装和使用
beego聊天室的基本配置
beego聊天室的生成
Go 写一个类似 cron 的定时任务管理器
Go 调度器 M, P 和 G
AES对称加密算法如何用golang语言实现?
非对称加密的RSA算法如何通过golang来实现?
golang实现http2.0服务端,客户端完整案例
go实战总结
go的日期操作类使用-日常使用类库no.1
go的字符串的连接讲解-日常实战总结no.1
golang实现队列服务-日常实战总结no.2
深入理解golang的channel的使用-日常实战总结no.3
go的sync.pool在实际应用中的讲解和性能分析比较-日常实战总结no.4
go语言中一个典型的引用类型的数据使用案例的注意点-日常实战总结no.5
go的sync包的使用详解1-日常实战总结6
go的sync包的使用详解2-日常实战总结7
深度学习go判断各个类型相等-日常实战总结8
go的排序类使用讲解-日常实战总结9
go的context使用讲解
golang 网络爬虫框架gocolly
golang实现桶排序
golang处理gb2312转utf-8编码的问题
golang实现单链的添加,删除以及翻转
golang的一个err不判断引起的血案(json.Marshal的error到底要不要判断?)
如何控制golang协程的并发数量问题-panic: too many concurrent operations on a single file or socket (max 1048575)
你所要知道的redis客户端返回值知识点
golang实现连续的时间,比如连续的天,月,年等。
go深入
由引用类型引发的概念的深入理解
sync.WaitGroup深入源码理解
golang如何创建动态的struct类型以及如何转换成slice类型
深入理解go的管道数据读写
关于go的只读管道只写管道以及单向管道的理解
深入理解go的slice深入,slice扩容机制
深入理解go的函数参数传递
golang实现动态调用不同struct中不同的方法
如何配置sqlx.DB的SetMaxOpenConns SetMaxIdleConns 和 SetConnMaxLifetime来保证更好的性能
深入理解go的select原理
深入理解golang的GPM模型
精通golang的项目管理go modules
深入理解golang的GC回收机制
超级肝文-深入剖析客户端出现connect reset by peer报错相关的技术知识
Golang源码深入-Go1.15.6发起http请求流程-1
Golang源码深入-Go1.15.6发起http请求流程-2
Golang源码深入-Go1.15.6发起http请求流程-3(http2)
go应用
需求整理-手把手带大家用go开发一个匿名在线聊天室
第二篇-手把手带大家用go开发一个匿名在线聊天室
第三篇-手把手带大家用go开发一个匿名在线聊天室
go面试
【建议收藏】吐血整理Golang面试干货21问-吊打面试官-1
【建议收藏】整理Golang面试第二篇干货13问
【建议收藏】Redis知识干货汇总
【建议收藏】Mysql知识干货(mysql八股文)汇总
超级肝文-深入剖析客户端出现connect reset by peer报错相关的技术知识
阅读:88
分享次数:0
关于http请求的报错:connect reset by peer,我相信大家应该都有所见过。今天我来剖析一下这个报错情况以及整理一下相关技术知识。 案例 --- 报错原因:服务端断开连接,但是客户端还是复用之前的连接进行请求,则会报此错误。如果是http1协议和http1.1协议中出现此类报错,则是开启:Keep-Alive,http1.1则是默认开启Keep-Alive的,如果是用的http2协议的话,则报错是因为复用连接。 复现方式:由于这个报错基于tcp协议来实现比较方便,我这里就采用go来实现server端,客户端,并且复现报错。 第一步实现server端代码: ``` package main import ( "log" "net" "os" ) func server() { listener, err := net.Listen("tcp", ":8090") if err != nil { log.Fatal(err) } defer listener.Close() conn, err := listener.Accept() if err != nil { log.Fatal("server", err) os.Exit(1) } log.Printf("server close start") conn.Close() log.Printf("server close end") } func main() { server() } ``` 第二步实现客户端代码: ``` package main import ( "errors" "log" "net" "syscall" "time" ) func client() { conn, err := net.Dial("tcp", "124.221.97.119:8090") if err != nil { log.Fatal("client", err) } if _, err := conn.Write([]byte("ab")); err != nil { log.Printf("client: %v", err) } time.Sleep(1 * time.Second) // wait for close on the server side data := make([]byte, 1) if _, err := conn.Read(data); err != nil { log.Printf("client: %v", err) if errors.Is(err, syscall.ECONNRESET) { log.Print("This is connection reset by peer error") } } } func main() { client() } ``` 第三步启动server端,server端在124.221.97.119(这个我买的临时的机器,大家不要对我这个进行进行攻击哦)这个机器上。 第四步,客户端在另外一个机器上,执行客户端,然后server端会断开,客户端则会报如下的错误: ``` 2022/03/27 19:59:20 client: read tcp 10.23.165.46:24972->124.221.97.119:8090: read: connection reset by peer 2022/03/27 19:59:20 This is connection reset by peer error ``` 第五步:tcpdump抓包结果: ``` 20:11:23.580281 IP xx.xx.xx.xx.24976 > 10.0.16.6.8090: Flags [S], seq 3946141306, win 64952, options [mss 1412,sackOK,TS val 3205380659 ecr 0,nop,wscale 7], length 0 20:11:23.580293 IP 10.0.16.6.8090 > xx.xx.xx.xx.24976: Flags [S.], seq 298221640, ack 3946141307, win 28960, options [mss 1460,sackOK,TS val 2496773398 ecr 3205380659,nop,wscale 7], length 0 20:11:23.588677 IP xx.xx.xx.xx.24976 > 10.0.16.6.8090: Flags [.], ack 1, win 508, options [nop,nop,TS val 3205380668 ecr 2496773398], length 0 20:11:23.588698 IP xx.xx.xx.xx.24976 > 10.0.16.6.8090: Flags [P.], seq 1:3, ack 1, win 508, options [nop,nop,TS val 3205380668 ecr 2496773398], length 2 20:11:23.588703 IP 10.0.16.6.8090 > xx.xx.xx.xx.24976: Flags [.], ack 3, win 227, options [nop,nop,TS val 2496773406 ecr 3205380668], length 0 20:11:23.589014 IP 10.0.16.6.8090 > xx.xx.xx.xx.24976: Flags [R.], seq 1, ack 3, win 227, options [nop,nop,TS val 2496773407 ecr 3205380668], length 0 ``` 截图如下:  好了,上面的报错我们已经给大家复现出来了,下面我们来看一下另外一种情况,假如我们直接执行上面的client代码,会得到如下的报错: ``` 2022/03/27 20:20:06 clientdial tcp 124.221.97.119:8090: connect: connection refused exit status 1 ``` 这个时候的关于tcpdump抓包则会出现如下信息: ``` 20:23:52.448494 IP xx.xx.xx.xx.25010 > 10.0.16.6.8090: Flags [S], seq 2442872680, win 64952, options [mss 1412,sackOK,TS val 3206129524 ecr 0,nop,wscale 7], length 0 20:23:52.448524 IP 10.0.16.6.8090 > xx.xx.xx.xx.25010: Flags [R.], seq 0, ack 2442872681, win 0, length 0 ``` 关于connection refused的报错,tcp协议直接会返回RST包给客户端,我们看下下面的图。  关于connect reset by peer,tcp协议响应了RST包,造成客户端报错。具体如图:  关于上面的出现的问题,我们需要学习如下知识,才能让我们更好的分析问题,复现问题,解决好问题。 理解tcpdump的输出 --- ``` 20:23:52.448494 IP xx.xx.xx.xx.25010 > 10.0.16.6.8090: Flags [S], seq 2442872680, win 64952, options [mss 1412,sackOK,TS val 3206129524 ecr 0,nop,wscale 7], length 0 ``` ###### 内容结构 1. 第一列:时分秒毫秒 20:23:52.448494 1. 第二列:网络协议 IP 1. 第三列:发送方的ip地址+端口号,其中xx.xx.xx.xx是 ip,而25010是端口号 1. 第四列:箭头 >, 表示数据流向 1. 第五列:接收方的ip地址+端口号,其中 10.0.16.6是 ip,而8090是端口号 1. 第六列:冒号 1. 第七列:数据包内容,包括Flags 标识符,seq 号,ack 号,win 窗口,数据长度 length,其中 [P.] 表示 PUSH 标志位为 1,更多看Flag标识符讲解。 ###### Flags 标识符 1. [S] : SYN(开始连接) 1. [P] : PSH(推送数据) 1. [F] : FIN (结束连接) 1. [R] : RST(重置连接) 1. [.] : 没有 Flag,由于除了 SYN 包外所有的数据包都有ACK,所以一般这个标志也可表示 ACK OSI(Open System Interconnection)七层模型与TCP/IP五层模型 --- 关于分层的知识,如下。  HTTP协议 --- ###### HTTP协议基于TCP/IP的传输流图解:  ###### 一个HTTPS请求的流程图解  ###### tcp建立图解  # 总结 **1:要学会从问题出发,学习相关问题的技术知识,深入剖析知识,这样更容易成长。 2:connect reset by peer的报错是因为出现RST重置连接引发的报错。** 参考文献: https://gosamples.dev/connection-reset-by-peer/#:~:text=Typically%2C%20you%20can%20see%20the,connection%20to%20be%20forcibly%20closed.
感觉本站内容不错,读后有收获?
attach_money
我要小额打赏,鼓励作者写出更好的教程
扫码关注公众号:talk_lizhi