关于tcp协议

目录

前言:

一、TCP协议的基本概念:

二、TCP协议的主要特点:

2.1面向连接:

2.2可靠传输:

2.3基于字节流:

三、TCP连接的建立与终止:

3.1连接建立:

3.1.1SYN:

3.1.2SYN-ACK:

3.1.3ACK:

 3.2图像解释:

3.2.1tcp服务器先创建传输控制块(TCB):

3.2.2tcp客户端进程也创建传输控制块

3.2.3tcp服务器收到请求报文后

3.2.4tcp客户端收到确认后,还要向服务器给出确认

3.2.5双方能够通信:

3.2.6 这里相信也有小伙伴也有疑问为什么tcp客户端最后还要发出一次确认?其实主要防止已经失效的连接请求报文又传送到了服务器,从而产生错误

3.3连接终止:

3.3.1FIN:

3.3.2ACK:

3.3.3FIN:

3.3.4ACK:

​编辑 3.4图像解释:为了更好的帮助大家理解这是对这个图的解读:

3.4.1:连接释放报文,并且停止发送数据:

3.4.2收到连接释放报文,发出确认报文:

3.4.3客户端收到服务器的确认请求:

3.4.4发送完最后的数据,就向客户端发出连接释放:

3.4.5收到服务器的连接释放,等待2msl进入closed状态:

3.4.6服务器只要收到客户端的确认,立即进入CLOSED状态.3.4.7到了这里我猜细心的小伙伴肯定发现了什么?确实,它为什么还有等待2msl

四、TCP协议的工作原理:

五、TCP协议的应用场景:

结语:


前言:


前面我们已经讲了关于网络编程的一些基本的知识,现在我们开始了前面提到的关于TCP协议的学习。由于TCP协议可能会有一点难,不过我尽量去把这个知识点给讲清楚,当然我也借鉴了其他优秀博主的作品,大部分的内容都是来源于网上。这些都是我个人学习的一些总结,希望大家多多鼓励我,也欢迎大家指出我文章还存在的问题,欢迎大家的斧正。

一、TCP协议的基本概念:


TCP(传输控制协议)是计算机网络中的一种通信协议,它位于OSI模型的传输层。TCP协议的主要目的是提供可靠的数据传输服务,确保数据在发送方和接收方之间能够完整、有序地传输。

二、TCP协议的主要特点:


2.1面向连接:


在数据传输之前,TCP协议需要建立一条连接。这条连接在数据传输完毕后会被释放,确保数据传输的可靠性和有序性。

2.2可靠传输:


TCP协议通过一系列机制(如确认、重传等)确保数据的可靠传输。如果数据在传输过程中丢失或损坏,TCP协议会要求重新传输。

2.3基于字节流:


TCP协议将数据看作是无结构的字节流,不关心数据的具体内容,只负责将数据从发送方传输到接收方。

三、TCP连接的建立与终止:


3.1连接建立:


TCP连接的建立过程通常被称为“三次握手”。在这个过程中,发送方和接收方通过交换特定的报文段来建立连接。这是为了确保双方都已准备好进行数据传输。具体过程如下:

3.1.1SYN:


客户端发送一个SYN报文段(SYN=1)给服务器,询问服务器是否打开并准备好接受数据。这个报文段中包含一个随机的初始序列号(ISN)。

3.1.2SYN-ACK:


服务器收到SYN报文段后,如果同意连接,则发送一个应答。这个应答中,服务器首先发送一个ACK报文段(ACK=1)确认客户端的SYN,同时也发送一个自己的SYN报文段,其中包含服务器的初始序列号。

3.1.3ACK:


客户端收到服务器的SYN+ACK报文段后,发送一个ACK报文段确认服务器的SYN。此时,连接建立完成,双方可以开始传输数据。

而这三次握手的过程确保了双方都已准备好进行数据传输,并且双方都知道对方的初始序列号,以便在后续的数据传输中进行确认和重传。

最开始客户端和服务器都是出于关闭的状态,主动打开连接的是客户端,被动打开连接的是服务器.

 3.2图像解释:


为了更好的帮助大家理解这是对这个图的解读:

3.2.1tcp服务器先创建传输控制块(TCB):


tcp服务器先创建传输控制块(TCB),时刻准备接收客户端进程的连接请求,此时服务器进入listen状态

3.2.2tcp客户端进程也创建传输控制块


tcp客户端进程也创建传输控制块,然后向服务器发出连接请求报文,报文首部位SYN=1,同时选择一个初识序列号seq=x,此时,tcp客户端进入SYN-SEND(同步已发送)状态.

3.2.3tcp服务器收到请求报文后


