【Linux-计算机网络】-TCP协议通信流程

news2025/1/17 14:04:50

1.TCP协议通信流程图

 

1.1TCP协议的通讯流程可以分为以下步骤:

  1. 应用层:应用程序通过系统调用API(如socket)创建一个TCP套接字(socket),并设置好相关的选项。

  2. 传输层:当应用程序调用connect函数建立TCP连接时,TCP协议开始进行三次握手协议:

    a. 客户端向服务端发送SYN数据包(SYN_SENT状态);

    b. 服务端收到SYN数据包后,向客户端发送SYN+ACK数据包(SYN_RCVD状态);

    c. 客户端收到SYN+ACK数据包后,向服务端发送ACK数据包(ESTABLISHED状态)。

  3. 网络层:TCP数据包被封装在IP数据包中,经过网络层进行路由选择和传输。

  4. 数据链路层:TCP/IP数据包被封装在以太网帧中,通过数据链路层进行物理传输。

  5. 传输层:当数据到达目的地后,TCP协议会进行四次挥手协议

    a. 客户端向服务端发送FIN数据包(FIN_WAIT_1状态);

    b. 服务端收到FIN数据包后,向客户端发送ACK数据包(CLOSE_WAIT状态);

    c. 当服务端完成数据发送后,向客户端发送FIN数据包(LAST_ACK状态);

    d. 客户端收到FIN数据包后,向服务端发送ACK数据包,此时连接关闭(CLOSED状态)。

  • TCP在建立连接的时候,采用的是三次握手,在断开连接的时候,采用的是四次挥手 。

这里的重点是三次握手和四次挥手,接下来我们重点讲解一下。

 1.2三次握手过程

 👿Linux三次握手是指TCP连接建立的过程中,客户端和服务端之间通过交换三个数据包来确认彼此的身份和建立连接的过程。

  1. 第一次握手:客户端发送SYN(同步)数据包给服务端,请求建立连接。(SYN数据包包含客户端的初始序列号(seq number),用于同步客户端和服务端的数据传输。)

  2. 第二次握手:服务端收到SYN数据包后,发送一个SYN-ACK(同步-确认)数据包给客户端。(SYN-ACK数据包包含服务端的初始序列号和对客户端SYN数据包的确认。)这个阶段,服务端已经准备好了接收来自客户端的数据。

  3. 第三次握手:户端收到SYN-ACK数据包后,发送一个ACK(确认)数据包给服务端。(ACK数据包包含客户端对服务端SYN-ACK数据包的确认,以及客户端的初始序列号。)此时,客户端和服务端都已经准备好了通信,可以开始传输数据。此时,客户端和服务端之间的TCP连接已经建立完成

就比如你跟你同学说周末到他家里玩(SYN)希望他能够同意。你同学知道了你要到他家玩(收到SYN)表示你那天啥时候来都行(SYN-ACK)让你知道他同意了。

当你知道了同学同意你去他家后,你就要为周末去他家做准备(发送ACK)。

🌈服务器的初始化 

当服务器完成套接字的创建绑定和监听后,可以调用accept函数阻塞等待客户端发起连接请求。

服务端初始化的过程:

  1. 创建套接字:使用socket()函数创建一个套接字,该套接字可以用于接受客户端连接请求。

  2. 绑定端口:使用bind()函数将套接字绑定到一个具体的端口上,以便客户端可以通过这个端口来连接服务器。

  3. 监听连接:使用listen()函数将套接字设置为监听状态,以便接受客户端的连接请求。

  4. 接受连接:使用accept()函数等待客户端的连接请求,当客户端发起连接请求时,accept()函数会返回一个新的套接字描述符,用于和客户端进行通信。

  5. 处理请求:使用新的套接字描述符和客户端进行通信,处理客户端发送过来的请求,并发送响应给客户端。

  6. 关闭连接:当客户端请求处理完成后,关闭套接字描述符,释放相应的资源。

  • 需要注意的是,在服务端处理请求的过程中,可能会有多个客户端同时发起连接请求,因此需要使用多线程或多进程的方式来处理这些请求。同时,服务端也需要进行异常处理,防止因为网络问题或其他原因导致服务器异常退出。

