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

【网络】传输层TCP协议的报头和传输机制

目录

引言

报头和有效载荷

确认应答机制

捎带应答机制

超时重传机制

排序和去重

连接管理机制


个人主页:东洛的克莱斯韦克-CSDN博客

引言

TCP是传输层协议,全称传输控制协议。TCP报头中有丰富的字段以及协议本身会制定完善的策略来保证网络传输的可靠性。

TCP是全双工(可以同时读写)的,因为TCP协议维护了两块缓冲区,一个用来读,一个用来写。建立链接成功会返回给应用层文件描述符,应用层调用该文件描述符写入,数据就刷到写缓冲区,应用层调用该文件描述符读,就会从读缓冲区读取数据。

报头和有效载荷

数据部分称为有效载荷,剩下的称为报头。报头是结构化数据。

源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去

4 位TCP首部长度 : 表示该 TCP 头部有多少个 32 bit( 有多少个 4 字节 ); 所以TCP 头部最大长度是 15 * 4 = 60,上述选项中报头去掉选项固定大小是20字节,报头的选项可带可不带,所以报头的长度是20到60字节

标志位

URG: 紧急指针是否有效
ACK: 确认号是否有效,应答
PSH: 提示接收端应用程序立刻从 TCP 缓冲区把数据读走
RST: 对方要求重新建立连接 ; 我们把携带 RST 标识的称为 复位报文段
SYN: 请求建立连接 ; 我们把携带 SYN 标识的称为 同步报文段
FIN: 通知对方 , 本端要关闭了 , 我们称携带 FIN 标识的为 结束报文段

16 位窗口大小 :用于流量控制
16 位校验和 : 发送端填充 , CRC 校验 . 接收端校验不通过 , 则认为数据有问题 . 此 处的检验和不光包含 TCP 首部 , 也包含 TCP 数据部分 .
16 位紧急指针 : 标识哪部分数据是紧急数据 ;
32位序号:TCP 将每个字节的数据都进行了编号 . 即为序列号。
32位确认序号:每一个 ACK 都带有对应的确认序列号, 意思是告诉发送者, 我已经收到了哪些数据; 下一次你从哪里开始发
数据:整个报文的有效载荷

确认应答机制

在网络通信中,主机A向主机B发消息,主机A不可能知道数据包是否到达了主机B。所以需要主机B向主机A应答,让主机A知道数据包并没有丢失。

需要通过应答来确保单方向上通信的可靠性,单方向是因为主机B不知道自己的应答是否丢失,如果主机B要确认自己的应答是否丢失就需要主机A再向主机B发送应答,这样的话就套娃了,所以没有完全可靠的通信,只能确保单方向上的通信。

捎带应答机制

捎带应答是指TCP发送方在发送数据包时,如果此时正好有确认消息(ACK)需要发送给接收方,则将确认消息捎带在数据包中一起发送,从而减少网络中的确认消息数量,提高网络利用率。这种策略通常建立在延时应答的基础上,因为延时应答使得发送方有机会在等待ACK的过程中积累更多的数据或确认消息进行合并发送。


超时重传机制

基于上述的应答机制可以再思考一下,主机A发出的数据包可能丢了,可能在某个路由下排队。对应的,主机B收到了数据包,那应答的数据包万一丢失了呢?

为了应对上述情况,TCP在发出一个数据包时,会设个时间,只要超出这个时间主机A都认为主机B没有收到数据包,会重新发送。

Linux (BSD Unix Windows 也是如此 ), 超时以 500ms 为一个单位进行控制, 每次判定超时重发的超时时间都是 500ms 的整数倍。 如果重发一次之后, 仍然得不到应答 , 等待 2*500ms 后再进行重传 。如果仍然得不到应答, 等待 4*500ms 进行重传。 依次类推 , 以指数形式递增。 累计到一定的重传次数, TCP 认为网络或者对端主机出现异常 , 强制关闭连接。

排序和去重

主机A可能向主机B发了很多数据包,由于网路问题,数据包到达主机B可能乱序了。认识了上述重传机制后主机A可能向主机B发送同样的数据包。那么主机B怎么做到排序和去重呢——TCP报头中的序列号。

