当前位置:网站首页>老生常谈:面试必问“三次握手,四次挥手”这么讲,保证你忘不了
老生常谈:面试必问“三次握手,四次挥手”这么讲,保证你忘不了
2022-08-11 11:18:00 【InfoQ】
三次握手
- 一开始,客户端和服务端都处于 CLOSED 状态。客户端主动打开连接,服务端被动打卡连接,结束CLOSED z状态,开始监听,进入 LISTEN状态。
- 客户端会随机初始化序号(client_isn),将此序号置于 TCP 首部的「序号」字段中,同时把 SYN 标志位置为 1 ,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。
- 服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号(server_isn),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1, 接着把 SYN 和 ACK标志位置为 1。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态。
- 客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,其次「确认应答号」字段填入 server_isn + 1 ,最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于 ESTABLISHED 状态。
- 为了防止服务器端开启一些无用的连接增加服务器开销
- 防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
四次挥手
- 客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进入 FIN_WAIT_1 状态。
- 服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSED_WAIT 状态。
- 客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK状态。
- 客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态
- 服务器收到了 ACK 应答报文后,就进入了 CLOSED 状态,至此服务端已经完成连接的关闭。
- 客户端在经过 2MSL 一段时间后,自动进入 CLOSED 状态,至此客户端也完成连接的关闭。
- 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
- 服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。
- 如果客户端在 2MSL 内,再次收到了来自服务器端的 FIN 报文,说明服务器端由于各种原因没有接收到客户端发出的 ACK 确认报文。
- 否则客户端在 2MSL 内没有再次收到来自服务器端的 FIN 报文,说明服务器端正常接收了 ACK 确认报文,客户端可以进入 CLOSED 阶段,完成“四次挥手”。
大白话说三次握手
- 老王:老张唉!我是老王,你能听到吗?
- 老张一听,是老王的声音:老王老王,我是老张,我能听到,你能听到吗?
- 老王一听,嗯,没错,是老张:老张,我听到了,我有事要跟你说。
大白话说四次挥手
- 女朋友:臭男人,最近你都不理我,你是不是不爱我了?你是不是外面有别的狗子了?我要和你分手?
- 沙雕博主一愣,怒火攻心:分手就分手,不陪你闹了,等我把东西收拾收拾。
- 哼,蠢女人,我已经收拾完了,我先滚为敬,再见!
- 女朋友:滚,滚得远远的,越远越好,我一辈子都不想再见到你。
边栏推荐
- 2. 类与对象——封装
- 黑马瑞吉外卖之分类信息的分页查询
- The ceiling-level microservice boss summed up this 451-page note to tell you that microservices should be learned this way
- AWS、Splunk和Symantec牵头成立OCSF开放网络安全架构框架
- 10Super详解
- darknet 结构体汇总
- LeetCode·每日一题·1417.重新格式化字符串·模拟
- Notes and Recommendations for Using Logs
- 1. 类与对象——什么是对象
- 天花板级微服务大佬总结出这份451页笔记告诉你微服务就该这么学
猜你喜欢
开源汇智创未来 | 软通动力出席开放原子全球开源峰会OpenAtom openEuler分论坛
1. 类与对象——什么是对象
PerfView专题 (第一篇):如何寻找热点函数
宝塔计划任务执行周期设置【秒】为定时单位【或者更小】
TX12 + ExpressLRS 915MHz RC控制链路配置及问题汇总
I got the P8 "top" distributed architecture manual that went viral on Ali's intranet
齐话存储未来,诠释分布式缘起
StratoVirt 中的虚拟网卡是如何实现的?
爆赞!阿里P8首次分享出基于Docker的企业级Redis实战开源笔记
Go-Excelize API源码阅读(七)—— CopySheet(from, to int)
随机推荐
leetcode:360. 有序转化数组
六、一起学习Lua 循环
Neuropathic pain classification picture Daquan, neuropathic pain classification
参与openEuler社区不到1年,我成为了Maintainer……
openEuler小程序会议指南
Use Function Compute to package and download OSS files [Encounter Pit Collection]
Getting Started with Chrome Plug-in Development - Nanny Level Raiders
【毕业设计】远程智能浇花灌溉系统 - stm32 单片机 嵌入式 物联网
巧用自定义函数,文本控件秒变高速缓存
Cholesterol-PEG-FITC, Fluorescein-PEG-CLS, Cholesterol-PEG-Fluorescein water-soluble
PerfView project (first) : how to find hot spots function
开源汇智创未来 | 软通动力出席开放原子全球开源峰会OpenAtom openEuler分论坛
悠漓带你玩转C语言(详解操作符1)
LeetCode · Question of the Day · 1417. Reformatting String · Simulation
chrome is set to dark mode (including the entire webpage)
How long does it take to train a neural network, neural network training takes too long
小目标绝技 | 用最简单的方式完成Yolov5的小目标检测升级!
servlet——servlet介绍 | 发布动态资源
Latex引用图片 发现 显示的图片标号不对
深度解析佛萨奇,Forsage魔豹联盟系统开发方案(源码部署)