基础:TCP三次握手做了什么,为什么要握手?


1. TCP 三次握手在做些什么


在这里插入图片描述

1. 第一次握手

1)握手作用:客户端发出建立连接请求。

2)数据处理:客户端发送连接请求报文段,将SYN位置为1,Sequence Numberx;然后,客户端进入SYN_SEND状态,等待服务器的确认。



2. 第二次握手

1)握手作用:服务端收到客户端请求后,回复报文给客户端,表示客户端的报文Seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接。

2)数据处理:服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Numberx+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为 1Sequence Number为 y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态。



3. 第三次握手

1)握手作用:客户端收到服务端的确认报文信息后,发送报文给服务端,表示确认收到服务器端同意连接的信号。

2)数据处理:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。


4. 讨论:accept函数调用时,三次握手是否已经完成?

先来看个图:

在这里插入图片描述

  • 服务端首先会调用 listen 函数监听客户端的连接请求。

  • 然后服务端调用 accept 函数阻塞等待取出未决连接队列中的客户端连接。

  • 如果服务端未决连接队列一直为空,这意味着没有客户端和服务器建立连接,那么 accept 就会一直阻塞。

  • 当客户端调用 connect 函数发起连接时,如果完成tcp三次握手,那么 accept 函数会取出一个客户端连接(注意:是已经建立好的连接)然后立即返回。

注意:
accept 函数调用成功,返回的是一个已经完成 tcp 三次握手的客户端连接。如果在三次握手的过程中(最后一步),服务端没有收到客户端的ACK,说明三次握手还没有建立完成,accept 函数依然会阻塞。


2. 为什么要三次握手


谢希仁老师在《计算机网络》中有讲到:
三次握手的目的是:为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误


书中还举了个“已失效的连接请求报文段 ”例子,为了方便阅读,这里对原文做了分段,具体原文描述如下:

“client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server。

本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。

假设不采用 “三次握手”,那么只要 server 发出确认,新的连接就建立了。

由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据(因为client现在是CLOSED状态)。

但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。

这样,server 的很多资源就白白浪费掉了。

采用 “三次握手” 的办法可以防止上述现象发生。
例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接”。

从另外一个角度来讲,三次握手是为了防止服务端一直等待从而浪费资源。

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

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

相关文章

Swagger Array 使用指南:详解与实践

Swagger 允许开发者定义 API 的路径、请求参数、响应和其他相关信息,以便生成可读性较高的文档和自动生成客户端代码。而 Array (数组)是一种常见的数据结构,用于存储和组织多个相同类型的数据元素。数组可以有不同的维度和大小&a…

几个精品声音模型

AI技术提取某位歌手的音色,再用其替换另一位歌手音色的方式,可以实现接近歌手本人翻唱的逼真效果。无需学习其他伪音技巧,即可实现实时男女声音互换等等。 使用 RVC 及模型工具,可以实现以下几个功能: 音乐干声分离&…

【兔子机器人】实现从初始状态到站立

一、遥想星空up主的方法 由于我有卡位结构,无法做到劈腿,而且底盘也不一样,无法使用此方法 但是其代码思想是可以借鉴的。 参考视频: 【【开源啦!】无刷轮腿平衡机器人】 【精准空降到 01:16】 https://www.bilibili…

uniapp 对video视频组件嵌套倍速按钮

这次接了需求是要求有倍速功能,去看了文档发现并没有倍速按钮的属性,想着手写一个吧 可最后发现原生层级太高,无论怎么样都迭不上去,就只能去找插件看看咯 找了好多插件发现都不可用,因为我这是app端,有些视…

旅游管理系统|基于SpringBoot+ Mysql+Java+Tomcat技术的旅游管理系统设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 用户功能 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 …

深度学习——数据预处理

一、数据预处理 为了能用深度学习来解决现实世界的问题,我们经常从预处理原始数据开始, 而不是从那些准备好的张量格式数据开始。 在Python中常用的数据分析工具中,我们通常使用pandas软件包。 像庞大的Python生态系统中的许多其他扩展包一样…

【JVM篇】类的生命周期

