TCP/IP_TCP协议

news2024/9/22 23:32:29

目录

一、TCP协议

1.1 确认应答

1.2 超时重传

1.3 连接管理

1.4 TCP状态

1.5 滑动窗口

1.6 流量控制

1.7 拥塞控制

1.8 延迟应答

1.9 捎带应答

1.10 粘包问题

1.11 异常情况

二、TCP/UDP对比

总结


一、TCP协议

TCP 协议和 UDP 协议是处于传输层的协议。

【TCP协议段格式】

【6位标志位】

1、URG:紧急指针是否有效。

2、ACK:应答报文。

3、PSH:提示接收端应用程序立即从TCP缓冲区中把数据读取走。

4、RST:对端要求重新建立连接。携带 RST 标识的称为复位报文段

5、SYN:请求建立连接。携带 SYN 标识的称为同步报文段

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


1.1 确认应答

TCP 将每个字节的数据都进行了编号。确认应答中,通过应答报文 (ACK报文) 来反馈给发送方,我已经收到哪些数据,下一次你该从哪个位置开始发送。应答报文中的确认序号,是按照发送数据的最后一个字节编号再加 1 来设定的。

注: TCP 的确认应答是确保 TCP 可靠性的最核心机制。


1.2 超时重传

超时重传是确认应答的补充。当发送端发送完数据,然后在一定时间内未收到 ACK 报文,此时发送端就判定出现了 "丢包",就会重新发送数据。但是 "丢包" 可能是数据丢了,也可能是 ACK 报文丢了。 

【数据丢包】

数据在发送给接收端的过程中丢失,此时超时重传就能解决问题。

【ACK丢包】

若是 ACK 报文丢失,可能导致发送两次同样的数据,而为了防止接收两次同样数据的情况出现,TCP socket 在内核中就引入了接收缓冲区,发送端发来的数据会先放入接收缓冲区中,然后接收端读取缓冲区即可获得数据。在读取缓冲区的之前,接收端会依据数据的编号先进行判断,若是发现 "重复数据",直接丢弃

注: 接收缓冲区可以去重,也可以排序。而接收端读取数据时,是按照数据编号连续读取的。


1.3 连接管理

【建立连接】

TCP 协议中的建立连接,又称为 "三次握手"目的让通信双方都能保存对方的相关信息,也是在验证通信双方的发送、接收能力是否正常。"三次握手" 的本质就是通信双方分别给对方发送一个 SYN,并分别响应一个 ACK。

中间两次数据传输都是内核收到 SYN 后立即触发,与应用程序代码无关,触发时机完全一致,故一定可以合并传输。

【断开连接】

断开连接的目的把对端的信息从数据结构中给释放掉。而建立连接后,在通信双方都同意断开连接的情况下,称为 "四次挥手"若是单方面同意,则会有其他方式释放该连接,此时 "四次挥手" 并不适用。"四次挥手" 的本质就是通信双方分别给对方发送一个 FIN,并分别响应一个 ACK。

由于 ACK 的发送是由内核处理,而 FIN 是由应用程序代码触发,触发时间间隔可能比较长,故中间两次数据传输不一定可以合并传输。

【三次握手和四次挥手】

相同点:

        1、通信双方分别给对方发送一个 SYN/FIN,并分别响应一个 ACK。

        2、数据传输的顺序:SYN(FIN) / ACK / SYN(FIN) / ACK。

不同点:

        1、三次握手的中间两次数据传输一定可以合并;四次挥手则不一定

        2、三次握手必须是客户端主动;四次挥手则是服务器与客户端都可以主动


1.4 TCP状态

1、LISTEN:表示服务器已经创建好 severSocket,并绑定好端口号。

2、ESTABLISHED:表示服务器和客户端的连接已经建立。

3、TIME_WAIT:表示本端给对端发送 FIN 后,对端也给本端发送 FIN,此时本端进入 TIME_WAIT。

在四次挥手中,进入 TIME_WAIT 状态为了给最后一个 ACK 的重传留有一定的时间。若不进入 TIME_WAIT 状态,直接将 TCP 连接释放掉,就意味着重传的 FIN 无法被返回 ACK。此时一端没有收到 ACK 就会视为丢包,就会重传 FIN

4、CLOSE_WAIT:表示本端收到对端发送的 FIN,此时需要调用 close 来主动发起 FIN。