主机B收到数据包后会给主机A响应,即发送的TCP报头中的确认序号分别为1001,2001,3001。那么此时,我们时允许主机B响应的数据包可以有部分丢失,如果拿到了带有3001序号的TCP报头,那么主机A就知道前3000个字节已经成功发送给B,即使前两个响应的数据包丢失了也没关系,此时主机A知道下次应该从3001开始传。

连接管理机制

在TCP协议通信之前是要建立链接的,OS也要创建对应的内核数据结构管理链接。通信双方发送TCP的报头协商——包头中的标志位。
建立链接要三次握手,握手是个形象的说法,本质是通过TCP报头中的标志位协商
上图中只画了标志位,实际传输时双方用TCP报头协商。
客户端发起SYN请求,服务端响应SYN和ACK表示自己也要建立链接并告诉客户端自己已经收到链接请求,此时客户端才的OS才创建相关的内核数据结构管理该链接,客户端在给服务端发送ACK只要服务器收到了ACK,服务端才建立链接,OS也会创建相关的内核结构来管理该链接,至此双方完成握手。
如果第三次的ACK丢包了呢? 那么客户端和服务端在短时间内会有认知偏差,在三次握手规定中,第三次的ACK不会得到服务端的响应,那么只要客户端把该报头发送出去,就认为双方握手成功,但该数据包丢失了,服务端会认为握手失败,并给客户端发送带有 RST标志位的数据包来要求客户端重新握手。
完成三次握手就可以让双方知道前两次通信一定没有问题,可以验证全双工。
三次握手建立链接可以有效避免 SYN洪水问题,可以拿一次握手,两次握手来比较差别。
从图中可以看出,只要客户端发起SYN请求服务端就要建立链接,服务端维护链接耗费的资源先不谈,如果客户端在握手期间出异常了服务端并不清楚的情况下要一直维持链接,链接资源是有限的,如果客户量大的话就要维持很多无效链接。如果有大量的肉机不断地发送SYN请求,服务器上地服务很容易挂掉。
断开链接要四次挥手
整个过程如下图

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 掌握NPM版本测试行为:策略、实践与示例
  • Java语言程序设计——篇十三(4)
  • 重启人生计划-且随风行
  • HarmonyOS NEXT - 数据持久化存储(key,value进行AES加密处理)
  • 【Spring Boot】全局异常处理
  • 第三章 LVS(DR模式)+keepalived群集【重要】
  • Java技术面试(一面)
  • 单调栈《数组模拟》
  • 极狐 GitLab 依赖扫描:助力开发者管理软件供应链
  • SQL数据抽样:精准洞察的高效策略
  • 开放平台: 签名密钥、回调地址、ip白名单管理。
  • excel导入
  • vue3中引入插件报ts报错Could not find a declaration file for module
  • 学懂C++(二十四):高级教程——C++ 多线程编程中 std::thread 的深入详解
  • java 面试 PDF 资料整理
  • CSS盒模型深入
  • IndexedDB
  • input实现文字超出省略号功能
  • IP路由与转发
  • php中curl和soap方式请求服务超时问题
  • Python学习之路16-使用API
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 从零搭建Koa2 Server
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 关于Flux,Vuex,Redux的思考
  • 基于webpack 的 vue 多页架构
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​如何使用QGIS制作三维建筑
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #Linux(帮助手册)
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (1)Nginx简介和安装教程
  • (21)起落架/可伸缩相机支架
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (javascript)再说document.body.scrollTop的使用问题
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (一)VirtualBox安装增强功能
  • (一)WLAN定义和基本架构转
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)平衡树
  • .bat批处理出现中文乱码的情况
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .Net Core和.Net Standard直观理解
  • .NET程序集编辑器/调试器 dnSpy 使用介绍
  • @PreAuthorize注解
  • @property括号内属性讲解
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [AutoSar NVM] 存储架构
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)
  • [C++]命名空间等——喵喵要吃C嘎嘎