【Linux C | 网络编程】详细介绍 “三次握手(建立连接)、四次挥手(终止连接)、TCP状态”

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍“三次握手(建立连接)、四次挥手(终止连接)、TCP状态” 🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、三次握手(建立连接)
    • ✨2.1 三次握手的过程
    • ✨2.2 为什么需要三次握手
  • 🎄三、四次挥手(终止连接)
    • ✨2.1 四次挥手的过程
    • ✨2.2 为什么需要四次挥手
  • 🎄四、TCP状态
  • 🎄五、总结


在这里插入图片描述

🎄一、概述

一个TCP连接通常分为3个阶:建立连接、数据传输(也称作“连接已建立”)、终止连接。其中建立连接、终止连接就涉及到经常听到的三次握手,四次挥手。并且,三次握手,四次挥手 常常出现在面试中,大部分应试者一上来就是知道回复:

首先,客户端向服务端发送一个"SYN"分节;
然后,服务端向客户端发送一个"SYN+ACK"分节
最后,客户端向服务端发送一个ACK分节表示确认

这样回答是生硬的、欠缺的、不够深度的。

那请问:
1、三次握手的目的是什么?
2、为什么需要三次握手?
3、两次握手行不行?
4、SYN报文可以携带数据吗?
5、三次握手过程中,每次发送报文后,TCP处于什么状态?
6、四次挥手的过程是怎样的?
7、为什么握手是三次,挥手却要四次?
8、什么是半关闭状态?

如果上面几个问题都懂了,那不必往下看了。


在这里插入图片描述

🎄二、三次握手(建立连接)

TCP协议一个面向连接的协议,那么这个连接是怎么建立的呢?

TCP的连接就是通过所谓的三次握手来建立的,在网络编程中,TCP连接的建立是发生在客户端的connect函数和服务端的accept函数中的。所以,我们常常可以看到使用套接字API写TCP客户端时,都是依次调用socket、connect,而服务器常见的是依次调用socket、bind、listen、accept

✨2.1 三次握手的过程

建立一个TCP连接会进行下面步骤:

  • 1、TCP客户端调用socket函数获取到套接字句柄之后,调用connect函数发起主动打开(active open),这将导致客户端TCP发送一个SYN报文段(一个TCP头部的SYN位字段置位的TCP/IP数据包),并指明自己想要连接的端口号和它的客户端初始序列号(Initial Sequence Number, ISN)。通常,客户端还会借此发送一个或多个选项。
  • 2、TCP服务端在调用依次socket、bind、listen之后,执行被动打开(passive open),然后调用accept阻塞等待接受外来的连接。服务端接收到客户端的SYN报文后,也发送自已的SYN报文段作为响应,并包含了它的初始序列号;此外,为了确认客户端的SYN,服务端将客户端的初始序列号(Initial Sequence Number, ISN)数值加1后作为返回的ACK数值。
  • 3、客户端为了确认服务器的SYN,将服务端的初始序列号(Initial Sequence Number, ISN)数值加1后作为返回的ACK数值。

经过上面三个步骤,TCP连接就建立成功了,之后可以通过read、write等函数交互数据了。


✨2.2 为什么需要三次握手

三次握手的目的不仅在于让通信双方了解一个连接正在建立,还在于利用数据包的选项来承载特殊的信息,交换初始序列号(Initial Sequence Number, ISN)。

另外,必须是三次握手后,才可以让客户端、服务端都确认对方的发送、接收能力是否正常:

  • 第一次握手(cli -> ser):
    客户端检测服务端的接收能力。
    服务端收到客户端的SYN后,确认了客户端具有发送能力。
  • 第二次握手(ser -> cli):
    客户端收到服务端的SYN+ACK,确认了服务端具有发送能力,同时说明服务端已经收到自己的SYN(具有接收能力);
    服务端检测客户端的接收能力。
  • 第三次握手(ser -> cli):
    服务端收到客户端的ACK,说明客户端已经收到自己的SYN(具有接收能力)。

如果只有两次握手行不行呢?
只有两次握手的话,服务端消息发出去后,没受到响应,无法确认客户端是否可以接收信息。所以需要三次握手才可以建立连接。


注意:TCP的SYN段也能够承载应用数据。由于伯克利的套接字API不支持这种方式,因此它也很少为人所用

在这里插入图片描述

🎄三、四次挥手(终止连接)

TCP连接建立后,客户端、服务端会交互数据,最后连接的任一方可以发起终止,一般是客户端发起终止,但有些服务端处理完客户端的请求后也会发起关闭操作。

✨2.1 四次挥手的过程

  • 1、TCP连接的任一端首先调用closeshutdown函数,执行主动关闭,这会向TCP连接对端发送一个FIN报文段,并指明当前的序列号,该FIN段还包含了一个ACK段用于确认对方最近一次发来的数据。
  • 2、接收到FIN报文段的一端执行被动关闭,将发过来的序列号加1作为响应的ACK数值。上层的应用程序会接收到一个文件结束符(end-of-file)表示该连接不会再发送数据过来,read函数会返回0;
  • 3、一段时间后,接收到这个文件结束符的应用程序也会调用closeshutdown函数关闭它的套接字,这会导致它的TCP也发送一个FIN报文段
  • 4、接收到这个最后FIN报文段的一端会将接收到的序列号加1作为响应的ACK数值。

