TCP/IP三次握手、四次挥手流程

1、三次握手,建立连接

在这里插入图片描述

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手,建立一个连接。

  • 第一次握手: 建立连接时,客户端 发送 SYN包 到 服务器,并且,客户端 进入 SYN_SEND 状态,等待 服务器 确认;
  • 第二次握手: 服务器 收到 SYN包 后,同时,发送一个 SYN+ACK包 给 客户端 ,此时,服务器进入SYN_RECV 状态;
  • 第三次握手: 客户端 收到服务器的 SYN+ACK包 后,向 服务器 发送确认的 ACK包 。此包发送完毕,客户端服务器 进入ESTABLISHED 状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据。

2、四次挥手,断开连接

在这里插入图片描述

  • 第1次挥手:主动关闭方被动关闭方 发送一个 FIN包 。也就是主动关闭方 告诉 被动关闭方 :我已经不会再给你发数据了。

  • 第2次挥手:被动关闭方 收到 FIN包 后,发送一个 ACK包 给 主动关闭方 。 就告诉 主动关闭方 已收到通知 。

(在 被动关闭方 发送 FIN包 之前,被动关闭方 还是可以向 主动关闭方 发送数据的。)

  • 第3次挥手:被动关闭方 又发送一个 FIN包,给 主动关闭方,用来关闭 被动关闭方主动关闭方 的数据传送。
    也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。

  • 第4次挥手:主动关闭方 收到 FIN包后,发送一个 ACK包 给 被动关闭方 ,至此,完成四次挥手。

说明: 第2次和第3次, 被动关闭方 连续两次向 主动关闭方 发送报文。

3、主要字段

1)标志位(Flags):共6个,即URG、ACK、PSH、RST、SYN、FIN等。具体含义如下:

标志位含义说明
SYN发起建立连接当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该有 SYN=1,ACK=1。
ACK确认标识当ACK=1,确认标识才有效。
(为了与 确认号ack 区分开,我们一定要用大写字母)
FIN释放连接当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放。
PSH读取数据当PSH=1,提示接收端应用程序立即从TCP缓存区把数据读走。
RST重置连接当RST=1,表时TCP连接出现严重差错,必须释放连接,在后再重新连接。
URG紧急指针当URG=1,表明紧急指针字段有效,告诉系统此报文段中有紧急数据。

2)序号(sequence number):seq序号,占32位。用来标识从TCP源端向目的端发送的字节流,发起方 发送数据时 对此进行标记。

3)确认号(acknowledgement number):ack序号,占32位。只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。

说明:

SYN 是标志位,表示发起建立一个连接。

seq 即 seq序号,表示 发起方 发送 数据 进行标记。

ACK 是 标志位中的 确认标识。

ack 是 确认序号,接收到的对方的数据,ack=seq+1。

4、三次握手的报文变化

请添加图片描述

名称数据发送方向SYN
(建立连接)
seq
(自己的数据)
ACK
(收到了请求)
ack
(接收到的对方的数据)
第1次握手客户端—> 服务端1x--
第2次握手服务端—> 客户端1y1x+1
第3次握手客户端—> 服务端-x+11y+1

通俗理解图,如下。
请添加图片描述

5、四次挥手的报文变化

请添加图片描述

名称数据发送方向FIN
(断开连接)
seq
(自己的数据)
ACK
(收到了请求)
ack
(接收到的对方的数据)
ack=seq+1
第1次挥手主动方 —> 被动方1u--
第2次挥手被动方 —> 主动方v1u+1
被动方 —> 主动方
存在数据传输
第3次挥手被动方 —> 主动方1w1u+1
第4次挥手主动方 —> 被动方u+11w+1

6、面试题

6.1、为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

建立连接时,ACK和SYN可以放在一个报文里来发送。

而关闭连接时,被动关闭方可能还需要发送一些数据后,再发送 FIN报文 表示同意现在可以关闭连接了,

所以它这里的 ACK报文 和 FIN报文 多数情况下都是分开发送的。

6.2、为什么必须是三次握手,不能用两次握手进行连接?

记住服务器的资源宝贵不能浪费 !

TCP 建立连接时,通过 三次握手 能防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号。序列号能够保证数据包不重复、不丢弃和按序传输。

不使用「两次握手」和「四次握手」的原因:

「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;
「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。

————————————————
详细参考: 为什么要三次握手,两次不行吗?为什么?

6.3、三次握手、四次挥手的目的

三次握手 是为了保证双方都准备好了资源。

四次挥手 是为了保证双方把资源都释放掉了。

6.4、为什么四次挥手,不能把第二次挥手 和 第三次挥手合并在一起变成三次挥手?

第二次挥手的目的是 被动关闭方 告诉 主动关闭方 ,我被动关闭方 已经收到你的发送包。
第三次挥手的目标是 被动关闭方 通知 主动关闭方,我被动关闭方 的数据也发送完了,不会再给你发数据了 。

因为,第二次的挥手 是 对第一次挥手响应,第三次是 被动关闭方 通知 主动关闭方 ,我已经没有消息发送了,
但是在第二次挥手和第三次挥手中间,被动关闭方 还是可以向 主动关闭方 发送数据的,所以第二次和第三次无法合并。

6.5、第三次挥手什么时候发?

被动关闭方 调用了close之后才能发。

6.6、在服务器收到第4次挥手的数据包之前,服务器会释放资源吗?

不会,即便服务器调用了close(),仍然会保留资源,保留到客户端发来第4次挥手的数据包到了为止。 什么时候收到,什么时候才释放资源。

6.7、为什么客户端先调close(),而服务器不能先调?

1、因为先调close()的一方最终要等2分钟之后才能释放资源,这段期间是不允许用bind的方式重新绑定端口的,就会出现端口被占用的情况。

2、而客户端的端口是操作系统随机分配的,被占用之后会再分配一个 ,

3、若服务端先调,则需要设定套接字选项,配置重复利用端口资源才可以。

6.8、四次挥手,为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

两个存在的理由:

1、无法保证最后发送的ACK报文会一定被对方收到,所以需要重发可能丢失的ACK报文。

2、关闭链接一段时间后可能会在相同的IP地址和端口建立新的连接,为了防止旧连接的重复分组在新连接已经终止后再现。2MSL足以让分组最多存活msl秒 被丢弃。

  • 11
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值