文章目录 🍔类的生命周期概述⭐加载⭐连接⭐初始化⭐类的卸载 🍔类的生命周期概述 Java类的生命周期包括加载(Loading)、验证(Verification)、准备(Preparation)、解析(R…

TrueNAS怎么设置中文,最新2024版本安装详细说明

首先我们做好安装前的准备工作 1,ISO镜像安装包 2,虚拟机(建议使用ESXI虚拟机环境) 如果是物理机安装,建议先给底层安装虚拟机系统esxi,再在上面安装方便以后的管理,如果你想物理机直接安装&a…

【Redis】缓存穿透

问题发生背景:客户端请求的数据再缓存中和数据库中都不存在。 导致的问题:缓存永远不会生效,这些请求都会去请求数据库—导致数据库压力增大。 解决方案: 1.缓存空对象 在Redis中缓存空对象,告诉客户端数据库中没有该值…

zookeeper快速入门五:用zookeeper实现服务注册与发现中心

系列: zookeeper快速入门一:zookeeper安装与启动-CSDN博客 zookeeper快速入门二:zookeeper基本概念-CSDN博客 zookeeper快速入门三:zookeeper的基本操作 zookeeper快速入门四:在java客户端中操作zookeeper-CSDN博客…

【Python】线程—GIL—asyncio

文章目录 一、Python 线程二、threading 模块三、例程3.1 基本用法3.2 同步3.21 Lock(锁)3.22 RLock(递归锁)3.23 Condition(条件变量)3.24 Semaphore(信号量) 四、GIL4.1 简述4.2 详…

MySQL教程-SQL

SQL(Structured Query Language)结构化查询语言,操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准。 语法 SQL语句可以单行或多行书写,以;为结束标记SQL可以使用空格或缩进来增强语句的可读性SQL分单行注释(-- 注释内容 或 …

跨境电商应该用什么样的服务器?多大带宽?

跨境电商在选择服务器 和带宽时,需要考虑多个因素,包括业务规模、用户数量、网站流量、地理位置等。下面是一些关键考虑因素: 1、服务器类型 跨境电商通常会选择使用云服务器,因为云服务器具有灵活性、可扩展性和高可用性。云服务…

做户用光伏代理赚钱吗

随着全球能源危机的加剧和环境问题的日益严重,清洁能源的开发和利用成为了一个重要的议题。光伏发电作为一种绿色、可再生的能源,在全球范围内得到了广泛的关注和应用。 一、代理农村光伏项目挣钱吗 随着国家对光伏发电的政策支持和补贴,以及…

关 于 重 燃 学 习 的 热 情

3月1日是我回学校的第一天。经历了长达8个月在家的昏暗时刻,我这10天的感觉和在家的感觉发生了翻天覆地的变化,最明显的莫过于学习状态的改变。 倒不是说在家学的不好,而是说在学校,我对学习的整体感觉,以及专注程度&…

鸿蒙开发学习:【驱动子系统】

OpenHarmony驱动子系统采用C面向对象编程模型构建,通过平台解耦、内核解耦,兼容不同内核,提供了归一化的驱动平台底座,旨在为开发者提供更精准、更高效的开发环境,力求做到一次开发,多系统部署。 为了缩减…

避雷!又新增一本SCI被标记On Hold,共16本!

毕业推荐 IEEE(CCF-C类) • 计算机医学类,7.5-8.0,JCR1区,中科院2/1区(TOP) • 3-4个月左右录用 SCIE: • 计算机类,6.5-7.0,JCR1区,中科院2…

关于udp能跨局域网传输的问题

UDP(用户数据报协议)以其独特的传输特性在多种应用场景中都有着极其重要的作用。然而,关于UDP是否能跨局域网(LAN)进行传输,以及这一传输过程中的优缺点,一直是网络技术领域讨论的热点。本文将详…

气液分离器的概念和原理

气液分离器也叫低压储液器,在热泵或制冷系统中使用,主要是将出蒸发器、进压缩机气流中的液滴分离出来,防止压缩机发生液击,用于工质充注量较大、压缩机进气可能带液且压缩机对湿压缩较敏感的情况 。 液击主要出现在活塞式压缩机中…

JSON 的了解和使用

目录 1. JSON 2. JSONcpp 的安装 3. JSONcpp 相关API的使用 3.1. 将 Json::Value 对象转化为 std::string 3.1.1. Json::Value 类 3.1.2. Json::Value::toStyledString 接口 3.1.3. Json::StyledWriter 类 3.1.4. Json::StyledWriter::write 接口 3.1.5. Json::Fas…