【Linux网络】TCP/IP三次握手、四次挥手流程

目录

一、三次握手,建立连接

二、四次挥手,断开连接

三、主要字段

1、标志位(Flags)

[2、序号(sequence number)](#2、序号(sequence number))

[3、确认号(acknowledgement number)](#3、确认号(acknowledgement number))

四、三次握手的报文变化

五、四次挥手的报文变化

六、面试题


一、三次握手,建立连接

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

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

完成三次握手,建立好链接。

二、四次挥手,断开连接

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

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

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

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

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

三、主要字段

1、标志位(Flags)

|---------|--------|-----------------------------------------------------|
| 标志位 | 含义 | 说明 |
| 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。

四、三次握手的报文变化

五、四次挥手的报文变化

六、面试题

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

建立连接时,ACK 和 SYN可以放在一个报文里来发送。而关闭连接时,被 动关闭方可能还需要发送一些数据后,再发送 FIN 报文表示同意现在可以关闭连接了,所以它这里的 ACK报文 和 FIN报文 多数情况下都是分开发送的。

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

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

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

「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;

「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。

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

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

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

4、tcp三次握手的过程, accept发生在三次握手哪个阶段?

client 的 connect 引起3次握手。

server 在socket, bind, listen后,阻塞在accept,三次握⼿手完成后, accept 返回⼀一个fd,因此 accept 发⽣生在三次握⼿手之后。

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

两个存在的理由:

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

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


本文要是有不足的地方,欢迎大家在下面评论,我会在第一时间更正。

相关推荐
fengyehongWorld15 分钟前
TeraTerm ttl脚本登录wsl
linux·teraterm
Olivia051405141 小时前
Voohu:音频变压器的屏蔽接地技术对50Hz工频噪声抑制的影响
网络·机器人·信息与通信
2401_873479401 小时前
企业安全团队如何配合公安协查?IP查询在电子取证中的技术实践
tcp/ip·安全·网络安全·php
乌托邦的逃亡者1 小时前
Linux中如何检测IP冲突
linux·运维·tcp/ip
一曦的后花园1 小时前
linux搭建promethes并对接node-exporter指标
linux·运维·服务器
byoass1 小时前
智巢AI知识库深度解析:企业文档管理从大海捞针到精准狙击的进化之路
开发语言·网络·人工智能·安全·c#·云计算
zhihuishuxia__1 小时前
Multiplex通讯(多路复用通讯)
网络·图像处理·数码相机·计算机视觉·自动化
勤劳的进取家1 小时前
数据链路层基础
网络·学习·算法
ZenosDoron1 小时前
虚拟机软件(如 VirtualBox、VMware)通常提供三种主要的网络模式
网络·智能路由器
乌托邦的逃亡者2 小时前
CentOS/Openeuler主机中,为一个网卡设置多个IP地址
linux·运维·网络·tcp/ip·centos