TCP 协议详解:三次握手与四次挥手

在网络通信中,确保数据准确无误地传递是至关重要的。TCP(Transmission Control Protocol,传输控制协议)作为一种面向连接的、可靠的、基于字节流的通信协议,在网络数据传输中起到了核心作用。本文将详细解析 TCP 的基本概念、数据报结构以及著名的三次握手和四次挥手过程。

一、TCP基础入门

TCP 是一种确保网络中数据正确传输的协议,其特点如下:

  1. 面向连接:在数据传输前,必须与对方建立一个连接,并在传输结束后断开连接。
  2. 可靠性:通过序号、确认应答、重传控制、流量控制和拥塞控制等机制,保证数据传输的可靠性。
  3. 建立连接:客户端与服务器之间的通信开始之前,必须先建立连接,这个过程通过一个被称为“三次握手”的过程完成。

二、TCP数据报结构

TCP数据报的结构包括以下关键部分:

  • 序号(Seq):32位的序列号,用于标识从TCP源向目标发送的数据字节流,它表示在这个段中的第一个数据字节。
  • 确认号(Ack):32位的确认号,如果设置了ACK标志,则表示接收端期望收到的下一个序列号,即上一个接收到的数据字节的序号加1。
  • 标志位:共6个,包括:
    • URG:紧急指针有效。
    • ACK:确认序号有效。
    • PSH:提示接收端应立即将这个报文段交给应用层。
    • RST:重置连接。
    • SYN:同步序列编号,用于建立连接。
    • FIN:释放连接。

三、TCP的三次握手

三次握手是建立一个TCP连接时所必须的过程,其步骤包括:

  1. 第一次握手:客户端发送一个SYN包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认。
  2. 第二次握手:服务器接收到SYN包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
  3. 第三次握手:客户端收到服务器的SYN+ACK包后,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

举例说明

假设客户端是四川8633航班的乘务系统,它想要建立连接来发送航班状态到地面服务器:

  • 第一步:四川8633发出连接请求(SYN),并告知序列号。
  • 第二步:地面服务器确认收到(ACK)并回应自己的连接请求(SYN)。
  • 第三步:四川8633确认收到,并且连接正式建立。

四、TCP的四次挥手

当TCP连接中的一方完成数据传输后,将执行四次挥手来终止连接,具体步骤如下:

  1. 第一次挥手:客户端发送一个FIN来关闭客户到服务器的数据传送。
  2. 第二次挥手:服务器收到这个FIN,发送一个ACK给客户端。
  3. 第三次挥手:服务器关闭客户端的连接,发送一个FIN给客户端。
  4. 第四次挥手:客户

端发送ACK信号,然后进入等待状态,等待服务器关闭连接。

举例说明

假设四川8633航班的乘务系统完成了数据传输:

  • 第一步:乘务系统发送一个FIN标志,表示“我已完成发送”。
  • 第二步:地面服务器确认这一FIN,并告知“我知道你已完成发送”。
  • 第三步:地面服务器发送FIN,表示“我也完成了发送”。
  • 第四步:乘务系统确认这一FIN,并最终关闭连接。

结语

TCP的三次握手和四次挥手是保证网络通信可靠性的关键机制。理解这两个过程对于任何网络专业人士来说都是基本功,不仅有助于解决网络问题,也有助于设计更高效的网络通信协议。

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

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

相关文章

神经网络学习5-非线性激活

非线性激活,即 这是最常用的 inplaceTrue 原位操作 改变变量本身的值,就是是否输入时若原本有值,是否更换 该函数就是表示:输入小于零时输出0,大于零时保持不变 代码如下: import torch from torch imp…

Python初体验

# Java基础知识学的差不多了,项目上又没什么事,学学py,方便以后对接 1、打包flask应用(好痛苦,在什么平台打包就只在那个平台可用想在linux用只能参考方法2了) pyinstaller --onefile app.py -n myapp 2…

Databend 开源周报第 149 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 支持递归公共表…

(项目实战)RocketMQ5.0延迟消息在聚合支付系统中的应用

1 基于业务场景掌握RocketMQ5.0 本篇文章主要结合聚合支付系统中的业务场景来落地RocketMQ中间件的应用,聚合支付系统主要在支付系统超时订单和商户支付结果异步通知场景中会使用到RocketMQ消息中间件。本文使用到了RocketMQ中的延迟消息知识点,RocketM…

数据库精选题(一)(关系数据库设计)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀数据库 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 前言 练习题 题型一:判断关系…

百度地图使用任意图片旋转任意角度作为地面贴图

公司项目有个需求是要在地图上贴个航拍的照片做出类似卫星地图的效果,但是只有一张图片而且可以随时替换,也不好做瓦片地图,而且照片的角度可以任意旋转。 要实现这个功能需要解决以下问题: 百度地图怎么贴图片图片角度如何旋转 不卖关子,我先放出实现的效果,为了不涉及侵…

ansible file模块

