网络编程(三次握手四次挥手)

【1】三次握手四次挥手

1》三次握手

第一次握手都又客户端发起在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。服务器必须准备好接收外来的链接,这通过调用socket、bind和listen函数来完成,称为被动打开。

第一次握手:客户通过调用connect函数进行主动打开(active open)。这引起客户TCP发送一个SYN(表示同步)分节(SYN=J),他告诉服务器客户接下来将在该链接中发送的数据的初始序列号。并进入SYN_SEND状态,等待服务器确认。

第二次握手:服务器必须确认客户的SYN,同时自己也得发送一个SYN分节,他含有服务器接下来将在同一链接中发送的数据的初始序列号。服务器以单字节向客户发送SYN和对客户SYN的ACK(表示确认),此时服务器进入SYN_RECV状态。


第三次握手:客户收到服务器的SYN+ACK。向服务器发送确认分节,此分节发送完毕,客户和服务器都进入ESTABLISHED状态,完成三次握手,链接建立。


三个状态:

1.SYN_SEND:客户端发送SYN报文后进入此状态,等待服务器的确认。

2.SYN_RECV:服务器收到SYN报文后进入此状态,等待客户的确认。

3.ESTABLISHED:当客户端和服务器都发送和接受了ACK报文后,链接进入此状态,表示链接已建立,可以进行数据传输。

举个比较形象的例子:

打电话

第一次握手:喂,能听见我说话把?

第二次握手:能听见你说话,你能听见我说话不?

第三次握手:能听见

开始通话

 三次握手详细过程说明:

第一次握手:客户端向服务器发送一个用于建立TCP链接的请求报文,该报文中包含seq_c序列号,是由客户端随机生成的,并且将报文中的SYN字段置1,表示要建立TCP链接。(SYN=1,seq_c=200,200是客户端随机生成的)。

第二次握手:服务器对客户端发送过来的TCP请求报文做出回应,也发送一个TCP报文,该报文中包含seq_s序列号,由服务器端随机生成,并将报文中的SYN字段置1,表示建立连接,而且还会包含ACK字段,ACK置1表示却热建立连接,同时还会有一个ack_s确认序号,ack_s的值是客户端发送过来的序列号seq_c的基础上加1,用于告知客户端它的TCP请求报文已得到验证。(seq_s=500,ack_s=201,SYN=1,ACK=1,500是服务器端随机生成的)

第三次握手:客户端收到服务器端发送的TCP链接建立请求后,会再次发送一个TCP报文回复服务器,包含序列号seq_c和确认号ack_c,其中序列号是在自己上一次发的报文的序列号的基础上加1,确认号是在服务器发过来的序列号seq_s的基础上加1,同时还有ACK确认字段置1,用于告知确认链接。(seq_c=201,ack_c=501,ACK=1)

面试练习题:

TCP连接过程:

三次握手

TCP的三次握手发生在哪两个函数之间:

accept、connect

为什么一定是三次握手,而不能是两次握手?

主要是为了防止已经失效的链接请求报文突然又传送到了服务器,从而导致不必啊要的错误和资源浪费。两次握手只能保证单项链接是畅通的,因为TCP是一个双向传输协议,只有经过第三次握手,才能确保双向都可以接受到对方发送的数据。

 2》四次挥手

四次挥手既可以由客户端发起,也可以由服务器端发起


第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器的数据传送,客户端进入FIN_WAIT-1状态

第二次挥手:服务器端收到FIN后,发送一个ACK给客户端,告诉客户端我已经收到你发过来的FIN报文,但此时可能还未传完数据,服务器端进入CLOSE_WAIT状态,;客户端收到该报文后会进入FIN_WAIT-2状态

第三次挥手:服务器端传送完数据了,向客户端发送一个FIN报文,用来关闭服务器端到客户端的数据传送,服务器进入LAST_ACK状态

第四次挥手:客户端收到FIN后,向服务器端发送一个ACK报文,告知服务器端我已收到你的FIN结束报文,客户端进入等待2MSL后进入CLOSED状态,服务器端在收到客户端发过俩的确认报文或也会进入CLOSED状态,连接断开。

举个比较形象的例子:

打电话

第一次挥手:我说完了,我要挂了

第二次挥手:好的,我知道了,但是你先别急,等我把话说完

第三次挥手:好了,我说完了,咱们可以挂电话了

第四次挥手:好的,挂了吧

四次挥手过程详细说明: 

 

第一次挥手:客户端发送断开TCP链接请求的报文,包含seq序列号,是由客户端随机生成的,并且还将报文中的FIN字段置1,表示需要断开TCP链接,进入FIN_WAIT-1状态。(FIN=1,seq=u,u是由客户端随机生成的)

