当前位置: 首页 > article >正文

TCP(上):成熟可靠的传输层协议

欢迎浏览高耳机的博客

希望我们彼此都有更好的收获

感谢三连支持!  

        TCP(传输控制协议)是位于传输层的通信协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。主要负责在不可靠的网络环境中提供可靠的端到端字节流传输服务。TCP是互联网协议套件的核心组成部分,它为应用程序提供了一种可靠的数据传输服务,确保数据在不同网络设备间正确、完整地传输。   

        深入探讨TCP,有几个核心概念和机制是不可忽视的。包括TCP的三次握手和四次挥手过程,它们在网络通信中扮演着至关重要的角色。除此之外,还有滑动窗口、拥塞窗口、捎带应答、延迟应答以及粘包等问题,这些都是TCP协议的关键组成部分。

        由于篇幅限制,我们将在后续的文章“TCP(下)”中详细探讨这些高级主题。在本文中,我们将针对TCP的特性,报文结构,连接过程以及相对于其他协议的区别进行探讨👍,为读者提供一个初步的理解和概览。

目录

TCP协议的特性

TCP报文结构

TCP核心机制

确认应答:

超时重传:

​ TCP与UDP 


TCP协议的特性

1. 面向连接:

        🙉TCP在数据传输前需要建立连接,通过三次握手来同步连接双方的序列号和确认号,确保数据传输的可靠性。

2. 可靠传输:

        🙈TCP通过序列号、确认应答、超时重发、连接管理等机制确保数据的可靠传输。

3.面向字节流:

        🙊TCP作为面向字节流的协议,意味着数据在发送端被切割成字节流并在接收端按照相同的字节顺序重组。这里的“字节流”指的是一串没有特定边界或大小的字节序列。TCP对于传输的数据并不关心消息的含义或结构,它仅仅关心数据的传输顺序和完整性。

4.全双工:

        🐵全双工通信意味着数据可以在两个方向上同时进行传输,即在发送数据的同时也能够接收数据,两者同步进行。这类似于我们打电话时既能说话也能同时听到对方的声音。这种通信方式提高了数据传输的效率,因为它不需要等待一方发送完毕后另一方才能开始发送.

5. 流量控制:

        🙉TCP使用滑动窗口机制来控制发送方的发送速率,根据接收方的处理能力调整窗口大小,防止接收方缓冲区溢出。

6. 拥塞控制:

        🙈TCP通过慢启动、拥塞避免、快速重传等算法动态调整发送窗口大小,避免网络拥塞。

7. 有序性:

        🙊TCP为发送的每个字节都分配一个序列号,接收方根据序列号对数据包进行排序,保证数据的有序性。

8. 端到端:

        🐵TCP提供端到端的通信,即数据从发送端直接传输到接收端,中间不需要存储和转换。

TCP报文结构

1. 源端口和目的端口(各16位)

🙉标识发送和接收的应用程序。

2. 序列号(32位)

🙈标识从TCP源到目的端发送的字节流的每个字节。

3. 确认号(32位)

🙊期望收到的下一个序列号,用于确认收到的数据。

4. TCP报头长度

🐵对TCP来说,报头长度是可变的,这里的单位是 '4字节' 而不是 '字节'!

5. 保留(6位)

🙉相较于UDP的固定长度做出了改进,即使当前没有需求,也可为了将来的使用保留。

6. 标志位

🙈这几个标志位,和TCP的核心操作密切相关:

URG:紧急指针是否有效

ACK:确认号是否有效

PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走

RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段

SYN:请求建立连接;我们把携带SYN标识的称为同步报文段

FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段

7. 窗口大小(16位)

🙊用于流量控制,指示接收端能够接受的未被确认的数据量。

8. 校验和(16位)

🐵用于错误检测,包括TCP头部、数据和一些伪头部。

9. 紧急指针(16位)

🙉只有当URG标志位被设置时才有意义,指示紧急数据的结束位置。

10. 选项(可变长)

🙈包括最大报文段尺寸(MSS)、窗口扩大因子、时间戳等。

11. 填充(可变长)

🙊确保TCP头部是32位字的整数倍。

 

TCP核心机制

确认应答

        在TCP协议中,接收方在收到数据包后,会发送一个确认应答(ACK)给发送方,以告知数据包已经成功接收。这个确认应答包含一个序列号,表明接收方期望接收的下一个数据包的序列号。如果发送方在一定时间内没有收到确认应答,它会认为数据包在传输过程中丢失,从而触发超时重传机制。

 

TCP将每个字节的数据都进行了编号,即为序列号

 每一个ACK都带有对应的确认序列号,意在告知发送者已经接收了哪些数据,下一次该从哪里开始发送.