接下来就是客户端与服务器的交流了。

C/S建立连接过程 

客户端与服务器建立连接的过程如下:

  1. 客户端创建一个套接字:使用socket()函数创建一个套接字,用于与服务器进行通信。

  2. 设置连接参数:使用connect()函数将套接字连接到服务器的地址和端口上。

  3. 发起连接请求:使用connect()函数发起连接请求,向服务器发送一个SYN数据包,表示客户端请求连接。

  4. 等待服务器响应:客户端会等待服务器的响应,如果服务器接受了连接请求,就会发送一个SYN+ACK数据包回来,表示服务器愿意建立连接。

  5. 确认服务器响应:客户端接收到服务器的SYN+ACK数据包后,会发送一个ACK数据包,表示客户端确认连接请求已经成功建立。

  6. 建立连接:当服务器接收到客户端发送的ACK数据包后,连接就正式建立了,客户端和服务器可以开始进行通信。

这个建立连接的过程,通常称为三次握手。

  • 需要注意的是,连接并不是立马建立成功的,由于TCP属于传输层协议,因此在建立连接时双方的操作系统会自主进行三次协商,最后连接才会建立成功。

 

数据传输的过程 

 

  •  建立连接后,TCP协议提供全双工的通信服务,所谓全双工的意思是,在同一条连接中,同一时刻,通信双方可以同时写数据,相对的概念叫做半双工,同一条连接在同一时刻,只能由一方来写数据。
  • 服务器从accept返回后立刻调用read,读socket就像读管道一样,如果没有数据到达就阻塞等待。
  • 这时客户端调用write发送请求给服务器,服务器收到后从read返回,对客户端的请求进行处理,在此期间客户端调用read阻塞等待服务器端应答。
  • 服务器调用write将处理的结果发回给客户端,再次调用read阻塞等待下一条请求。
  • 客户端收到后从read返回,发送下一条请求,如此循环下去。

示例:

  1. 客户端使用send()函数将数据发送给服务器。发送的数据可以是任何格式的数据,例如字符串、二进制数据等。

  2. 服务器使用recv()函数接收客户端发送的数据。在接收数据之前,服务器需要先使用accept()函数接受客户端的连接请求,获取到一个新的套接字描述符。服务器从这个新的套接字描述符中读取客户端发送的数据。

  3. 服务器使用send()函数将响应数据发送给客户端。响应数据可以是任何格式的数据,例如字符串、二进制数据等。

  4. 客户端使用recv()函数接收服务器发送的响应数据。

  5. 客户端和服务器之间进行多次数据的传输,直到完成数据的传输任务。

 四次挥手的过程

四次挥手的过程就是两台主机断开通信连接的过程。

TCP连接的四次挥手过程如下:

  1. 客户端发送一个FIN报文,表示客户端已经没有数据要发送给服务器了,并要求服务器关闭连接。客户端进入FIN_WAIT_1状态

  2. 服务器接收到客户端发送的FIN报文后,向客户端发送一个ACK报文作为响应。此时,服务器进入CLOSE_WAIT状态,等待应用程序关闭连接

  3. 如果服务器有尚未发送的数据,会在数据发送完毕后再发送一个FIN报文给客户端,表示服务器已经没有数据要发送了。服务器进入LAST_ACK状态

  4. 客户端接收到服务器发送的FIN报文后,向服务器发送一个ACK报文作为响应。此时,客户端进入TIME_WAIT状态,等待一段时间后才关闭连接。服务器接收到客户端发送的ACK报文后,进入CLOSED状态,连接关闭。

端口连接

  • 当双方通信结束之后,需要通过四次挥手的方案使双方断开连接,当客户端调用close关闭连接后,服务器最终也会关闭对应的连接。而其中一次close就对应两次挥手,因此一对close最终对应的就是四次挥手。
  • 其中最后一次挥手是为了确保数据传输的完整性和可靠性,避免数据重复和丢失等问题。在断开连接之前,需要确保所有的数据都已经被传输完毕,并且各个状态和缓存已经被正确处理和释放,避免可能的资源泄露和数据损失。