1.5 滑动窗口

在确认应答的机制下,每次发送方接收到 ACK 后才会发送下一个数据,这样就导致大量的时间都消耗在等待 ACK 上。此时就引入了滑动窗口,既然一发一收的性能较低,就一次发送多条数据,然后统一等一波 ACK。此时收到一个 ACK 就会发送一次数据

【案例】

第一次批量传输 1~1000 和 1001~2000,然后收到 ACK1001,再发送 2001~3000,以此类推。

【ACK丢包】

若 ACK1001 丢包,但数据 1~1001 未丢,此时也会收到 ACK2001,这意味着 2001 之前的数据(1~2000)都收到了,故 ACK 丢包对于可靠性没有任何影响,无需进行任何处理

【数据丢包】

若数据 1~1000 丢包,此时发送端就会重复收到 ACK1001,发送端连续收到三次 ACK1001后,就会将数据 1~1000 重新发送,而发送端收到 ACK1001 后,下一次就可能收到 ACK3001,这是因为数据 1001~3000 在之前接收端就已经放入内核的接收缓冲区中。这种重传做到了 "针对性",整体的效率没有额外损失,这种机制被称为"快重传"


【确认应答与滑动窗口】

1、短时间内传输大量数据:此时需要通过滑动窗口,按照快重传来保证可靠性,此时判定丢包的标准就是有连续多个相同的 ACK

2、无需传输大量数据:此时按照普通确认应答,按照超时重传来保证可靠性,此时判定丢包的标准就是达到超时时间还没接收到 ACK

所以说,确认应答、超时重传滑动窗口、快重传并不冲突,是同时存在的


1.6 流量控制

接收端处理数据的速度是有限的,如果发送端发的太快,会导致接收缓冲区被打满,此时若发送端继续发送,就会发生丢包。故 TCP 可以根据接收端的处理数据能力,来决定发送端的发送速度,这个机制就叫流量控制

  • 接收端将可以接受的缓冲区大小放入 TCP 首部的 "窗口大小" 字段,通过 ACK 通知发送端。
  • 若接收缓冲区满了,窗口就会置 0,此时发送端不再发送数据,但需要定期发送一个窗口探测,让接收端把窗口大小告诉发送端。

注:TCP 首部的选项中,还有一个参数,窗口扩展因子,实际上真正要设置的窗口大小 = 16位窗口大小 * 2^窗口扩展因子


1.7 拥塞控制

在不清楚网络状态的情况下,贸然发送大量数据,很可能引起堵塞。故 TCP 引入慢启动机制,先发少量的数据探路,摸清当前网络状态,再决定传输速率。每次发送数据报时,将拥塞窗口和接收端反馈的窗口大小作比较,较小值作为实际发送的窗口

【拥塞窗口大小】

1、发送开始时,定义拥塞窗口为 1。

2、若并未出现丢包,此时按照指数增长 (*2)。

3、当达到阈值,指数增长就变为线性增长

4、当增长至引起丢包,就将拥塞窗口重置为较小的值,回到最初的慢启动过程 (重新指数增长),并根据丢包的窗口大小,重新设置阈值


1.8 延迟应答

接收端接收到数据后,不会立即返回 ACK,让接收端应用程序处理一些数据后再返回 ACK,这样就可以让返回的窗口尽可能的大。 

【应答时间】

数量限制:每隔 N 个数据报就应答一次。

时间限制:超过最大延迟时间就应答一次。


1.9 捎带应答

基于延迟应答,接收端收到数据后不会立即返回 ACK,此时就可以把接下来要传输的业务数据和上次的 ACK 合并为一个 TCP 数据报,从而提高传输效率。


1.10 粘包问题

"包" 即 TCP 载荷中的应用数据包,当数据接收到缓冲区中,接收端要读取缓冲区,此时看到的只是一串连续的字节数据,并不清楚从哪到哪是一个完整的应用数据包。为了避免粘包问题,就需要明确两个包之间的边界

1、对于定长的包:保证每次按照固定大小读取即可。

2、对于变长的包:

通过特殊符号,作为分隔符。(任意字符,确保该字符不存在于正式数据中)

 在包开始的位置,约定好整个数据包的长度。


1.11 异常情况