tcp服务器收到请求报文后,如果同意连接,则发出确认报文,确认ACK=1,SYN=1,确认号是ack=x+1,同时自己也要消耗掉序列号seq=y,此时tcp服务器进程就进入SYN-RECV(同步收到)状态.

3.2.4tcp客户端收到确认后,还要向服务器给出确认


tcp客户端收到确认后,还要向服务器给出确认.确认报文ACK=1,确认号ack=y+1,自己的序列号为seq=x+1.此时,tcp建立连接,客户端进入ESTABLISHED(已建立连接)状态.这个时候可以携带数据了,但是如果不携带数据,也要消耗序号

3.2.5双方能够通信:


当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就能通信

3.2.6 这里相信也有小伙伴也有疑问为什么tcp客户端最后还要发出一次确认?
其实主要防止已经失效的连接请求报文又传送到了服务器,从而产生错误

如果使用两次握手,客户端发送的第一次请求可能没被接收到,那么客户端会发送第二次,如果是两次就能建立连接,服务器收到第二次就会发送确认就能够产生连接.但是如果第一次又成功的发送给了服务器,服务器如果又确认了,那么将会产生第二次连接,这是不必要的.

如果是三次握手,就算第一次的报文传过来了,服务器确认,但是客户端不会确认,然后服务器没有收到客户端的确认就知道客户端没有要连接,连接就不会产生

3.3连接终止:


数据传输完毕后,TCP连接需要被终止,也被称为是四次挥手。连接终止的过程通常包括发送FIN报文段和等待确认等步骤。当数据传输完成后,TCP连接需要被中止。这个过程通常被称为“四次挥手”,因为需要四个报文段来完成连接的终止。具体过程如下:

3.3.1FIN:

数据传输结束后,客户端发送一个FIN报文段给服务器,表示客户端没有数据要发送了,要求关闭连接。

3.3.2ACK:

服务器收到客户端的FIN报文段后,发送一个ACK报文段确认收到客户端的FIN。此时,服务器到客户端的连接关闭,但服务器还可以继续发送数据。

3.3.3FIN:

当服务器也没有数据要发送时,服务器发送一个FIN报文段给客户端,表示服务器也没有数据要发送了,要求关闭连接。

3.3.4ACK:

客户端收到服务器的FIN报文段后,发送一个ACK报文段确认收到服务器的FIN。此时,客户端到服务器的连接也关闭,连接完全终止。


 3.4图像解释:
为了更好的帮助大家理解这是对这个图的解读:

3.4.1:连接释放报文,并且停止发送数据:


客户端发出连接释放报文,并且停止发送数据,释放数据报文首部FIN=1,序列化为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时客户端进入FIN-WAIT1(终止等待1),不能携带数据

3.4.2收到连接释放报文,发出确认报文:


服务器收到连接释放报文,发出确认报文ACK=1,ack=u+1,并且携带自己的序号seq=v+1,此时服务端进入CLOSE-WAIT(关闭等待).客户端没有数据要发送了,但是服务器如果还有数据,客户端依然要接受.

3.4.3客户端收到服务器的确认请求:


客户端收到服务器的确认请求后,进入FIN-WAIT-2(终止等待2),等服务器发出剩下的数据

3.4.4发送完最后的数据,就向客户端发出连接释放:


服务器发送完最后的数据,就向客户端发出连接释放,FIN=1,ack=u+1,因为之前可能发送了一些剩下的数据,假设序号为seq=w,此时,服务器就进入了LAST-ACK(最后确认),等待客户端的确认

3.4.5收到服务器的连接释放,等待2msl进入closed状态:


客户端收到服务器的连接释放,必须发出确认,ACK=1,ack=w+1,自己的序号为seq=u+1,此后,客户端进入TIME-WAIT(时间等待).必须经过2*MSL(最长报文段寿命)的时间后,才会进入CLOSED状态

3.4.6服务器只要收到客户端的确认,立即进入CLOSED状态.
3.4.7到了这里我猜细心的小伙伴肯定发现了什么?
确实,它为什么还有等待2msl

首先是保证客户端发送的最后一次确认报文能够到达服务器.因为这个报文可能会丢失,如果在这段时间内,服务器没有收到确认,将会再次发出连接释放,所以客户端收到再次的连接释放就会知道服务器没有收到确认,于是重新发送确认给服务器,重启这个时间.

其次是为了防止已经失效的报文出现,在这个时间内,可以使本次连接中所有产生的报文都从网络中消失.

四、TCP协议的工作原理:


TCP协议通过一系列机制实现可靠的数据传输。这些机制包括序列号、确认号、滑动窗口等。序列号用于标识每个字节在数据流中的位置,确认号用于确认已接收到的数据。滑动窗口机制则用于控制数据的发送速率,防止发送方过快地发送数据导致接收方无法处理。

