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

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四次挥手过程是保证连接可靠性、数据完整性和安全性的重要步骤,是网络通信中必不可少的一部分。

 

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

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

相关文章

再学C语言49:C库中的字符串函数

C库提供了很多处理字符串的函数&#xff1b;ANSI C用头文件 string.h 给出这些函数的原型 一、strlen()函数 功能&#xff1a;计算并返回字符串长度 示例代码&#xff1a; /* test strlen() function */ #include <stdio.h> #include <string.h>int main(void)…

数据的存储--->【大小端字节序】(Big Endian)(Little Endian)

⛩️博主主页&#xff1a;威化小餅干&#x1f4dd;系列专栏&#xff1a;【C语言】藏宝图&#x1f38f; ✨绳锯⽊断&#xff0c;⽔滴⽯穿&#xff01;一个编程爱好者的学习记录!✨前言计算机硬件有两种存储数据的方式&#xff1a;大端字节序——Big Endian小端字节序——Little …

【Python】【进阶篇】十、Python爬虫的Requests库

目录十、Python爬虫的Requests库10.1 常用请求方法10.1.1 requests.get()10.1.2 requests.post()10.2 对象属性10.3 Requests库应用十、Python爬虫的Requests库 Python 提供了多个用来编写爬虫程序的库&#xff0c;除了前面已经介绍的 urllib 库之外&#xff0c;还有一个很重的…

vue尚品汇商城项目-day07【44.个人中心二级路由搭建+45.我的订单+46.优化登录跳转+47.独享守卫】

文章目录44.个人中心二级路由搭建45.我的订单46.优化登录跳转47.独享守卫本人其他相关文章链接44.个人中心二级路由搭建 修改代码&#xff1a; 将Center拆分为2个组件MyOrderGroupOrder src/router/routes.js import Center from /pages/Center import GroupOrder from /pages…

QT 常见控件使用

1. QLineEdit 添加控件后&#xff0c;可以编辑控件的名称&#xff0c;然后使用名称获取和设置值 QString qstrValue ui->strName->text(); QMessageBox::information(this, "提示", qstrValue); 2.窗体导航切换 添加新的对话框&#xff0c;然后引入头文件…

游戏安全漏洞一些分享

安全界对漏洞的定义为&#xff1a;在硬件、软件、系统等具体实现或者系统安全策略上存在的缺陷&#xff0c;从而使攻击者能够达到于某种破坏效果。游戏安全漏洞属于常规漏洞的子类&#xff0c;常规漏洞的分类如下图所示&#xff1a; 通过以上的漏洞分类图可知游戏漏洞属于常规…

MATLAB | 如何绘制github同款日历热力图

应粉丝要求&#xff0c;出一个类似于github热图的日历热力图&#xff0c;大概长这样&#xff1a; 依旧工具函数放在文末&#xff0c;如有bug请反馈并去gitee下载更新版。 使用教程 使用方式有以下几种会慢慢讲到&#xff1a; heatmapDT(Year,T,V)heatmapDT(Year,T,V,MonLim)h…

被称为“眼黄金”的叶黄素究竟是什么?叶黄素则能过滤蓝光

人眼视觉依赖于黄斑的中心凹陷。黄斑中含有大量的叶黄素&#xff0c;因此被称为“黄斑”。叶黄素&#xff0c;也被称为“眼黄金”&#xff0c;是人类视网膜中最重要的营养物质。它含有黄斑&#xff08;视觉中心&#xff09;和晶状体&#xff0c;特别是黄斑中含有高浓度的叶黄素…

外部中断实验

基础知识及实验目标 目标&#xff1a;通过中断来实现按键对小灯的控制。 WK_UP 翻转小灯&#xff1b; KEY 1控制 DS1按一次亮&#xff0c;再按一次灭&#xff1b;KEY 0控制DS0&#xff0c;按一次亮&#xff0c;再按一次灭。 触发中断的意思就是&#xff1a;当这个IO口达到触发…

MathType公式使用技巧汇总——Mathtype怎么在word中编辑公式?论文中公式有哪技巧?有哪些注意事项?论文中的公式怎么写?

文章目录1 Mathtype安装2 word 段落间插入公式3 文字间嵌入&#xff08;内联&#xff09;公式4 公式修改5 不要使用键盘上的括号等符号5.1 键盘上符号引发的问题5.2 正确的符号使用方法6 常用设置6. 1公式字体大小设置6.2 公式样式设置7 公式标号设置8 MathType怎么设置下一章公…