1、进程终止:进程无论是正常结束,或是异常崩溃,都会释放文件描述符,由于 TCP 连接的生命周期比进程更长一些,故尽管进程退出,仍然可以进行四次挥手。

2、机器关机:机器关机就会触发四次挥手,但不一定可以挥完,挥的快,双方都能正确的删除保存的连接信息挥的慢至少也能把第一个 FIN 发送给对端,此时对方返回 ACK 并发送 FIN,但 FIN 不会收到 ACK,进行多次重传后未收到 ACK,就会单方面删除连接

3、机器断电 / 网线断开:突然机器断电或网络断开会导致来不及发送 FIN,此时会有两种情况:

(1) 若断电的是接收端,发送端发现未收到 ACK,进行重传,重传还是没用就会尝试发送 RST(复位报文),若通过 RST 成功复位,则继续通信;若还是不行,则单方面删除连接

(2) 若断电的是发送端,接收端迟迟没有等到数据,这时就会触发 "心跳包" 来检测对方是否存活,若对方没有心跳,则尝试发送 RST,还是不行,则单方面删除连接


二、TCP/UDP对比

TCP:有连接、可靠传输、面向字节流、全双工。

UDP:无连接、不可靠传输、面向数据报、全双工。

  • TCP 用于需要可靠传输的情况,如文件传输。
  • UDP 用于效率要求很高,可靠性要求不高的情况。

注:全双工指可以同时进行信号的双向传输。


总结

1、TCP 的确认应答是确保 TCP 可靠性的最核心机制。

2、接收缓冲区可以去重、排序。接收端读取数据是按照数据编号连续读取的。

3、连接的目的是让通信双方都能保存对方的相关信息。

4、主动断开连接进入 TIME_WAIT,被动断开连接进入 CLOSE_WAIT。

5、滑动窗口可以进行批量传输。

6、流量控制是根据接收端的处理数据能力,来决定发送端的发送速度。

7、每次发送数据报时,将拥塞窗口和接收端反馈的窗口大小作比较,较小值作为实际发送的窗口。

8、延迟应答让窗口尽可能的大,捎带应答基于延迟应答来合并数据。

9、避免粘包问题的核心是明确两个包之间的边界。

10、UDP 相比于 TCP 最大的优势就是传输效率高。

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

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

相关文章

WEB服务器的详解与部署

WEB服务器也称为网页服务器或HTTP服务器 WEB服务器使用的协议是HTTP或HTTPS HTTP协议默认端口号:TCP 80 HTTPS协议默认端口号:TCP 443 浏览器其实就是 HTTP 客户端 WEB服务器发布软件 微软:IIS(可以发布web网站和FTP站点)linux&#x…

Java:多线程(进程线程、线程状态、创建线程、线程操作)

1,线程概述 1.1,进程和线程 并发是指系统能够同时处理多个任务或操作,通常通过在单个处理器或多个处理器之间快速切换上下文来实现。这些任务可能不是同时进行的,但是它们在时间上重叠。 并行是指系统同时执行多个任务或操作&…

tkinter绘制组件(42)——工具栏按钮组件

tkinter绘制组件(42)——工具栏按钮组件 引言布局函数结构背景板创建按钮移动背景板完整代码函数 效果测试代码最终效果 github项目pip下载结语 引言 在TinUI中,并不存在工具栏这个概念,但是可以通过使用BasicTinUI控件&#xff…

第二证券:港股交易规则有哪些?

港股的生意规矩: 1、港股生意时间:港股商场的生意时间分为上午和下午两个时段,上午的生意时间通常是9:30至12:00,而下午的生意时间则是13:00至16:00。需求留心的是,港股在周末及法定节假日会休市,此外恶劣…

ECC加密算法:一种高效且安全的加密技术

ECC(Elliptic Curve Cryptography),即椭圆曲线密码算法,是一种基于椭圆曲线数学理论的公钥加密算法。自1985年由Neal Koblitz和Victor S. Miller分别独立提出以来,ECC凭借其独特的数学原理和高效的性能,逐渐…

【数据结构】大根堆和小根堆

大根堆实现逻辑 从整棵树的最后一颗子树开始调整,每次都让根节点和左右孩子去比较,如果根节点比左右孩子的最大值要小,那么就将这两个值进行交换,然后此时这颗子树变成了大根堆,再看下一颗树 然后对下一颗树进行相同…

