首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
tcp连接4次挥手的疑问
### 问题描述 看完 郭新华 老师的网络编程之后有几个疑问想咨询一下 郭新华的相关视频地址:https://www.bilibili.com/video/BV1fb4y1477C?spm_id_from=333.999.0.0 ### tcp连接四次挥手的疑问 -1.正常来说,tcp 断开时一般需要经过四次挥手,也可能格式三次挥手。 如下图: ![](https://wenda-1252906962.file.myqcloud.com/uploads/202206/13917_62aeecef6429d.png) - 郭新华视频教程截图: ![](https://wenda-1252906962.file.myqcloud.com/uploads/202206/13917_62aeeeb35800f.png) -2.但是我用 go 语言编写的http 客户端请求时,在挥手阶段,客户端直接发送了 RST、ACK 断开连接,并没有按照常规的四次挥手来断开连接,请问 go 语言的这种方式也是合理的吗? ```code # 以下是go语言代码 func main() { resp, err := http.Get("http://49.232.145.118:20171/api/v1/portal/news?newsType=10&page=1&limit=50") if err != nil { fmt.Println(err) return } body, err := ioutil.ReadAll(resp.Body) fmt.Println(string(body)) fmt.Println(resp.StatusCode) if resp.StatusCode == 200 { fmt.Println("ok") } _ = resp.Body.Close() } ``` go 语言 http 客户端发送的请求抓包结果: ![](https://wenda-1252906962.file.myqcloud.com/uploads/202206/13917_62aeee2823ac0.png) ### 我的疑问 关于go语言这个问题,我测试了go语言github上 6k star的包以及go语言原生代码,在挥手阶段都是直接发送 RST\ACK包结束tcp连接,没有走正常的四次挥手,在go语言仓库提问,他们说仓库只接受bug复现与问题改进,不接受讨论,让我去 Stackoverflow,我在 stackoverflow 上面提问后,没人回答。 这个问题本身和swoole没有什么关系,但是还是希望在swoole社区获取一些帮助,解答一下四次挥手直接用 RST、ACK 结束tcp连接的优缺点。
发布于2年前 · 11 次浏览 · 来自
提问
20229527
### 问题描述 看完 郭新华 老师的网络编程之后有几个疑问想咨询一下 郭新华的相关视频地址:https://www.bilibili.com/video/BV1fb4y1477C?spm_id_from=333.999.0.0 ### tcp连接四次挥手的疑问 -1.正常来说,tcp 断开时一般需要经过四次挥手,也可能格式三次挥手。 如下图: ![](https://wenda-1252906962.file.myqcloud.com/uploads/202206/13917_62aeecef6429d.png) - 郭新华视频教程截图: ![](https://wenda-1252906962.file.myqcloud.com/uploads/202206/13917_62aeeeb35800f.png) -2.但是我用 go 语言编写的http 客户端请求时,在挥手阶段,客户端直接发送了 RST、ACK 断开连接,并没有按照常规的四次挥手来断开连接,请问 go 语言的这种方式也是合理的吗? ```code # 以下是go语言代码 func main() { resp, err := http.Get("http://49.232.145.118:20171/api/v1/portal/news?newsType=10&page=1&limit=50") if err != nil { fmt.Println(err) return } body, err := ioutil.ReadAll(resp.Body) fmt.Println(string(body)) fmt.Println(resp.StatusCode) if resp.StatusCode == 200 { fmt.Println("ok") } _ = resp.Body.Close() } ``` go 语言 http 客户端发送的请求抓包结果: ![](https://wenda-1252906962.file.myqcloud.com/uploads/202206/13917_62aeee2823ac0.png) ### 我的疑问 关于go语言这个问题,我测试了go语言github上 6k star的包以及go语言原生代码,在挥手阶段都是直接发送 RST\ACK包结束tcp连接,没有走正常的四次挥手,在go语言仓库提问,他们说仓库只接受bug复现与问题改进,不接受讨论,让我去 Stackoverflow,我在 stackoverflow 上面提问后,没人回答。 这个问题本身和swoole没有什么关系,但是还是希望在swoole社区获取一些帮助,解答一下四次挥手直接用 RST、ACK 结束tcp连接的优缺点。
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2022-06-30
Rango
关闭连接究竟是`RST`还是`FIN`,取决于对端是否`recv`了数据,如果服务端没有完整接收客户端发送的数据,在`socket`缓存区中任然有数据,这时直接执行`close`就会发送`RST`而不是`FIN`。 反之如果服务端已经完全`recv`了客户端发送的所有数据,这时执行`close`就是`FIN`
赞
0
回复
微信公众号
热门内容
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。