【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秒 被丢弃。


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

相关推荐
利刃大大5 分钟前
【Linux入门】2w字详解yum、vim、gcc/g++、gdb、makefile以及进度条小程序
linux·c语言·vim·makefile·gdb·gcc
飞行的俊哥6 小时前
Linux 内核学习 3b - 和copilot 讨论pci设备的物理地址在内核空间和用户空间映射到虚拟地址的区别
linux·驱动开发·copilot
幽兰的天空7 小时前
介绍 HTTP 请求如何实现跨域
网络·网络协议·http
lisenustc7 小时前
HTTP post请求工具类
网络·网络协议·http
心平气和️7 小时前
HTTP 配置与应用(不同网段)
网络·网络协议·计算机网络·http
心平气和️7 小时前
HTTP 配置与应用(局域网)
网络·计算机网络·http·智能路由器
hunter2062068 小时前
ubuntu向一个pc主机通过web发送数据,pc端通过工具直接查看收到的数据
linux·前端·ubuntu
不会飞的小龙人8 小时前
Docker Compose创建镜像服务
linux·运维·docker·容器·镜像
不会飞的小龙人8 小时前
Docker基础安装与使用
linux·运维·docker·容器
Mbblovey8 小时前
Picsart美易照片编辑器和视频编辑器
网络·windows·软件构建·需求分析·软件需求