当前位置:网站首页>简单理解TCP的三次握手和四次挥手
简单理解TCP的三次握手和四次挥手
2022-07-13 17:37:00 【Genting丶incubus】
本文用简洁的语言教你理解TCP的三次握手和四次挥手,匆忙写的,审美可能有待提升。
本文适合入门,基础不高的同学观看,以便有一个大概的了解。深入的同学还请高抬贵手。
还有请记住,是传输层中TCP的东西,不是应用层的HTTP,前者是提供传输的服务,后者是通信和交互规则。之前查其他博客时候,看过有很多错误的,甚至自己也手寡写错。
目录
PS:
客户端,服务端,
浅绿色背景的是你可以不用深入理解记忆的。
浅黄色背景是为了更好理解这些符号的作用而自创的名词,并不存在。
加粗是需要记住的,
相关的数值可以记住是什么意思,你记不住编一个也行,但要知道是对应的,改编不是乱编
橙色是区别报文的作用而命名的
紫色是客户端/服务端进入的状态,是要牢记的
三个状态位
SYN是同步位,ACK是确认位,FIN是释放位
默认为0未激活,1为激活
SYN,ACK配套的值分别为seq,ack,代表某个序号值
序号是什么?
序号起始值x(用来标记每一次传输数据的起始值),在后期能确认数据是否存在丢失。起始序号+数据长度+1应等于下一次起始序号。
为什么确认时候ack要+1?
通过x+1来确认已经收到了对面发送的序号起始值,并期待下一次收到的数据起始序号是x+1。
三次握手

首先服务端创建TCB模块(用来存储连接的信息,tcp连接表等等),并一直处于监听状态,等待客户端发送连接请求
1.客户端创建TCB模块。
创建同步字段,同步位SYN设为1,设置一个客户端初始序号seq设为x(数值不确定)
发送连接请求报文
进入同步已发送状态
补充:序号是tcp报文首部里的一个字段,用来标志数据的起始位置
2.服务端收到报文后,如果同意建立连接,
创建确认字段,将确认位大写ACK设为1,小写ack设为x+1,(+1表示的意思请看最上的总结)
创建同步字段,将同步位SYN设为1,服务端初始序号seq设为y(数值不确定)
发送确认报文,表示收到了客户端的连接请求报文。
进入同步收到状态
3.客户端收到报文后。
创建确认字段,将确认位大写ACK设为1,小写ack设为y+1,
加上自己的序号seq为x+1
发送确认报文,表示收到了服务端的确认报文。
进入已建立联系状态
服务端收到报文后,进入已建立联系状态
四次挥手

