TCP三握四挥(面试需要)

TCP建立连接需要三次握手过程,关闭连接需要四次挥手过程

三次握手

从图中可以看出,客户端在发起connect时,会发起第一次和第三次握手。服务端在接收客户端连接时,会发起第二次握手。

这三次握手,都会通过SYN+ACK的方式进行互相确认。其中当前阶段的SYN作为下一阶段的ACK的基础值。同时如果不需要返回确认的话,本次就不需要发送SYN,比如第三次握手。

之所以需要第三次握手,可以理解为客户端和服务端都需要一些结论证明对方的发送和接收能力是ok的。

假如没有第三次握手,那么对于服务端来说,他发出了响应报文,这时候客户端对他来说的黑盒的,服务端不知道这个请求有没有被客户端接受到,之后通过第三次握手ACK=SYN+1的方式,才能证明客户端的接收能力。

四次挥手

为什么创建连接需要三次握手,而断开连接需要四次挥手呢?

这时候因为TCP是半关闭造成的。所谓的半关闭就是,TCP提供了某一端结束了他的发送后,还能接收来自另一端的数据。也是就是在收到服务端的关闭请求之前,客户端还可以接收消息

任何一方执行close()操作即可产生挥手操作为什么要等待呢

为了防止这种情况:A接到B的释放连接请求后会发送一个确认信息,但是如果这个确认信息丢了,也就是B没有收到确认释放连接,那么B就会重发一个释放连接请求,这时候A还处于TIME_WAIT状态,所以会再次发送一个确认信息。

为什么TIME_WAIT 状态还需要等2*MSL秒之后才能返回到CLOSED 状态呢?

因为虽然双方都同意关闭连接了,而且握手的4个报文也都发送完毕,按理可以直接回到CLOSED 状态(就好比从SYN_SENT 状态到ESTABLISH 状态那样),但是我们必须假想网络是不可靠的,你无法保证你最后发送的ACK报文一定会被对方收到,就是说对方处于LAST_ACK 状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT 状态的作用就是用来重发可能丢失的ACK报文。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于ChatGPT4+Python近红外光谱数据分析及机器学习与深度学习建模教程

详情点击链接:基于ChatGPT4Python近红外光谱数据分析及机器学习与深度学习建模教程 第一:GPT4 1、ChatGPT(GPT-1、GPT-2、GPT-3、GPT-3.5、GPT-4模型的演变) 2、ChatGPT对话初体验 3、GPT-4与GPT-3.5的区别,以及与…

20240122在WIN10+GTX1080下使用字幕小工具V1.2的使用总结(whisper)

20240122在WIN10GTX1080下使用字幕小工具V1.2的使用总结 2024/1/22 19:52 结论:这个软件如果是习作,可以打101分,功能都实现了。 如果作为商业软件/共享软件,在易用性等方面,可能就只能有70分了。 【百分制】 可选的改…

2017年认证杯SPSSPRO杯数学建模A题(第二阶段)安全的后视镜全过程文档及程序

2017年认证杯SPSSPRO杯数学建模 A题 安全的后视镜 原题再现: 汽车后视镜的视野对行车安全非常重要。一般来说,汽车的后视镜需要有良好的视野范围,以便驾驶员能够全面地了解车后方的道路情况。同时,后视镜也要使图像的畸变尽可能…

idea编译打包前端vue项目

网上download了一个前端vue项目 第一次接触前端记录一下编译打包遇到的问题 1、idea前端项目打包一般是依赖 <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.0…

GitLab备份与恢复测试(基于Docker)

GitLab环境准备 docker run --name gitlab \ -p 2022:22 -p 2080:80 -p 2443:443 -d \ -v /opt/gitlab/config:/etc/gitlab \ -v /opt/gitlab/gitlab/logs:/var/log/gitlab \ -v /opt/gitlab/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:16.2.1-ce.0备份 1.修改配置文件…

Centos升级gcc版本

步骤1&#xff1a;查看当前服务器gcc版本 gcc –version 步骤2&#xff1a;查看当前gcc安装目录 find / -name gcc cd /usr/bin ll gcc* 因为gcc&#xff0c;g&#xff0c;c都是配套的,查找出 g和c的原版本位置 步骤3&#xff1a;安装下载依赖包 yum install glibc-heade…

yolov8 opencv dnn部署 github代码