【大模型框架】【基本结构】transformer

论文地址:https://arxiv.org/pdf/1706.03762 1. 整体结构 2. 内部结构 3. 公式 Transformer工作原理四部曲:Embedding(向量化)、Attention(注意力机制)、MLPs(多层感知机)和Unembedding(模型输出)。

域名过期了网站还能访问吗?怎么查询域名过期?

在当今数字化的时代,网站已经成为企业、个人展示形象和提供服务的重要窗口。而域名作为网站的标识,其重要性不言而喻。然而,域名是有一定有效期的,那么当域名过期了,网站还能访问吗?又该如何查询域名的过期…

Mysql的事务隔离级别实现原理

一、事务隔离级别 mysql支持四种事务隔离级别: 读未提交:一个事务可以读取到另一个事务还未提交的数据;读已提交:一个事务可以读取到另一个事务已经提交的数据;可重复读:同一个事务中,无论读取…

【C语言】数组和函数实践:扫雷游戏

扫雷游戏 1. 扫雷游戏分析和设计1.1 扫雷游戏的功能说明1.2 游戏的分析和设计1.2.1 数据结构的分析1.2.2 ⽂件结构设计 2. 扫雷游戏的代码实现(1)菜单menu函数(2)设计main函数(3)设计game函数(4…

免费分享:2013中国沙漠(沙地)分布数据集(附下载方法)

沙漠是指地面完全被沙所覆盖、植物非常稀少、雨水稀少、空气干燥的荒芜地区。沙漠亦作“沙幕”,干旱缺水,植物稀少的地区,通常为风成地貌。中国是世界上沙漠面积较大、分布较广、沙漠化危害严重的国家之一,因此我国十分注重防沙治…

发布Meta Segment Anything Model 2 (SAM 2):开启图像和视频分割的新时代

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

DiffusionModel-latent diffusion,VAE,U-Net,Text-encoder

Diffusers StableDdiffusion Latent Diffusion 稳定扩散(Stable Diffusion)模型中使用的三个关键组件:自编码器(VAE)、U-Net和文本编码器(Text-encoder) 由于潜在扩散模型的U-Net操作在低维空…

掌握FluentResults:.NET中优雅处理结果与错误

在.NET开发中,结果和错误处理是构建健壯应用程序的关键部分。FluentResults是一个.NET库,它提供了一种优雅的方式来处理操作结果和错误。它允许开发者以声明性和链式调用的方式构建结果对象,使得代码更加清晰和易于维护。本文将介绍FluentRes…

云原生大数据平台KDP,实战疑难问题解答

智领云的KDP(Kubernetes Data Platform)是一款自主研发的容器化云原生大数据平台,它是市场上首个能够完全在Kubernetes上部署的大数据平台。KDP深度整合了云原生架构的优势,解决了传统Hadoop大数据平台在架构限制、部署、运维、运…

ctfshow~菜狗杯 flag一分为二

第一步:解压附件得到miku.png文件 第二步:修改图片高度出现一半的flag 第三步:使用盲水印提取工具得到另一半工具 ctfshow{FirstPRTSecondPrTMikumiku~}

认识systemctl

1: 概述 systemctl命令可以帮助systemd管理和维护所有服务,系统启动完成后,systemctl命令会向systemd发送消息进行服务启动和停止等操作,想知道为什么systemctl命令可以向systemd传递消息吗,其实它是通过一个叫D_Bus(desktop bus)桌面总线的东西实现这一点,它可以并行的处理多…

劝你先别更新!!最新Stable Diffusion WebUI 1.10已来!WebUI终于支持SD3大模型了!你跑起来了么?

你的SD3大模型在SD WebUI1.10.0中跑起来了么? 今天发现Stable Diffusion WebUI于昨日推出了最新SD WebUI1.10.0 版本。令人比较兴奋的是该版本支持了SD3大模型,同时也新增了DDIM CFG采样器。主要更新内容如下: 最新版本地址: 更新…

跨境电商TikTok达人合作策略:驱动口碑传播,助力经济增长

通过与TikTok达人的深度合作,跨境电商不仅能够有效提升品牌曝光度和销售额,还能激发用户的口碑传播,形成强大的“口碑经济”效应。本文Nox聚星将和大家分析这种合作模式如何引发口碑经济效应,并探讨如何通过优化合作策略&#xff…