五、TCP协议的应用场景:


TCP协议广泛应用于需要可靠数据传输的场景中,如文件传输、网页浏览等。在这些场景中,数据的完整性和有序性至关重要,因此需要使用TCP协议来确保数据的可靠传输。

结语:


总结来说,TCP协议是一种面向连接的、可靠的传输层通信协议。它通过一系列机制实现数据的可靠传输和有序性保证,广泛应用于各种需要可靠数据传输的场景中。关于TCP协议其实有很多用处在我们使用网络的时候。关于这个TCP协议的内容我就先分享到这里了,如果说的有问题欢迎大家的斧正,也欢迎大家在评论区和谐讨论。

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

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

相关文章

Linux系统部署Swagger Editor结合内网穿透实现公网管理本地接口文档

文章目录 Swagger Editor本地接口文档公网远程访问1. 部署Swagger Editor2. Linux安装Cpolar3. 配置Swagger Editor公网地址4. 远程访问Swagger Editor5. 固定Swagger Editor公网地址 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站&#xf…

保护IP地址安全:维护网络安全

在今天的数字化时代,IP地址是互联网通信的基础,也是网络安全的重要组成部分。保护IP地址安全至关重要,因为恶意攻击者可能利用IP地址进行网络入侵、数据泄露、服务拒绝等攻击。因此,制定有效的保护措施,维护IP地址的安…

【C++进阶】C++关联式容器map和set用法详解

map和set用法详解 一,关联式容器二,键值对pair三,set1. set的用法2. multiset的用法 四,map1. 键值对pair的介绍2. map用法3. multimap用法 五,总结 上一节我们讲解了二叉搜索树,在讲解之前我们先来讲一下s…

Redis实现分布式锁源码分析

为什么使用分布式锁 单机环境并发时,使用synchronized或lock接口可以保证线程安全,但它们是jvm层面的锁,分布式环境并发时,100个并发的线程可能来自10个服务节点,那就是跨jvm了。 简单分布式锁实现 SETNX 格式&…

柚见第十期(后端队伍接口详细设计)

创建队伍 用户可以 创建 一个队伍,设置队伍的人数、队伍名称(标题)、描述、超时时间 P0 队长、剩余的人数 聊天? 公开 或 private 或加密 信息流中不展示已过期的队伍 请求参数是否为空?是否登录,未登录不…

力扣每日一题 合并后数组中的最大元素 贪心

Problem: 2789. 合并后数组中的最大元素 思路 贪心:从右向左合并,尽可能的多合并,直到不能合并,更新答案,找前一阶段的最大合并值 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) Code …

Umi - 刷新后页面报404

Umi 项目本地运行刷新没问题,但是部署之后刷新页面报404。因为Umi 默认是用 browser 模式,需要做一下处理。 以下是官方给出解决方案。 一、解决方案 1. 方案一:改用hashHistory .umirc.js {history: { type: hash }, }这个方案项目打包…

如何从任何文档生成指令数据集以进行LLM微调

使用轻量级库经济地生成高质量的合成数据集 大型语言模型 (LLMs) 是功能强大的通用工具,但它们通常缺乏特定于领域的知识,这些知识通常存储在企业存储库中。 使用您自己的数据微调自定义LLM可以弥合这一差距,而数据准…

如何在Linux部署Docker Registry本地镜像仓库并实现无公网IP远程连接

文章目录 1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址 Docker Registry 本地镜像仓库,简单几步结合cpolar内网穿透工具实现远程pull or push (拉取和推送)…

子查询 封装属性创建Connection连接类 数据库连接池

子查询 在select语句中包含另一个select 语句 -->子查询 子查询的分类 单行单列子查询 在where子句中使用 运算符 ! > < -- 查询工资比公司平均工资高的员工信息 -- 查询与员工’smith‘同职位的员工信息 -- 查询比员工joins入职…

八数码(C++)

原题在这里P1379 八数码难题 思路&#xff1a; 本题的思路很有意思&#xff0c;首先我们知道0是可以和上下左右交换位置的&#xff08;前提是不出边界&#xff09; 不难看出我们可以把这个二维数组给转化为一个相对应的字符串来表示当前的状态&#xff0c;每进行一次&#xff…

wxss和css的区别

目录 1. 语法差异 2. 尺寸单位 3. 样式导入 WXSS 示例代码&#xff1a; CSS 示例代码&#xff1a; 4. 组件和属性的支持 总结 WXSS (WeiXin Style Sheets) 和 CSS (Cascading Style Sheets) 都是用于描述文档样式的语言&#xff0c;但它们在微信小程序和网页开发中有一些…