✨2.2 为什么需要四次挥手

为什么连接的时候是三次握手,终止的时候却是四次握手?

  • 三次握手:因为服务端接收到SYN报文后,可以将确认的ACK数组添加到自己的SYN报文中一并发出。
  • 四次挥手:因为TCP存在半关闭状态,就是允许连接的一端在结束它的发送后还能接收来自另一端数据。一般情况下,收到FIN报文后,并不会立刻关闭socket,而是先回复一个ACK报文,因为此时可能还有一些数据正在发送,等所有数据发送后,才会发送FIN报文,所以需要四次握手。但这并不是必然的,在《Unix网络编程卷1》有提到,第2、3步骤都出自执行被动关闭的那一端,可能被合成一个报文。

在这里插入图片描述

🎄四、TCP状态

TCP状态共11种:

  • 1、 客户端独有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 (4)CLOSING (5)TIME_WAIT 。
  • 2、服务端独有的:(1)LISTEN (2)SYN_RCVD (3)CLOSE_WAIT (4)LAST_ACK 。
  • 3、共有的:(1)CLOSED (2)ESTABLISHED 。
LISTEN       - 监听来自客户端的连接请求; 
SYN_SENT     - 在发送连接请求后等待响应的状态; 
SYN_RCVD 	 - 在收到和发送一个连接请求后等待对端确认的状态; 
ESTABLISHED  - 代表一个已建立的连接,数据开始交互; 
FIN_WAIT1    - 主动关闭,发送完FIN,等待对端确认;
FIN_WAIT2    - 主动关闭,发送完FIN且已收到对端确认,等待接收FIN; 
CLOSE_WAIT   - 被动关闭,接收完FIN且已确认,等待发送FIN; 
CLOSING      - 发送完FIN后,还没收到ACK,就收到FIN并确认,说明对端也正在关闭,等待对端确认; 
LAST_ACK     - 被动关闭,发送完FIN,等待对端确认;
TIME-WAIT    - 等待2MSL,以确保对端TCP接收到连接终止的确认; 
CLOSED       - 没有任何连接状态;

在这里插入图片描述

在这里插入图片描述

🎄五、总结

👉本文详细介绍了三次握手(建立连接)的过程、目的,以及四次挥手的过程、目的,最后讲解了TCP连接的11种状态。

如果真的面试遇到了三次握手、四次挥手的问题,建议这么做,
1、先把过程图画出来;
2、把三次握手、四次挥手的过程展开说一下,然后看情况,可以直接结束了,也可以再说说为什么需要三次握手、四次挥手;
3、最后,把最前面的几个问题都准备好,以防提问到。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

参考资料:
《Unix 网络编程卷1》
《TCP/IP 详解卷1》
《我终于搞懂了TCP的三次握手和四次挥手》https://blog.csdn.net/weixin_45393094/article/details/104965561
《面试官,不要再问我三次握手和四次挥手》https://blog.csdn.net/hyg0811/article/details/102366854

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/354598.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

强化合作!浪潮信息携手业界伙伴筑牢算力底座

以太平金融科技服务(上海)有限公司(以下简称“太平金科”)为例,在算力新型基础设施建设方面,该公司一直不遗余力。近日,该公司更携手全球领先的IT基础设施供应商浪潮信息,优化算力基…

静态代理IP该如何助力Facebook多账号注册运营?

在Facebook运营中,充分利用静态代理IP是多账号运营的关键一环。通过合理运用静态代理IP,不仅可以提高账号安全性,还能有效应对Facebook的算法和限制。以下是这些关键点,可以帮助你了解如何运用静态代理IP进行Facebook多账号运营&a…

如何通俗解释Docker是什么?

要想弄懂Docker,咱们得先从“容器化”讲起。 一、容器化技术及Docker的出现 容器化,它是一种轻量级、可移植的软件打包方式,你就想象成一个快递箱子,里面装着你的应用和所有需要运行的环境,这个箱子能在任何支持容器…

PDF标准详解(一)——PDF文档结构

已经很久没有写博客记录自己学到的一些东西了。但是在过去一年的时间中自己确实又学到了一些东西。一直攒着没有系统化成一篇篇的文章,所以今年的博客打算也是以去年学到的一系列内容为主。通过之前Vim系列教程的启发,我发现还是写一些系列文章对自己的帮…

go学习之air库的使用

首先下载air库 go install github.com/cosmtrek/air之后你需要去找到库下载的地方,若使用的是go mod可以使用命令 go env GOPATH找到下载库的位置 进入后,有bin,pkg目录,进入bin目录,你能看到air.exe文件 这时候将此…

NSSCTF Round#17 RE snake WP