超时重传

        当发送方发送一个数据包后,它会启动一个计时器等待接收方的确认应答。如果在设定的超时时间内没有收到确认应答,发送方会认为数据包丢失,并将该数据包重新发送。这个超时时间通常是基于网络的往返时间(RTT)来动态调整的,以适应网络条件的变化。

主机A发送数据给主机B后,可能因为网络拥堵等原因,数据无法到达主机B.

如果主机A在一个特定的时间间隔内没有收到主机B发来的确认应答,就会进行重新发送.

但是,主机A没有收到主机B的确认应答,也有可能是因为ACK丢失了.

因此,主机B会收到很多重复数据。那么TCP协议需要能够识别出那些包是重复的包,并且把重复的丢弃掉。 这时候我们可以利用前面提到的序列号,就可以很容易做到去重的效果。 那么,如果超时的时间如何确定?

  • 最理想的情况下,找到一个最小的时间,保证“确认应答一定能在这个时间内返回”。
  • 但是这个时间的长短,随着网络环境的不同,是有差异的。
  • 如果超时时间设的太长,会影响整体的重传效率;
  • 如果超时时间设的太短,有可能会频繁发送重复的包; TCP为了保证无论在任何环境下都能比较高性能的通信,因此会动态计算这个最大超时时间。
  • Linux中(BSD Unix和Windows也是如此),超时以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。
  • 如果重发一次之后,仍然得不到应答,等待2*500ms后再进行重传。
  • 如果仍然得不到应答,等待4*500ms进行重传。依次类推,以指数形式递增。
  • 累计到一定的重传次数,TCP认为网络或者对端主机出现异常,强制关闭连接。

 TCP与UDP 

TCP与UDP都是主要的传输层协议,我们来对比一下

🐵连接性:

        TCP是面向连接的协议,需要在数据传输前建立连接,通过三次握手过程。

        UDP是无连接的协议,数据传输前不需要建立连接,直接发送数据。

🙊可靠性:

        TCP提供可靠的数据传输服务,包括数据包确认、超时重传、数据排序和错误检测。

        UDP不提供可靠性保证,数据包可能会丢失、重复或乱序到达。

🙈速度:

        TCP由于需要确认和重传机制,速度通常比UDP慢。

        UDP由于没有这些额外的机制,速度通常比TCP快。

🙉开销:

        TCP由于需要维护连接状态和序号,协议开销较大。

        UDP协议开销较小,只包含最基本的头部信息。

🙉流量控制:

        TCP提供流量控制机制,防止发送方过快发送数据导致接收方处理不过来。

        UDP不提供流量控制。

🙈拥塞控制:

        TCP提供拥塞控制机制,根据网络状况调整发送速率。

        UDP不提供拥塞控制。


        本篇博客,我们了解了TCP的基本特性,报文结构还有部分核心机制,那么下一篇,我们将深入探讨TCP,包括TCP的三次握手和四次挥手过程,还有滑动窗口、拥塞窗口、捎带应答、延迟应答以及粘包等问题,这些都是TCP协议的关键组成部分。

 

希望这篇博客能为你理解TCP及网络提供一些帮助

如有不足之处请多多指出

我是高耳机


http://www.kler.cn/a/392402.html

相关文章:

  • pthread_mutex_lock的概念和使用案例
  • `we_chat_union_id IS NOT NULL` 和 `we_chat_union_id != ‘‘` 这两个条件之间的区别
  • Hive分区再分桶表
  • 雷池 WAF 搭配阿里云 CDN 使用教程
  • SpringBoot学习
  • 欧拉计划启航篇(一)
  • MySQL中指定字段的某个值排在前面
  • PET-文件包含-FINISHED
  • LeetCode每日一题1547---切棍子的最小成本
  • [Docker#6] 镜像 | 常用命令 | 迁移镜像 | 压缩与共享
  • ElegantRL:高效、稳定的深度强化学习开源框架
  • 力扣872:叶子相似的树
  • 架构师考试 五大架构风格
  • Diffusion Policy——斯坦福机器人UMI所用的扩散策略:从原理到其编码实现(含Diff-Control、ControlNet详解)
  • Android 默认科大讯飞语音包 即 默认文字转语音TTS包
  • 借助Aapose.Cells ,在 Node.js 中将 Excel 转换为 JSON
  • Linux基础(十四)——BASH
  • 使用 Web Search 插件扩展 GitHub Copilot 问答
  • AST反混淆
  • 2024 年Postman 如何安装汉化中文版?
  • 小皮PHP连接数据库提示could not find driver
  • 【MySQL】MySQL中的函数之REGEXP_SUBSTR
  • spring使用xml文件整合事务+druid+mybatis
  • 【 ElementUI 组件Steps 步骤条使用新手详细教程】
  • MySql--多表查询及聚合函数总结
  • Java项目实战II基于微信小程序的童装商城(开发文档+数据库+源码)