1.客户端
创建释放字段,将释放位FIN设为1,seq设为u(等于客户端发送的数据最后一个字节的序号+1),
发送连接释放报文。表示没有数据传送给服务端了,请求释放连接。
进入终止等待1状态
2.服务端收到报文后。
创建确认字段,将确认位大写ACK设为1,小写ack设为u+1,seq为v(数值不确定)
发送确认报文
服务端进入关闭等待状态,
客户端收到报文后,进入终止等待2状态,此时TCP进入半关闭状态,客户端不再有数据发送(如报文丢失后可能会超时重传)。
3.服务端在接下来的过程中,可能还有数据要发送给客户端,等没有数据要发了。
创建释放字段,将释放位FIN设为1,seq设为w(等于服务端发送的数据最后一个字节的序号+1),
创建确认字段,将确认位大写ACK设为1,小写ack设为u+1,
发送释放报文,重复发送是为了表示没有数据需要发送,准备释放连接。
进入最后确认状态
4.客户端收到报文后,
创建确认字段,将确认位大写ACK设为1,小写ack设为w+1,
并向服务端发送确认报文,表示收到了服务端的释放报文
客户端进入时间等待状态,设定时间等待计时器
计时器(2MSL)时间到了,客户端不再收到服务端的释放报文,客户端才进入释放连接状态
服务端收到报文后,进入释放连接状态
到此,便是大概的流程。实际流程比较复杂,比如报文可能延迟到达,报文丢失需要使用超时重传等等。但这都不是初学者重要关注的点。
常见问题&面试题目
1.为什么要第三次握手(为什么不是两次握手)?
答:为了防止已失效的连接请求报文突然又传到了服务端,从而产生问题。
只有两次握手,则可能出现情况,客户端报文延迟到达后,重发连接请求报文,两个报文无论哪个先到达服务端,如果报文到达时间已经是第一次连接已经释放完了,服务端便会以为客户端再次请求连接,向客户端发送确认报文,但客户端已经完成,不再理会服务端的确认报文,导致服务端一直处于同步收到状态,白白浪费资源。
而使用三次握手,在刚才异常情况下,客户端不会向服务端发出确认报文,服务端收不到确认,便知道客户端并没有请求连接。
2.为什么不是四次握手?(指为什么不需要服务端再发送一个确认请求,确认客户端的确认)
答:此时已经满足最低需求,保证了客户端和服务端都确认了对方已经收到连接建立的请求。再多握手没有意义,只会浪费资源。
3.一二三次握手目的是什么?
答:第一次握手是为了确认客户端的发送能力
第二次握手时为了确认服务端的接受能力和发送能力
第三次握手时为了确认客户端的接受能力
4.为什么握手时是三次,挥手是四次?
答:因为挥手时,第二次和第三次握手期间,服务端可能还有数据需要传给客户端,所以需要第三次握手来确认没有数据需要传给客户端了,准备断开服务端对客户端连接。
5.为什么最后一次挥手客户端需要等待2MSL(什么是时间等待计时器)才断开连接?常问
答:是为了确认报文(第四次挥手)丢失时实现超时重传,为了确保服务端能收到确认报文,创建计时器,如果计时器时间到了。如果服务端没收到确认报文,会再次发送释放报文(第三次挥手),客户端收到后计时器重置,再次发送确认报文。
注:MSL是生存时间
6.还有一个计时器是什么(保活计时器),作用是什么?
答:在建立TCP连接后,为了防止客户端因故障,不能再发送数据给服务端,导致服务端白白等待,浪费资源。使用保活计时器,每收到一次来自客户端的数据,就重置计时器。如果计时结束,仍没有数据,则服务端主动发送探测报文,每隔75秒发送一次,第十次发送后扔未响应,则断开连接。
边栏推荐
- 36.js--原型链2--(笔试题为主)
- Le 13ème concours provincial de Blue Bridge Cup MCU
- Solve the problem that the pictures uploaded by the SSM project cannot be echoed in time
- Teacher Wan Jianfeng dry goods sharing July 13, 2022
- 万建峰老师 干货分享2022年7月13日
- sql_server2014下载与安装
- 为什么要写博客?
- 性能测试分类
- [tensorflow2] attributeerror: 'tensor' object has no attribute 'numpy' solution (tf.py_function)
- JS预编译
猜你喜欢

21天SQL打卡总结

Oracle数据库 错误代码解决办法

fastadmin的二次开发教程【简单搭建、多表格问题,API开发】

ES6--arr(数组)-map-set的转换

Solve the problem of unable to load authentication plugin 'caching' when idea2020 connects to MySQL 8_ sha2_ Password 'exception

【黄啊码】今天居然有人问我:where 1=1 是什么意思?

ES6--对象

ES6--解构赋值(重点)

39.js--作用域

Idea automatically exports SQL statements of tables in the database
随机推荐
What if the system always fails? Maybe you should learn about stability construction
命令行客户端的使用
JS字符串内置功能
微信红包项目测试小结
油猴脚本更改tw樣式
ES6新增的箭头函数
Blue Bridge Cup: the second game of the 13th provincial competition of single chip microcomputer group
【黄啊码】MySQL入门—2、使用数据定义语言(DDL)操作数据库
基于 conda 的在 Win10 上从零开始搞一个 Tensorflow-gpu (2.6.0) 环境的操作记录 (2022.07)
ES6--arr(数组)-map-set的转换
【黄啊码】微软IE浏览器将退役 网友说:以后考试报名咋办?
<statement> or DELIMITER expected, got ‘id‘
Idea automatically exports SQL statements of tables in the database
oracle 学习
keil报错: ERROR 118 (ERRONEOUS REFERENCE TO EXTERNAL VARIABLES) 解决方案及原因
几种经典功率谱密度估计方法的记录(从滤波的视角出发)
A grayscale interface migration scheme
Dark blue themed boss, can you add a typewriter function so that you can choose when typing
(CVPR-2022)用于改进步态识别的拉格朗日运动分析和视角嵌入
ES6--面试题