第二次挥手:服务器会回复客户端发送FIN报文,向客户端发送一个ACK确认报文,其中包含ACK标志位,置1,seq序列号,由服务器端随机生成,,ack确认号在客户端的seq序列号的基础上加1,该报文用于告知客户端我已收到你想要断开的请求,发送完进入CLOSE_WAIT状态,等客户端接收到该报文时,客户端会进入FIN_WAIT-2状态。(ACK=1,ack= u+1,seq=v, v是由服务器端随机生成的)


第三次挥手:服务器端在回复完客户端的TCP断开请求后,并不会立即断开TCP链接,而是会继续传送数据,直到自己的数据全部传输完后,会向客户端发送一个FIN报文,FIN标志位置1,表示要断开链接,ACK标志位置1,表示确认,seq序列号随机生成,ack确认号仍然是之前客户端seq的基础上加1,发送完进入LAST_ACK状态。(FIN=1,ACK=1,ack=u+1,seq=w,w是服务器端随机生成的)


第四次挥手:客户端收到服务器端的TCP断开请求后,会回复一个ACK确认报文,包含ACK标志位,置1,seq序列号,客户端随机生成的,ack确认号的值是在上一次服务器端的seq序列号的基础上加1,发送完之后,会进入TIME_WAIT状态,客户端需要等待2MSL的时间之后,才能进入CLOSED状态,服务器端在收到ACK报文后也会进入CLOSED状态。TCP链接断开。(ACK=1,ack=w+1,seq=u+1)

 3》各种状态解释

LISTEN:等待从任何远端TCP 和端口的连接请求。
 
SYN_SENT:发送完一个连接请求后等待一个匹配的连接请求。
 
SYN_RECEIVED:发送连接请求并且接收到匹配的连接请求以后等待连接请求确认。
 
ESTABLISHED:表示一个打开的连接,接收到的数据可以被投递给用户。连接的数据传输阶段的正常状态。
 
FIN_WAIT_1:等待远端TCP 的连接终止请求,或者等待之前发送的连接终止请求的确认。
 
FIN_WAIT_2:等待远端TCP 的连接终止请求。
 
CLOSE_WAIT:等待本地用户的连接终止请求。
 
CLOSING:等待远端TCP 的连接终止请求确认。
 
LAST_ACK:等待先前发送给远端TCP 的连接终止请求的确认(包括它字节的连接终止请求的确认)
 
TIME_WAIT:等待足够的时间过去以确保远端TCP 接收到它的连接终止请求的确认。
TIME_WAIT 两个存在的理由:
          1.可靠的实现tcp全双工连接的终止;
          2.允许老的重复分节在网络中消逝。
 
CLOSED:不在连接状态(这是为方便描述假想的状态,实际不存在)


今天的分享就到这里结束啦,如果有哪里写的不好的地方,请指正。
如果觉得不错并且对你有帮助的话点个关注支持一下吧!

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

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

相关文章

小阿轩yx-Kubernertes日志收集

小阿轩yx-Kubernertes日志收集 前言 在 Kubernetes 集群中如何通过不同的技术栈收集容器的日志,包括程序直接输出到控制台日志、自定义文件日志等 有哪些日志需要收集 日志收集与分析很重要,为了更加方便的处理异常 简单总结一些比较重要的需要收集…

https和harbor仓库跟k8s

目录 https 做证书 harbor仓库 https https是加密的http,它的端口是443,它的协议是tcp协议。建立连接和普通的tcp是一样的,都是三次握手和四次挥手,但是它三次握手之后有一个步骤:SSL或者TLS握手的过程&#xff0c…

kubernetes集群部署Confluence 7.2.0+mysql 5.7(自测有效)

背景介绍: Confluence是一个专业的企业知识管理与协同软件。使用简单,但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息、文档协作、集体讨论,信息推送。 这里介绍的使用的是Confluence 7.2.0版本的。 一、在kubernetes集群部署 1…

【C++】手动实现nique_ptr智能指针

1、自己实现封装了一个智能指针&#xff0c;并且使用了模板 目录 代码实现&#xff1a; 输出结果如下&#xff1a; 代码实现&#xff1a; #include <iostream>using namespace std;template <typename T> class UniquePtr { private:T *ptr;public://默认构造函…

H5 响应式精品网站推荐导航源码

源码名称&#xff1a;响应式精品网站推荐导航源码 源码介绍&#xff1a;一款响应式精品网站推荐导航源码&#xff0c;可以自己修改代码替换图标图片和指向网址。背景图支持自动替换&#xff0c;背景图可以在img.php中修改 需求环境&#xff1a;H5 下载地址&#xff1a; http…

【MADRL】多智能体深度确定性策略梯度(MADDPG )算法

本篇文章是博主强化学习RL领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在强化学习专栏&#xff1…

Java专栏介绍

