简单理解TCP的三次握手和四次挥手

本文用简洁的语言教你理解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设为1seq设为u(等于客户端发送的数据最后一个字节的序号+1),

发送连接释放报文表示没有数据传送给服务端了,请求释放连接。

进入终止等待1状态


2.服务端收到报文后。

创建确认字段,将确认位大写ACK设为1,小写ack设为u+1seq为v(数值不确定)

发送确认报文

服务端进入关闭等待状态,

客户端收到报文后,进入终止等待2状态,此时TCP进入半关闭状态,客户端不再有数据发送(如报文丢失后可能会超时重传)。


3.服务端在接下来的过程中,可能还有数据要发送给客户端,等没有数据要发了。

创建释放字段,将释放位FIN设为1seq设为w(等于服务端发送的数据最后一个字节的序号+1),

创建确认字段,将确认位大写ACK设为1,小写ack设为u+1

发送释放报文,重复发送是为了表示没有数据需要发送,准备释放连接。

进入最后确认状态


4.客户端收到报文后,

创建确认字段,将确认位大写ACK设为1,小写ack设为w+1

并向服务端发送确认报文表示收到了服务端的释放报文

客户端进入时间等待状态,设定时间等待计时器

计时器(2MSL)时间到了,客户端不再收到服务端的释放报文,客户端才进入释放连接状态


服务端收到报文后,进入释放连接状态

到此,便是大概的流程。实际流程比较复杂,比如报文可能延迟到达,报文丢失需要使用超时重传等等。但这都不是初学者重要关注的点。

常见问题&面试题目

1.为什么要第三次握手(为什么不是两次握手)?

答:为了防止已失效的连接请求报文突然又传到了服务端从而产生问题。

只有两次握手,则可能出现情况客户端报文延迟到达后,重发连接请求报文,两个报文无论哪个先到达服务端,如果报文到达时间已经是第一次连接已经释放完了,服务端便会以为客户端再次请求连接,向客户端发送确认报文,但客户端已经完成,不再理会服务端的确认报文,导致服务端一直处于同步收到状态,白白浪费资源。

而使用三次握手,在刚才异常情况下,客户端不会向服务端发出确认报文,服务端收不到确认,便知道客户端并没有请求连接。

2.为什么不是四次握手?(指为什么不需要服务端再发送一个确认请求,确认客户端的确认

答:此时已经满足最低需求,保证了客户端服务端都确认了对方已经收到连接建立的请求。再多握手没有意义,只会浪费资源。

3.一二三次握手目的是什么?

答:第一次握手是为了确认客户端的发送能力

       第二次握手时为了确认服务端的接受能力和发送能力

       第三次握手时为了确认客户端的接受能力

4.为什么握手时是三次,挥手是四次?

答:因为挥手时,第二次和第三次握手期间,服务端可能还有数据需要传给客户端,所以需要第三次握手来确认没有数据需要传给客户端了,准备断开服务端对客户端连接。

5.为什么最后一次挥手客户端需要等待2MSL(什么是时间等待计时器)才断开连接?常问

答:是为了确认报文(第四次挥手)丢失时实现超时重传,为了确保服务端能收到确认报文,创建计时器,如果计时器时间到了。如果服务端没收到确认报文,会再次发送释放报文(第三次挥手),客户端收到后计时器重置,再次发送确认报文。

注:MSL是生存时间

6.还有一个计时器是什么(保活计时器),作用是什么?

答:在建立TCP连接后,为了防止客户端因故障,不能再发送数据给服务端,导致服务端白白等待,浪费资源。使用保活计时器,每收到一次来自客户端的数据,就重置计时器。如果计时结束,仍没有数据,则服务端主动发送探测报文,每隔75秒发送一次,第十次发送后扔未响应,则断开连接。

猜你喜欢

转载自blog.csdn.net/weixin_43818307/article/details/123390457