需要注意的是,客户端进入TIME_WAIT状态的目的是为了确保服务器接收到客户端发送的ACK报文,避免可能的数据重传和延迟。在客户端等待的这段时间内,客户端不会再向服务器发送任何数据,同时等待的时间也是由TCP协议栈决定的,通常为2倍的最大段生存时间

👿四次挥手的好处 

  1. TCP四次挥手的主要作用是安全地关闭连接并释放资源。在TCP连接中,一旦完成了数据的传输,就需要关闭连接以释放占用的资源,避免资源浪费和不必要的等待。
  2. 四次挥手的过程可以保证数据传输的完整性和可靠性,避免出现数据丢失和错误。同时,四次挥手的过程也可以保护连接的安全性,避免数据被未经授权的用户访问和篡改。
  3. 另外,四次挥手过程中,服务器可以先关闭连接并等待客户端的确认,避免出现客户端长时间占用连接资源的情况。这样可以有效地避免连接的滥用和资源的浪费。
  4. 总之,TCP四次挥手过程是保证连接可靠性、数据完整性和安全性的重要步骤,是网络通信中必不可少的一部分。

 

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

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

相关文章

机器学习中的数学原理——过拟合、正则化与惩罚函数

通过这篇博客,你将清晰的明白什么是过拟合、正则化、惩罚函数。这个专栏名为白话机器学习中数学学习笔记,主要是用来分享一下我在 机器学习中的学习笔记及一些感悟,也希望对你的学习有帮助哦!感兴趣的小伙伴欢迎私信或者评论区留言…

153.网络安全渗透测试—[Cobalt Strike系列]—[生成hta/exe/宏后门]

我认为,无论是学习安全还是从事安全的人多多少少都会有些许的情怀和使命感!!! 文章目录一、后门简介1、hta后门2、exe后门3、宏病毒后门二、生成后门并测试0、测试环境1、生成hta后门并测试2、生成exe后门并测试3、生成宏病毒后门…

分布式监控平台-Zabbix

分布监控平台-Zabbix一、Zabbix概述1、Zabbix是什么?2、Zabbix监控原理二、部署Zabbix服务端(端口:10051)1、关闭防火墙 修改主机名2、获取Zabbix下载资源3、安装SCL(Software Collections),修改 Zabbix-front 前端源4…

SQL Server的子查询

SQL Server的子查询一、子查询基础知识二、子查询规则三、限定子查询中的列名四、子查询的多层嵌套五、相关子查询六、子查询类型总结一、子查询基础知识 子查询是嵌套在SELECT、INSERT、UPDATE、DELETE语句中或另一个子查询中的查询。 可以在允许表达式的任何位置使用子查询。…

【MySQL】联合查询

目录 1、前言 2、联合查询 3、内连接和外连接 4、案例演示 4.1 查询篮球哥每科的成绩 4.2 查询所有同学的总成绩及邮箱 5、自连接 5.1 显示所有计算机原理成绩比java成绩高的同学 6、子查询 6.1 查询出篮球哥的同班同学 6.2 多行子查询 7、合并查询 1、前言 在实际…

macOS Monterey 12.6.5 (21G531) 正式版发布,ISO、IPSW、PKG 下载