控制流劫持可以非常快,当时困在中间的循环里了,其实一直跳到最后就行…… 运行一下发现是个贪吃蛇 联系到朝雾老师教的打飞机hit-plane那一题,应该通过控制流劫持直接跳转到打印flag的地方 第一个cmp分支处,判断轮数&#xff0c…

dataGrip连接数据库mysql和intersystems的iris

文章目录 前言创建新项目选择对应的数据库产品类型新建数据库资源连接sql命令窗体手动配置本地驱动 前言 intersystems公司的产品iris是cache的升级版本,目前绝大多数数据库工具都没法连接这个数据库 datagrip下载地址 https://download-cdn.jetbrains.com.cn/da…

vue3前端开发,如何引入element-plus前端框架及配置参数

vue3前端开发,如何引入element-plus前端框架及配置参数!这是一个简单的教程,帮助大家快速在自己的项目中引入element-plus框架。 主要是介绍的引入流程和参数的配置情况。 如图,这个就是elment-plus前端框架里面的一个主按钮展示。表示我们配…

Tonka Finance 测试网活动,开启新铭文时代财富之门

Tonka Finance 是铭文赛道首个借贷市场,通过搭建一套铭文资产借贷质押方案,为铭文资产以借贷的形式释放价值、捕获流动性等方面提供了基础。作为铭文赛道最重要的基建设施之一,Tonka Finance 在面向市场后备受关注,并迅速作为铭文…

206. 反转链表(力扣LeetCode)

文章目录 206. 反转链表题目描述双指针递归 206. 反转链表 题目描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2: 输入&am…

GUN/Linux时间同步服务之chrony配置管理

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任,图解仅供参考,请悉知!相关配置操作是在一个全新的演示环境下进行的,演示环境中没有任何有价值的数据,但这并不代表摆在你面前的环境也是如此。生产环境…

嵌入式——直接存储器存取(DMA)补充

目录 一、认识 DMA 二、DMA结构 1. DMA请求 2. 通道DMA 补:通道配置过程。 3. 仲裁器 三、DMA数据配置 1. 从哪里来,到哪里去 (1)从外设到存储器 (2)从存储器到外设 (3)从…

【Python基础017】Python中如何进行异常判断(try...except...的使用)

1、异常判断 在python程序在运行的过程中可能会出现很多错误,比如语法、未定义变量、分母为0等错误;而我们通常使用try...except...语句来处理程序在运行中出现的这些异常,并显示出现错误的原因。此外,我们还可以用try...finally.…

全角色服务、全场景支撑、全业务应用的新一代智慧教室

新一代智慧教室以“数智化助力高质量人才培养”为核心目标,以AI赋能的智能硬件为基础构建多形态智慧教学环境,以中台为支撑实现数据、设备、系统、业务的互联互通、开放共享,以平台全面覆盖教学应用,采集、汇聚、挖掘、分析课前课…

AP5216 平均电流型LED降压恒流驱动IC 手电筒汽车摩托车灯芯片

产品描述 AP5216 是一款 PWM工作模式, 高效率、外围简单、内置功率管,适用于5V~100V输入的高精度降压 LED 恒流驱动芯片。输出最大功率可达9W,最大电流 1.0A。AP5216 可实现全亮/半亮功能切换,通过MODE 切换:全亮/半亮…

Pytorch线性代数

1、加法运算 A torch.arange(20, dtypetorch.float32).reshape(5, 4) B A.clone() # 通过分配新内存,将A的一个副本分配给B A, A B# tensor([[ 0., 1., 2., 3.], # [ 4., 5., 6., 7.], # [ 8., 9., 10., 11.], # [12., 13.,…

《幻兽帕鲁》多人联机教程:个人电脑搭建可远程访问服务器

《幻兽帕鲁》支持自建服务器实现多人联机,相比邀请码方式联机,自建服务器可突破4人限制,最多让32人同时游戏,而且如果在国内网络环境搭建服务器,在也可以避免官服网络原因导致的掉线、连接失败等问题。 搭建《幻兽帕鲁…

统一异常处理

统一异常处理 统一异常处理创建一个类定义方法ControllerAdvice和ExceptionHandler注意事项 统一异常处理 创建一个类 首先,我们来创建一个类,名字随意,这里我们取名ERHandler 定义方法 在ERHandler中,我们可以定义几个类,参数用来接收各种异常,这里的异常可以是任意的,返回…

从自卑到幸福:吴哲轩的成长故事

从自卑到幸福:吴哲轩的成长故事 吴哲轩,一个内向、孤独的青年,在中学时期以优异的成绩赢得了父母的骄傲。然而,他的内心却充满了迷茫和自卑。他在为父母的期望而活,忽视了自己的精神追求和个人成长。 进入大学后&…

SpringSecurity笔记

SpringSecurity 本笔记来自三更草堂:https://www.bilibili.com/video/BV1mm4y1X7Hc/?spm_id_from333.337.search-card.all.click,仅供个人学习使用 简介 Spring Security是Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro,…