ESP-C3入门18. 低功耗蓝牙SPP Server端功能测试

ESP-C3入门18. 低功耗蓝牙SPP Server端功能测试一、功能简介1. GATT2. SPP3. SPP Server和 SPP Client二、 SPP Server开发步骤1. 启动 GATT Server2. SPP 任务初始化3. 注册 SPP应用程序4. UART 初始化5. UART 事件处理程序二、完整程序1. 代码和注释2. 运行方法一、功能简介 …

【SQL 必知必会】- 第八课 使用函数处理数据

目录 函数 函数带来的问题 可移植&#xff08;portable&#xff09; 是否应该使用函数&#xff1f; 使用函数 文本处理函数 SOUNDEX 支持 日期和时间处理函数 数值处理函数 函数 函数带来的问题 与几乎所有DBMS 都等同地支持SQL 语句&#xff08;如SELECT&#xff09;不同&am…

Selenium Web UI 自动化分布式运行:SeleniumGrid

简介&#xff1a;Selenium Grid是selenium的三大组件之一&#xff0c;它允许Selenium-RC针对规模庞大的测试案例集或者需要在不同环境中运行的测试案例集进行扩展。通过将客户端命令发送到远程浏览器的实例, Selenium Grid 允许在远程计算机 (虚拟或真实) 上执行WebDriver脚本.…

2016蓝桥杯C/C++B组

剪邮票 解题思路&#xff1a;做法很多&#xff0c;dx[], dy[]做出来不对&#xff0c;4*4 会出现16个方向重复了&#xff0c;只有四个方向要注意。 然后又看到网上的另一个做法使用全排列&#xff0c;用{1, 1 ,1,1,1 ,0&#xff0c;0&#xff0c;0&#xff0c;0}五个1&#xf…

Web漏洞-RCE代码及命令执行漏洞全解-web漏洞产生的原理及条件-墨者靶场详解

目录 一、导图 二、RCE漏洞简介 三、代码执行漏洞示例 四、命令执行漏洞示例 五、漏洞的产生条件 <网站原码层面> <网站应用层面> 六、漏洞检测 七、黑盒-应用层面-漏洞实例 八、白盒-代码层面-漏洞实例 九、黑盒-RCE公开漏洞-漏洞实例 十、漏洞产生的…

推箱子小游戏

文章目录一、 介绍二、 制作墙壁、地面三、 制作箱子四、 制作终点五、 制作人物移动六、 推箱子关键触发机制七、 终点设置八、 关卡切换设置九、 协程十、 下载一、 介绍 2D推箱子游戏是一种益智类游戏&#xff0c;玩家需要控制角色将箱子推到指定的位置&#xff0c;以完成关…

[Latex]特殊符号和花式字体

特殊符号 正体希腊字母 大写效果小写效果大写效果小写效果异体效果$\Alpha$A\AlphaA$\alpha$α\alphaα$\Beta$B\BetaB$\beta$β\betaβ\Gamma$Γ\GammaΓ$\gamma$γ\gammaγ$Delta$Δ\DeltaΔ$\delta$δ\deltaδ$\Zeta$Z\ZetaZ$\zeta$ζ\zetaζ$Epsilon$E\EpsilonE$\epsilon$…

Qt学习笔记

Qt学习笔记整理&#xff0c;内容主要包含&#xff1a; QT的概述创建QT的项目(hello qt)第一个窗口及窗口属性第一个按钮信号与槽机制带菜单栏的窗口对话框布局常见的控件QT消息机制以及事件绘图与绘图设备 笔记整理时间&#xff1a;2023年3月24日~2023年3月29日 代码仓库&#…

录音文件如何转换成文字文件?

当今社会&#xff0c;录音文件转换成文字文件的需求越来越多&#xff0c;例如会议记录、采访笔录、讲座笔记等。但是&#xff0c;手动逐词逐句转录录音文件费时费力&#xff0c;尤其是文件较大的情况下&#xff0c;会给人带来很大的烦恼。因此&#xff0c;本文将介绍几种常见的…

算法设计-hw2

一、从分治到动态规划 1.1 动态规划的性质 ​ 动态规划具有以下三个明显特性&#xff1a; 无后效性&#xff1a;如果给定某一阶段的状态&#xff0c;则在这一阶段以后过程的发展不受这阶段以前各段状态的影响。如果说的直白一些&#xff0c;就是当我们求出 dpidp_idpi​ 的时…