本站下载的 macOS 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。另外也支持在 Windows 和 Linux 中创建可引导介质。 2023 年 4 月 10 日(北京…

如何使用Midjourney辅助建筑平面设计和室内设计,常用的建筑平面效果图提示和使用效果展示(内附Midjourney提示词网站)

文章目录一、室内建筑平面设计1.AutoCAD图纸(别墅图为例)2.平面效果图3.三维平面透视图二、建筑室内设计1.现代简约2.波西米亚风格3.工业风格4.沿海风格5.法国风格6.现代风格7.提示增加颜色倾向8.提示中增加设计师9.其它一些尝试三、好用的Midjourney提示…

unity 全局光照

全局光照由两部分组成:直接光照和间接光照。 直接光照由直接光照射到物体上以后直接弹射到人眼接收到的光照。 间接光照为直接光照照射到物体上又弹射到其它物体上面以后多次弹射才被人眼接收的光照(两次及以上的光照统称为间接光照) 材质光…

消息队列RocketMQ、Kafka小计

1、消息队列模型 点对点模式 (一对一,消费者主动拉取数据,消息收到后消息清除)点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息,而不是将消息推送到客户端。这个模型的特点是…

Observability: Elastic RUM (真实用户监控)演示

在之前的文章 “Elastic RUM(真实用户监测)浅谈”,我们详细描述了 Elastic RUM (Real User Monitor)。在今天的文章中,我将详细一步一步地对该文章进行演示以便大家也能和我一样进行展示。在今天的展示中&a…

Docker6种网络配置详解,网络模式应该这么选

文章目录一、Bridge网络模式二、Host网络模式三、Overlay网络模式四、None网络模式五、Macvlan网络模式六、Ipvlan网络模式七、网络模式选择在Docker中,网络配置是一个重要的主题,因为容器需要与其他容器或外部网络进行通信。Docker提供了多种网络模式和…

GPT-4 和ChatGPT API的定价分析

OpenAI发布了他们的ChatGPT新机器学习模型GPT-4。GPT-4是GPT-3的一大进步,GPT-3是当前ChatGPT免费版本(GPT 3.5 Turbo)所运行的模型的基础,今天我们也来凑个热点,研究一下它们的定价 GPT-4新的功能 GPT-4可以在对话中使用图像,并…

2023年美赛春季赛 赛题浅析

由于今年各种各样的原因,导致美赛头一次,据说也将是最后一次,临时调整,加设春季赛。这对于急需建模奖项的大家来说是一个很好的机会。无论怎样的原因,今年美赛我们可能有所遗憾。但,春季赛也许就是弥补遗憾…

在不丢失数据的情况下解锁锁定的 Android 手机的 4 种方法

尽管您可以使用指纹解锁手机,但大多数智能手机都需要 PIN 码、图案或字母数字代码作为主密码。如果您有一段时间没有输入手机密码,很容易忘记。正是由于这个原因,即使您打开了指纹解锁,大多数智能手机也会让您每天至少输入一次 PI…

Linux之磁盘分区、挂载

文章目录一、Linux分区●原理介绍●硬盘说明查看所有设备挂载情况挂载的经典案例二、磁盘情况查询基本语法应用实例磁盘情况-工作实用指令一、Linux分区 ●原理介绍 Linux来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,…

【软考五】数据库(做题)

该文章不适合学习数据库,适合考证,遇到实际问题的,不要在这儿浪费时间。切记切记 软考之数据库一、概念数据模型(下午题常考)二、结构数据模型关系模型1、关系模型中基本术语2、关系模型中的关系完整性约束3、关系代数…

SQL Server 数据查询

文章目录前言首先在SQL Server 2008 中新建一个数据库chaxun.在库中建三个表,结构如下表所示,并且录入数据.1.2.(1)在KC表中查询学分低于三分的课程信息,并按课程号升序排列(2)在XS_KC表中按学号分组汇总学生的平均分,并按平均分的降序排列(3)在XS_KC表中…

「文心一言」内测详细使用体验

★观前提示:以下内容仅为内测测试内容,不代表未来正式版如何,或许你认为它与chatgpt仍有不小的差距,或许你认为它目前做的已经不错了,都可以,但是咱们测试体验,只讲述体验,本篇文章不…

【数字图像处理】直方图均衡化

文章目录1. 算法原理2. 算法缺陷及改进2.1 缺陷2.2 改进3. 实现3.1 调包侠版本3.2 自由发挥版本1. 算法原理 直方图均衡化是一种常见的图像增强方法,可以增强图像的对比度。其数学原理如下: 首先,我们需要了解直方图的概念。直方图是对图像…

Bezier Curve 贝塞尔曲线 - 在Unity中实现路径编辑

文章目录简介一阶贝塞尔曲线二阶贝塞尔曲线三阶贝塞尔曲线图形理解 Bezier Curve一阶贝塞尔曲线二阶贝塞尔曲线三阶贝塞尔曲线应用Bezier CurveSimpleBezierCurvePathSimpleBezierCurvePathAlonger简介 贝塞尔曲线(Bezier Curve),又称贝兹曲…