首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
冰淇淋麻麻
江西师范大学 测试工程师
发布于上海
关注
已关注
取消关注
@Java高级架构:
鹅厂面试题:TCP 连接,一端断电和进程崩溃有什么区别?
有位读者找我说,他在面试腾讯的时候,遇到了这么个问题: 这个属于 TCP 异常断开连接的场景,这部分内容在我的「图解网络」还没有详细介绍过,这次就乘着这次机会补一补。 这个问题有几个关键词: 没有开启 keepalive; 一直没有数据交互; 进程崩溃; 主机崩溃; 我们先来认识认识什么是 TCP keepalive 呢? 这东西其实就是 TCP 的保活机制,它的工作原理我之前的文章写过,这里就直接贴下以前的内容。 如果两端的 TCP 连接一直没有数据交互,达到了触发 TCP 保活机制的条件,那么内核里的 TCP 协议栈就会发送探测报文。 如果对端程序是正常工作的。当 TCP 保活的探测报文发送给对端, 对端会正常响应,这样 TCP 保活时间会被重置,等待下一个 TCP 保活时间的到来。 如果对端主机崩溃,或对端由于其他原因导致报文不可达。当 TCP 保活的探测报文发送给对端后,石沉大海,没有响应,连续几次,达到保活探测次数后,TCP 会报告该 TCP 连接已经死亡。 所以,TCP 保活机制可以在双方没有数据交互的情况,通过探测报文,来确定对方的 TCP 连接是否存活。 注意,应用程序若想使用 TCP 保活机制需要通过 socket 接口设置 SO_KEEPALIVE 选项才能够生效,如果没有设置,那么就无法使用 TCP 保活机制。 知道了 TCP keepalive 作用,我们再回过头看题目中的「主机崩溃」这种情况。 在没有开启 TCP keepalive,且双方一直没有数据交互的情况下,如果客户端的「主机崩溃」了,会发生什么。 客户端主机崩溃了,服务端是无法感知到的,在加上服务端没有开启 TCP keepalive,又没有数据交互的情况下,服务端的 TCP 连接将会一直处于 ESTABLISHED 连接状态,直到服务端重启进程。 所以,我们可以得知一个点,在没有使用 TCP 保活机制且双方不传输数据的情况下,一方的 TCP 连接处在 ESTABLISHED 状态,并不代表另一方的连接还一定正常。 那题目中的「进程崩溃」的情况呢? 我自己做了实验,使用 kill -9 来模拟进程崩溃的情况,发现在 kill 掉进程后,服务端会发送 FIN 报文,与客户端进行四次挥手。 所以,即使没有开启 TCP keepalive,且双方也没有数据交互的情况下,如果其中一方的进程发生了崩溃,这个过程操作系统是可以感知的到的,于是就会发送 FIN 报文给对方,然后与对方进行 TCP 四次挥手。 以上就是对这个面试题的回答,接下来我们看看在「有数据传输」的场景下的一些异常情况: 第一种,客户端主机宕机,又迅速重启,会发生什么? 第二种,客户端主机宕机,一直没有重启,会发生什么? #客户端主机宕机,又迅速重启 在客户端主机宕机后,服务端向客户端发送的报文会得不到任何的响应,在一定时长后,服务端就会触发超时重传机制,重传未得到响应的报文。 服务端重传报文的过程中,客户端主机重启完成后,客户端的内核就会接收重传的报文,然后根据报文的信息传递给对应的进程: 如果客户端主机上没有进程监听该 TCP 报文的目标端口号,那么客户端内核就会**回复 RST 报文,重置该 TCP 连接*; 如果客户端主机上有进程监听该 TCP 报文的目标端口号,由于客户端主机重启后,之前的 TCP 连接的数据结构已经丢失了,客户端内核里协议栈会发现找不到该 TCP 连接的 socket 结构体,于是就会回复 RST 报文,重置该 TCP 连接。 所以,只要有一方重启完成后,收到之前 TCP 连接的报文,都会回复 RST 报文,以断开连接。 #客户端主机宕机,一直没有重启 这种情况,服务端超时重传报文的次数达到一定阈值后,内核就会判定出该 TCP 有问题,然后通过 Socket 接口告诉应用程序该 TCP 连接出问题了,一般就是 ETIMEOUT 状态码。 那具体重传几次呢? 在 Linux 系统中,提供一个叫 tcp_retries2 配置项,默认值是 15,如下图: 这个内核参数是控制,在 TCP 连接建立的情况下,超时重传的最大次数。 不过 tcp_retries2 设置了 15 次,并不代表 TCP 超时重传了 15 次才会通知应用程序终止该 TCP 连接,内核还会基于「最大超时时间」来判定。 每一轮的超时时间都是倍数增长的,比如第一次触发超时重传是在 2s 后,第二次则是在 4s 后,第三次则是 8s 后,以此类推。 内核会根据 tcp_retries2 设置的值,计算出一个最大超时时间。 在重传报文且一直没有收到对方响应的情况时,先达到「最大重传次数」或者「最大超时时间」这两个的其中一个条件后,就会停止重传。 最后说句,TCP 牛逼,啥异常都考虑到了。
点赞 4
评论 2
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
08-07 11:48
上海大学 产品经理
阳光电源有人去线下面了吗
如题,阳光电源有人去线下了吗?
点赞
评论
收藏
分享
08-10 12:23
字节跳动_研发(实习员工)
重生之我在牛客写简历。
之前有很多牛友私信我说能不能看看简历,因为一直比较忙,没时间去脱敏,这阵子闲下来了,所以脱敏了然后把简历发出来让大家一起指点指点,有任何问题欢迎大家comment~。我觉得写简历分为两个大时期:有实习和没实习的时候。然后在有实习的时候可能又可以分为有一段实习和多段实习之后。我这里就简单讲讲我在没实习的时候和有一段实习的时候所写简历时候的一些小技巧:一、无实习阶段:用项目展现潜力在没有实习经历时,优质的项目经历是简历的核心竞争力。我的建议是至少准备两个项目:一个贴近真实业务场景的落地项目,搭配一个体现技术深度的工具类项目(即常说的 “轮子项目”)。关于项目选题的具体方法,之前我在https:/...
苍蓝星上艾露:
说实话这份简历上限还可以更高。 存在的问题、进行的优化、初步挖掘出来的亮点。 使用的工具:https://github.com/weicanie/prisma-ai
查看图片
投递牛客等公司10个岗位
点赞
评论
收藏
分享
07-20 12:27
门头沟学院 Java
二本学院能就业吗
吸取了大家的建议 把简历布局重新调整了一下,名字哪些隐藏了,会漏马甲的项目名字论文也先去掉了,大家看看还有没有需要补充的,我在想要不要包一个大厂的实习
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
25年秋招精心整理的最新互联网大厂笔面试题集合
2.4W
2
...
字节秋招-后端开发-一面
1.0W
3
...
26届秋招建议
9142
4
...
暑期实习转正自评,你就这么写!
8985
5
...
26秋招-拓竹嵌入式软件面经
5693
6
...
本华为OD终于翻身!(百度后端面经)
4863
7
...
总结常用的拖offer的几种话术
4617
8
...
字节秋招意向
4259
9
...
影石嵌入式驱动开发面经
3464
10
...
字节二面-半技术半聊天?
2406
创作者周榜
更多
正在热议
更多
#
我的秋招“寄”录
#
19793次浏览
220人参与
#
你最近一次加班是什么时候?
#
73977次浏览
388人参与
#
去哪儿旅行秋招
#
224495次浏览
3176人参与
#
实习的内耗时刻
#
21236次浏览
295人参与
#
我的AI电子员工
#
10473次浏览
74人参与
#
独居后,你的生活是更好了还是更差了?
#
7361次浏览
110人参与
#
腾讯大前端岗位热招中
#
15578次浏览
175人参与
#
牛友打假中心
#
96426次浏览
2679人参与
#
大城市找工作会更容易吗
#
43981次浏览
351人参与
#
学历贬值真的很严重吗?
#
31853次浏览
208人参与
#
规定下班时间vs实际下班时间
#
12684次浏览
110人参与
#
你上一次给父母打电话是什么时候
#
8100次浏览
85人参与
#
每个月的工资都是怎么分配的?
#
59915次浏览
597人参与
#
工作上你捅过哪些篓子?
#
10075次浏览
74人参与
#
秋招盘点:机械人值得去的企业
#
79273次浏览
680人参与
#
秋招签约后的心态变化
#
87525次浏览
836人参与
#
你觉得找工作该拿大厂还是小厂练手
#
199975次浏览
1757人参与
#
被AI治愈的瞬间
#
64154次浏览
634人参与
#
奇葩时刻大赏
#
57408次浏览
237人参与
#
面试被问期望薪资时该如何回答
#
268663次浏览
1547人参与
#
生化医药面经大本营
#
122060次浏览
483人参与
#
秋招想进国企该如何准备
#
81666次浏览
444人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务