本篇会加入个人的所谓鱼式疯言
❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言
而是理解过并总结出来通俗易懂的大白话,
小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.
🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!
引言
在当今数字化时代,我们几乎无时无刻不在与网络进行交互。无论是在线购物、视频会议还是简单的社交媒体浏览,网络通信的可靠性对我们的日常生活至关重要。
然而,你是否曾经想过,是什么确保了这些数据在跨越千山万水的网络传输中不丢失、不出错?这就是TCP——传输控制协议——的神奇之处。本文将深入探讨TCP如何通过其独特的机制实现数据的可靠传输,确保我们的网络体验既流畅又安全。 💞 💞 💞 💞
目录
-
Tcp的结构初识及可靠传输
-
Tcp的确认应答机制
-
Tcp的超时重传机制
一. Tcp的可靠传输
1. Tcp的结构初识
看到上面的Tcp报文结构图, 源端口和目的端口在Udp, 以及检验和在Udp的报文结构中已经有讲解过了, 还不理解的小伙伴可以在去回顾一下哦 💞💞💞💞
这次主要是初步了解下,Tcp的报头长度(头长度),== 序号和确认序号(下面细讲)== , 窗口大小(后面细讲)
。
2.Tcp的报头长度(头长度)
对于Tcp来说, Tcp的头长度 规定为 4个字节
, 注意是 字节不是比特位 。
但是和
Udp不同
的是 , Udp 八个字节 的长度是固定的
, Tcp 的 四个字节长度 是可变的
, 因为在 Tcp的报头中还加了一个保留位
的扩展空间。
如果需要传递的网络数据 很多很大 的话, 就可以利用Tcp保留位中 扩展出来的空间 进行传输, 就可以减少出现
数据溢出
的现象, 达到扩容
的效果 。
3. 可靠传输
小伙伴应该还不会忘记Tcp 主要有四个特点:
有连接, 可靠传输 , 面向字节流
, 全双工
。
其中 有连接 , 面向字节流 , 全双工 这三个特点在 实现Tcp 的回显服务器 的实现中已经体现出其特点了。
而最后一个: 可靠传输 将在本文中, 详细的讲解背后的 机制原理 。
在 Tcp的可靠传输中, 小编曾经讲过, 可靠传输 , 并不是说 百分百 的传输成功, 而是尽可能的使数据有效的传输。
通过以下两个方式能使数据更 有效准确 的传输:
让发送方确认接收方是否接收 到发送方传输过来的数据 !
如果接收方没有收到, 将 等待一段时间进行重传 !
而上面的两种方式就对应着 Tcp的两种传输机制 :
-
确认应答
-
超时重传
下面进入详解时刻
二. Tcp的确认应答机制
1. 确认应答的流程
如上图, 当主机A 给主机 传输 一段数据 。
首先要明确一点的是, 数据的传输是通过 序号
来确认的
而这里的序号
不是
一个一个的数字, 而是从1
开始的一段 连续的字节流 的数据。
比如小编需要发送一个数据序号为
1~ 1000
, 那么我作为发送方发送的应该是1~1000
这样的序号,这里我们称之为 序号
- 而作为 接收方确认应答数据 , 就需要
返回
给发送方 这个序号的 最后一个数字+ 1 的 一个序号 , 就为1001
。 这1001 我们就称之为确认序号
。 发送方接收到了这样的序号就说明该数据已经 发送成功 了。
- 当需要发送第二段数据的时候, 就从返回的数据
1001
开始的连续序号 开始发送 。 以此循环往复,达到 确认应答 的效果。
- 由于Tcp的 面向字节流 的, 并 不是 按照第一条, 第二条的来编号的, 而是按照
字节流
, 第一个字节, 第 1000 字节来编号的。
每一个字节都有独立的编号, 字节和字节之间, 编号是连续的,递增的。
- 按照
字节
这样的编号, 称之为: Tcp序号
- 在
应答报文
(下文说明)中, 根据之前 收到的数据 进行对应编排
的序号, 称之为: Tcp的确认序号 。
鱼式疯言
特殊情况:
对于Tcp的序号/ 确认序号来说 最大是 64KB的空间, 也就是42亿九千万的最大数值。
如果一旦序号/ 确认序号的数值超过了 42亿九千万, 就会从 0
开始连续: 0-> 42亿九千万-> 0 。
2. 确认应答的标志位
以上是Tcp的不同的 标志位
, 也是决定着Tcp 的 不同机制 。
而对于 确认应答
这个机制来说:
标志位就是上述的 Ack
, 用来区分 普通报文 和 应答报文 。
如果Ack
标记为 1
, 该报文为 应答报文 , 说明既含有普通序号
, 同时也含有 确认序号 。
如果Ack
标记为 0
, 该报文为 普通报文 , 只含有普通序号
,而不含有 确认序号
鱼式疯言
细节补充:
- 对于 应答报文 来说, 是 不携带载荷 的, 只含有报头的一种
特殊的报文
。
3. 后发先至
下面小编想谈谈一种特殊的情况, 后发先至 。
什么是后发先至呢?
<1>. 后发先至的初识
举个栗子
假如小编想请我的女神吃麻辣烫, 就会给女神发:
女神女神,我请你吃麻辣烫好不好?
女神就会回: 好啊好啊!
如果我再问一句: 女神女神, 做我女票好不好?
女神就会回: 滚!
正常情况:
第一句回复对应第一个问题, 第二句回复对应第二个问题。
特殊情况:
但在网络传输中也有可能会出现, 先发的后到达, 后发的先达到。
就会造成 误解
, 引起歧义。
<2>. 后发先至的解决方案
对于这种 后发先至 的特殊情况。
Tcp早已根据确认应答机制做出了调整。
假如小编发过来的是 : 1~1000
, 1001~2000
, 2001~3000
那么女神可能收到先收到: 1001~2000
, 再收到 2001~3000
, 最后收到 1~1000
假如没有收到
1~1000
的数据, 就会先进行等待, 等待的1~1000
到达, 然后再是1001~2000
, 最后是2001~ 3000
的顺序来 排好序, 使接收方和发送方
所发的数据是 顺序一致 。
如上图, 系统内核中有 一段内存空间 ,作为
“接收缓冲区”
, 收到的数据会在缓存区中进行 排队等待 , 只有开头的数据 到了, 应用程序才会真正读取
里面的数据。
鱼式疯言
补充总结 :
Tcp会针对
接收方
收到的数据进行 重新排序 , 确保应用程序, 接收方收到数据顺序和发送方发送的数据顺序是 一样的 。
三. Tcp 的超时重传
1. 丢包的原因
为啥会丢包。
这里的丢包, 指的的是 数据包
。
在网络传输过程中, 会出现很多 不确定的情况 发生,就很有可能产生 “丢包问题”
<1>. 情况一
在网络传输过程中, 很有可能会出现受 电磁波的影响 , 当传输的数据遇到一段变化的磁场, 就会受磁场的影响,发生 bit翻转
, 也就是数据 0-> 1
, 1->0
。
这样就会使最终接收的 校验和 和发送的 校验和 对应不上, 就会发送 丢包问题
。
<2>. 情况二
在数据非常多的高峰时期, 由于网络传输中的某个交换机的节点 一时间无法转接那么多的数据 , 能处理的空间小于实际所发送过来的数据。 就会导致一部分数据不能及时处理, 路由器就会把这些 数据给丢弃
, 从而出现 丢包问题 。
2. 丢包的种类以及处理方案
丢包的种类分为两种:
-
发送方发送 数据丢包
-
返回确认序号 Ack丢包
<1>.数据丢包
发送会设定一个
超时时间
.
如果在规定时间内没有收到 Ack的反馈, 就说明 数据丢包了~
一旦发送方感受到了 数据丢包了 , 就会
数据重传
。
<2>. Ack 丢包
对于发送方来说, 是 无法辨别 是哪种情况的 丢包 , 所以当在超过了
超时时间
, 没有收到Ack的反馈
时, 还是会 进行重传 的。
但是在
操作系统内核
, 存在一个内存空间为“缓存区”
,当发送方发送一段数据, 会先进入到 缓存区 中, 接收方就会在 缓存区中查找是否有重复发送过的数据 , 然后进行 去重操作 ,也就是把 重复的数据 直接丢弃掉
。
从而确保 应用程序 ,read读出来的数据是 唯一的 , 不重复的 。
3. 超时时间的设定
超时时间的设定, 这里的超时时间不是固定的, 而是动态变化的。
发送方第一次重传 ,时间为 t1
, 如果在t1 时间内没有收到 Ack , 就会继续第二次重传, 时间为 t2
。
其中
t2 > t1
,随着重传的 次数越来越多 , 发送成功的 概率就越大 。
但是 重传的频次 会 越来越低, 时间会 越来越长 。
反之, 如果重传了很多次, 说明网络的丢包率已经很高了==>网络发生严重故障,大概率没法继续使用了。
鱼式疯言
重传也 不是无休止 的进行, 当重传达到 一定的次数 后, Tcp就会尝试 重新连接 , 就会发送一个特殊的报文 “复位报文” , 如果网络重新连接了, 通信就会继续进行, 如果
复位报文
没有得到及时回应, 此时Tcp
就会 单方面的放弃连接 ~~。
总结
-
Tcp的结构初识及可靠传输: Tcp的四大特性: 有连接, 可靠传输,面向字节流, 全双工。 其中提及支持可靠传输的背后的两种机制: 确认应答和超时重传 , 以及
Tcp 报头结构和长度
。 -
Tcp的确认应答机制: Tcp的确认应答: 以字节流的形式 Tcp序号和以及对应的Tcp确认序号,
标志位的Ack
, 和一种特殊情况: 后发先至。 -
Tcp的超时重传机制: 主要两种丢包的原因:比特翻转, 数据过多。 和两种丢包类型:
数据丢包
和Ack丢包
。 最后 超时时间的不是固定的,而是动态变化的 。
如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正
希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