源码地址 本人使用的opencv c github代码,代码作者非本人 实现推理源码中作者的yolov8s.onnx 推理条件 windows 10 Visual Studio 2019 Nvidia GeForce GTX 1070 opencv4.7.0 (opencv4.5.5在别的地方看到不支持yolov8的推理&#xff0c;所以只使用opencv4.7.0) c部署 环境…

标量、向量、矩阵和张量的区别?

标量、向量、矩阵和张量是数学和物理学中常用的概念&#xff0c;它们在多维数据表示和处理中扮演着关键角色。下面是这些概念的基本区别&#xff1a; 标量&#xff08;Scalar&#xff09;: -标量是单个数字&#xff0c;用于表示单一的量。 -它没有方向。 -在数学中&#xff0…

竞赛保研 机器视觉目标检测 - opencv 深度学习

文章目录 0 前言2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 0 前言 &#x1f5…

Maven《四》-- 基于Idea进行Maven工程构建

目录 &#x1f436;4.1 构建概念和构建过程 &#x1f436;4.2 命令方式项目构建 1. &#x1f959;编译&#xff1a;mvn compile 2. &#x1f959;清理&#xff1a;mvn clean 3. &#x1f959;打包&#xff1a;mvn package 4. &#x1f959;安装&#xff1a;mvn install …

泰迪科技最新大数据法律监督模型解决方案

大数据法律监督平台是基于监督数据整合管理平台、监督模型构建平台、内置模型库以及法律监督线索管理平台打造的一套服务于检察机关法律监督工作的专业化系统。通过数据采集、融合、挖掘、建模、展现等一系列能力&#xff0c;辅助检察官从纷繁复杂的数据中&#xff0c;开展多维…

java遍历(for和forEach)

1.dade文件 package model;public class dade {private int id;private String name;public dade() {}public dade(int id, String name) {this.id id;this.name name;}public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {r…

unity3d在汽车领域的未来发展趋势浅谈

Unity3D在汽车领域的未来发展趋势可以从以下几个方面深入分析&#xff1a; 增强现实&#xff08;AR&#xff09;与虚拟现实&#xff08;VR&#xff09;的融合&#xff1a;随着AR和VR技术的不断发展&#xff0c;未来Unity3D将在汽车领域中实现AR和VR技术的融合。通过这种融合&a…

Java中的内存溢出与内存泄漏深度解析

目录 引言 一. 内存溢出&#xff08;Memory Overflow&#xff09; 1.1 堆内存溢出 1.2 栈内存溢出 1.3 内存溢出的解决策略 1.3.1 优化对象的创建和销毁 1.3.2 调整堆内存大小 1.3.3 使用内存分析工具 1.3.4 避免创建过大的对象 1.3.5 定期清理不再使用的对象 二、…

使用docker以容器方式安装redis

文章目录 获取redis镜像查看本地镜像从官网获取 redis.conf 配置文件创建并启动redis容器 获取redis镜像 docker pull redis #默认获取redis:latest&#xff0c;即最新的镜像 查看本地镜像 docker images 从官网获取 redis.conf 配置文件 创建并进入目录 [rootVM-16-11-ce…

如何快速上手Vue框架

快速上手Vue框架可以遵循以下步骤。Vue是一个渐进式JavaScript框架&#xff0c;因其易学和灵活而受到许多开发者的欢迎。 1. 基础知识 在开始学习Vue之前&#xff0c;确保你具备以下基础知识&#xff1a; HTML、CSS和JavaScript&#xff1a;Vue是一个JavaScript框架&#xf…

C++ Webserver从零开始:基础知识(五)——信号

Linux信号概述 Linux系统中&#xff0c;信号是一种通信的方式&#xff0c;其通常用作用户&#xff0c;系统或进程给目标进程发送的信息。 信号的作用&#xff1a;通知目标进程某个状态的改变或系统异常。 产生的条件&#xff1a; 对于终端程序&#xff1a;可以是用户输入的…

Python中的函数(二)

1 闭包与装饰器 1.1 闭包 闭包&#xff08;Closure&#xff09;是指在一个函数内部定义的函数&#xff0c;并且该内部函数可以访问外部函数作用域中的变量。闭包可以在外部函数执行完毕后&#xff0c;仍然保持对外部函数作用域的引用&#xff0c;从而可以继续访问和操作外部函…

【Java】--网络编程:基于TCP协议的网络通信

【Java】–网络编程&#xff1a;基于TCP协议的网络通信 文章目录 【Java】--网络编程&#xff1a;基于TCP协议的网络通信一、TCP协议1.1 概念1.2 三次握手1.2.1 文字描述1.2.2 画图演示 1.3 四次挥手1.3.1 文字描述1.3.2 画图演示 二、基于TCP的Socket网络编程2.1 概念2.2 服务…

Kafka-服务端-网络层

Reactor模式 Kafka网络层采用的是Reactor模式&#xff0c;是一种基于事件驱动的模式。熟悉Java编程应该了解JavaNIO提供了实现Reactor模式的API。常见的单线程Java NIO的编程模式如图所示。 为了满足高并发的需求&#xff0c;也为了充分利用服务器的资源&#xff0c;服务端需要…