file模块 管理文件和目录的属性,如状态(是否存在)、权限、所有权等。 1、创建文件: 使用file模块的state参数设置为touch可以创建文件。例如: ansible 组名 -m file -a "path/csdn/jingyu statetouch" …

期末考后怎样发成绩?

老师们,下周可就是期末考啦,又到了头疼发成绩的时候了。每当这个时候,家长们总是急切地咨询孩子的考试表现,向老师们询问成绩。这种场景几乎成了每学期结束时的常态。 别担心,我来安利一个超棒的工具——“易查分小程序…

Java开发接口设计的原则

在现代软件开发实践中,接口设计扮演着至关重要的角色。它不仅关乎代码的结构和未来的可维护性,还直接影响到软件系统的灵活性和扩展性。本文将通过实例详解几个核心的接口设计原则,帮助开发者更好地编写和管理接口,从而提升软件的…

一键制作,打造高质量的数字刊物

随着数字化时代的到来,数字刊物已经成为信息传播的重要载体。它以便捷、环保、互动性强等特点,受到了越来越多人的青睐。然而,如何快速、高效地制作出高质量的数字刊物,成为许多创作者面临的难题。今天,教大家一个制作…

【golang学习之旅】Go中的变量(1)

系列文章 【golang学习之旅】使用VScode安装配置Go开发环境 【golang学习之旅】报错:a declared but not used 【golang学习之旅】Go 的基本数据类型 【golang学习之旅】深入理解字符串string数据类型 【golang学习之旅】go mod tidy 【golang学习之旅】记录一次 p…

Codepen Three.js环境依赖配置

Codepen Three.js环境依赖配置 前言 如果想在CodePen环境写Three.js依赖的项目,环境搭建可以参考该Codepen项目: Chill the lion 详细 打开设置可以看到以下配置 更多项目参考 1. Chill the Lion Chill the Lion 是一个基于 ThreeJS 制作的 WebGL 示例。它由…

使用MyBatis的动态SQL注解实现实体的CRUD操作

使用MyBatis的动态SQL注解实现实体的CRUD操作 1. 引言2. 准备工作2.1 创建数据表2.2 创建实体类 Book2.3 修改Mapper接口 BookMapper 3. 测试CRUD操作3.1 配置日志3.2 查询操作3.3 新增操作3.4 修改操作3.5 删除操作 4. 与MyBatis Plus的对比5. 动态SQL注解的适用场景5.1 动态查…

AcWing算法基础课笔记——质数

质数 质数&#xff1a;在大于1的整数中&#xff0c;如果只包含1和它本身这两个约数&#xff0c;就被称之为质数 &#xff08;1&#xff09;质数的判定——试除法 bool is_prime(int n) {if (n < 2) return false;for(int i 2; i < n / i; i ) {if(n % i 0) return …

API低代码平台介绍6-数据库记录删除功能

数据库记录删除功能 在前续文章中我们介绍了如何插入和修改数据库记录&#xff0c;本篇文章会沿用之前的测试数据&#xff0c;介绍如何使用ADI平台定义一个删除目标数据库记录的接口&#xff0c;包括 单主键单表删除、复合主键单表删除、多表删除&#xff08;整合前两者&#x…

JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)

用 js 描述树 let tree [{label:a,children:[{label:b,children:[{label:d},{label:e}]},{label:c,children:[{label:f}]}]} ]使用数组是因为树的节点有顺序 深度优先遍历 从根节点出发&#xff0c;优先遍历最深的节点 遍历顺序为 abdecf function DFS(tree) {tree.forEach(…

揭示SOCKS5代理服务器列表的重要性

在复杂的网络安全领域中&#xff0c;SOCKS5代理在保护在线活动方面发挥着关键作用。本文深入探讨了SOCKS5代理服务器列表的细节&#xff0c;探讨了它们的应用、优势以及在增强在线安全和隐私方面不可或缺的功能。 一、理解SOCKS5代理服务器列表 作为在客户端和服务器之间进行通…

QListWidget、QMenu、Action、customContextMenuRequested

QListWidget的初始化、清空、Append添加、Insert添加、删除item QListWidget的事件的使用 QToolBox的使用&#xff0c;每个Page可以添加其他控件 QToolBar使用代码添加QMenu,QMenu添加3个Action QToolButton绑定Action 布局 其中 QSplitter比较特殊&#xff0c; 允许在水平或垂…

实现锚点链接点击tab跳转到指定位置 并且滚动鼠标顶部锚点的样式也跟随变化

实现效果如下 不管是点击还是 滚动鼠标 顶部的样式也会跟随变化 点击会跳转到指定的位置 通过IntersectionObserver 监听是否可见 下面代码可以直接执行到vue的文件 <template><div><ul class"nav"><li v-for"tab in tabs" :key…

【MYSQL】解决数据库Too many connections

Linux登录mysql mysql -u root -p 查看 mysql 服务器中的活动进程数量 mysql> select count(*) from information_schema.processlist;---------- | count(*) | ---------- | 296 | ---------- 1 row in set (0.00 sec)查看 mysql 数据库中当前活动连接的客户端 IP 地址…