面试题:TCP 四次挥手能变成三次挥手吗?
文章目录
坚持思考,就会很酷。
大家好,这是进入大厂面试准备 第2篇文章
知识地图:LINUX系统调用
上篇文章 :面试题:read 返回0是否代表一定对方连接已经关闭?
行为 | 能否读取关闭前数据 | read() 返回值 |
|
---|---|---|---|
对端close() |
是(直到缓冲区空) | 0(缓冲区空时) | |
对端shutdown(SHUT_WR) |
是(直到缓冲区空) | 0(缓冲区空时) | |
对端异常终止 | 否(可能部分数据丢失) | -1(错误) |
从应用开发者角度分析 正常情况下read操作2个步骤
- t1:对方关闭连接
- t2:read 取关闭前数据 回大于0
- t3: 继续读数据read =0 ,代表对方连接已经关闭。
了解这个信息后,我马上可以处理下一个问题了。
题目来源:知乎
问: TCP 四次挥手,可以变成三次吗,为什么
答:
- 没有数据要发送
- 开启了 TCP 延迟确认机制,
- 那么第二和第三次挥手就会合并传输,这样就出现了三次挥手。
下面 是我的分析思路
青铜视角:
- 从来没有听说过这个问题,根本不敢回答,紧张,三次握手,四次挥手 课本一直这么说
- 回顾过去知识,也想不明白,作为应用开发工程师,从来注意这个情况,生气、
悄悄话:
- 标准 TCP(RFC 793/1122)仅定义 四次挥手 为连接终止的可靠流程。
- 明确规定:收到 FIN 后只发送 ACK,不应在同一报文中发送 FIN
- 三次挥手 只是一种 报文合并 或 扩展协议 中的优化手段,不属于官方 必选 模式
白银视角:
我大胆猜想一下 TC P 是面向字节流的协议(需要拆分),UDP 是面向报文的协议(不拆分)
- 刚建立链接,没有数据传输,syn +ack 合并在一块就是提高效率
- 建立连接和传递数据,tcp必须获取完整数据后才能确认一个完整请求。在高并发情况下,在缓冲区,上面图片 根本 tcp缓冲区这个概念还有数据。因此。这个需要处理业务,关键不知道close()被动关闭时候什么时候执行。因此是四次挥手
- 如果对方close关闭时候,没有缓冲区没有数据,并且服务端 没有其他业务处理。这个场景下,fin +ack 一块发送
通过这个题目 Linux内核协议栈学习过程才是最重要的
参考资料
- TCP的FIN_WAIT1状态理解|深入理解TCP
2. 如何分析常见的TCP问题?
- 我不建议你使用 netstat,最好还是用 ss
- 当你面对网络问题一筹莫展时,可以考虑使用 tcpdump 抓包看看,
3. 深入理解网络高性能编程实战
- 攻击报文洪水到达时,每秒要过滤掉几十万攻击请求,一点不夸张。当时,他们用了一种叫零拷贝的核心技术,需要对操作系统内核和网络协议底层有很深入的了解。
- 我面试过一些候选人,发现即使是工作多年的技术人,对网络协议和网络编程的理解,仍然停留在一个比较浅的层次上
- 大多数人仅停留在「是这样」的阶段,对「为什么」缺乏深入了解
• 大家经常说的四层、七层,分别指的是什么?
• TCP 三次握手是什么,TIME_WAIT 是怎么发生的?CLOSE_WAIT 又是什么状态?
• Linux 下的 epoll 解决的是什么问题?如何使用 epoll 写出高性能的网络程序?
• 什么是网络事件驱动模型?Reactor 模式又是什么?
在我看来,学高性能网络编程,首先****要掌握两个核心要点: 第一,在理解网络协议的基础上,充分利用操作系统内核提供的能力,感知各种网络 I/O 事件; 第二,学会使用线程处理并发。
- TIME_WAIT:隐藏在细节下的魔鬼
- netstat 命令查看后才发现,主机上有成千上万处于 TIME_WAIT 状态的连接。
TCP 连接对外提供服务。每个连接会占用一个本地端口,当在高并发的情况下, TIME_WAIT 状态的连接过多,多到把本机可用的端口耗尽, 应用服务对外表现的症状,就是不能正常工作了
- TCP/IP协议栈到底是内核态好还是用户态好
- TCP协议疑难杂症全景解析|硬核
- 网络的本质作用还是“端到端”的通信
- 3次握手的目的很简单,就是分配资源,初始化序列号,这时还不涉及数据传输,3次就足够做到这个了,而4次挥手的目的是终止数据传输
Shmoocon 2013 的绝对奇思妙想的演讲,题目是 C10M Defending The Internet At Scale。 Robert以一种我以前从来没有听说过的才华横溢的方式来搭建处理这个问题的架构。他的开场是一些历史,关于Unix最初为什么不是设计成一个通用的服务器的OS,而是为电话网络的控制系统设计的。真正传输数据的是电话网络,因而控制层和数据层有非常清晰的区分。问题是
https://mp.weixin.qq.com/s/3tKfiJnn5qKgz-FsBkzrSw
- 深度思考|TCP协议存在那些缺陷?
- 本文翻译自 2019 年 DigitalOcean 的工程师 Nate Sweet 在 KubeCon 的一篇分享:
Understanding (and Troubleshooting) the eBPF Datapath in Cilium 。
-
从C10K到C10M高性能网络的探索与实践
-
从C10K到C10M高性能网络的探索与实践
-
深入理解高并发技术dpdk无锁队列
-
深入理解Linux异步I/O框架 io_uring https://mp.weixin.qq.com/s/w3kpA8VlvQc0be5FOE5fjA
-
深入理解零拷贝技术
如果您觉得阅读本文对您有帮助, 请点一下“点赞,转发” 按钮, 您的“点赞,转发” 将是我最大的写作动力!