专栏导读 在当今这个技术飞速发展的时代&#xff0c;Java作为一门成熟且广泛应用的编程语言&#xff0c;一直是软件开发领域的中坚力量。本“Java技术”专栏旨在帮助读者深入理解Java编程语言的精髓&#xff0c;掌握其核心概念与高级特性&#xff0c;并通过实战案例提升编程技…

MLM:多模态大型语言模型的简介、微调方法、发展历史及其代表性模型、案例应用之详细攻略

MLM&#xff1a;多模态大型语言模型的简介、微调方法、发展历史及其代表性模型、案例应用之详细攻略 目录 相关文章 AI之MLM&#xff1a;《MM-LLMs: Recent Advances in MultiModal Large Language Models多模态大语言模型的最新进展》翻译与解读 MLM之CLIP&#xff1a;CLIP…

012.Oracle-索引

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

LLM 模型压缩之三: FoldGPT

0. 资源链接 论文: FoldGPT: Simple and Effective Large Language Model Compression Scheme 项目: to be released. 1. 背景动机 现有的大语言模型推理存在以下问题&#xff1a; LLM 模型因为有大量的参数&#xff0c;以及 next token 的预测方式&#xff0c;导致 LLM 模…

攻防世界 unseping

unseping 攻防世界web新手练习 -unseping_攻防世界web新手题unseping-CSDN博客 这道题对我来说还是有点难&#xff0c;什么oct绕过命令执行第一次遇到捏&#xff0c;所以基本是跟着别人的wp写的&#xff0c;一点点记录吧 先对源码进行分析 <?php highlight_file(__FILE…

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 - 通过aclnn调用的方式调用AddCustom算子

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 通过aclnn调用的方式调用 - AddCustom算子 - 单算子API执行(aclnn) 多种算子调用方式 *开发时间使用场景调用方式运行硬件基于Kernel直调工程&#xff08;快速&#xff09;少单算子调用&#xff0c;快速验证算法逻辑IC…

打造个性化时装购物平台:Spring Boot框架的实践

第1章 绪论 1.1背景及意义 随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。人们生活水平的不断提高&#xff0c;日常生活中人们对时装购物系统方面的要求也在不断提高&#xff0c;喜欢购物的人数更是不断增加&#xff0c;使得时装购物系统的开发成为必需而且紧迫的…

面试必备:接口自动化测试精选面试干货

一、 请问你是如何做接口测试的&#xff1f; 大体来说&#xff0c;经历以下过程&#xff1a;接口需求调研、接口测试工具选择、接口测试用例编写、接口测试执行、接口测试回归、接口测试自动化持续集成。具体来说&#xff0c;接口测试流程分成以下九步&#xff1a; 第一步&am…

2024年,女生到底适合转行ui设计还是软件测试?

作为2024年的就业选择来说&#xff0c;软件测试和UI设计发展都挺不错的 选择这两个方向转行的女生很多。但具体选择测试还是UI设计&#xff0c;最好还是根据你个人的兴趣爱好以及长期的发展路径去选择 比如&#xff1a;薪资、工作稳定性、后续晋升空间、学习难度等等方面~ 如…

Kafka【十三】消费者消费消息的偏移量

偏移量offset是消费者消费数据的一个非常重要的属性。默认情况下&#xff0c;消费者如果不指定消费主题数据的偏移量&#xff0c;那么消费者启动消费时&#xff0c;无论当前主题之前存储了多少历史数据&#xff0c;消费者只能从连接成功后当前主题最新的数据偏移位置读取&#…

论文解读 | KDD2024 演化图上的森林矩阵快速计算

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者直播讲解回放&#xff01; 作者简介 孙浩鑫&#xff0c;复旦大学博士生&#xff0c;主要研究方向为大规模图上快速算法设计。 概述 森林矩阵在网络科学、观点动力学和机器学习相关应用中…

(一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别

🍂1、不说废话,现象展示 🍃图片识别 🍃视频识别 自己训练样本 十分简易快速 opencv级联ha

系统架构师考试学习笔记第三篇——架构设计高级知识(19)嵌入式系统架构设计理论与实践

本章考点&#xff1a; 第19课时主要学习嵌入式系统架构设计的理论和工作中的实践。根据新版考试大纲&#xff0c;本课时知识点会涉及案例分析题&#xff08;25分&#xff09;。在历年考试中&#xff0c;案例题对该部分内容都有固定考查&#xff0c;综合知识选择题目中有固定分值…

关于C++数组越界的异常

数组越界一般是很难发现的,而且并不是每次都会崩溃. 比如说定义一个数字 #DEFINE MAX_ARRAY 5 int m_IntArray[MAX_ARRAY]; 我们在初始化的时候,故意给他越界,这个时候一般是不会报错的. for(int i0;i<15;i) { m_IntArray[i]0; } 尤其是全局变量,居然一点提示都没有,局部变…