TCP/UDP报文格式及各种通信机制简介

2023-11-01

一、UDP报文

    UDP报文结构如下图所示:

在这里插入图片描述

    UDP报文中包含(1) 16位源端口和目的端口,用于表示自己的端口号和将要发送的目的端口号。 (2) 16位UDP长度,表示8字节报头和UDP数据的总长度,用于确定报文长度。 (3) 16位校验和,用于在接收端对比校验,确定接收的UDP报文是否有错。(4) UDP数据信息。
    UDP特点(1)无连接,UDP直接通过IP和端口号通信,不需要建立链接。(2)面向数据报,不能够灵活的控制读写数据的次数和数量。发送的数据会被一次全部发送或接收比如要发100个字节,就只能一次把100字节全部发送,接收也只能一次接100个字节,并且报文不保证按序接收,缓冲区满了就不接收报文,这也是不可靠的原因。(3)不可靠传输,没有确认机制;如果发送故障,UDP协议层也不会给应用层返回任何错误信息。只发送数据,不负责校验,但是协议简单。

二、TCP报文

    TCP报文结构如下图所示:

在这里插入图片描述

    TCP报文中包含(1)16位源端口和目的端口(2)32位序号,给报文序号,保证报文有序,可提高可靠性。 (3)32位确认序号,当接收端收到发送端报文后,需要给发送端回复一个确认应答的报文,告诉发送端自己收到上一条信号,并且确认序号=发送端报文序号+1(4)4位首部长度,用于确定报头长度,假如是“1111”,则报头长度为4x15=60。(5)SYN标志位,在TCP建立连接也就是三次握手时,建立连接方SYN标志位置1。(6)ACK标志位,接收端接收到发送端的报文时,需要给发送端确认应答,告诉发送方报文已收到。(7)PSH标志位,提醒接收端尽快把缓冲区的数据读取。(8)RST标志位,链接建立异常,重新建立连接。在三次握手时,最后一次发送端发送ACK,发送端认为自己建立链接成功,接收端接收到ACK确认建立链接,如果接收端ACK丢失,发送端以为完成建立链接,接收端认为还没有,发送端后面发送信息,接收端返回RST。(9)FIN标志位,在断开连接时,FIN置1。(10)URG标志位,正常情况下,TCP报文都是按序发送,接收端按序接收,但是如果其中有个报文优先级比较高,则可以通过URG+16位紧急指针进行优先读取。(11)16位紧急指针,标识那部分是紧急数据,确定紧急数据在报文中的偏移量。(12)16位窗口大小,为了防止接收方缓冲区快速被填满,需要流量控制,用窗口大小表示自身的接收缓冲区的剩余空间大小,对方根据剩余缓冲区大小调制发送接收速度。(13)16位校验和,检验数据是否有错。(14)选项选项大小=首部长度确定的报头长度-20个固定字节(15)数据
    TCP特点(1)有连接,通信需要建立链接。(2)面向字节流,发送接收端可将报文分多次发送,可以一次读写若干字节,也可以一次全读写完。(3)可靠传输,有确认应答,超时重传,流量控制,拥塞控制等机制保证TCP报文可靠性传输。

三、TCP通信机制

1,确认应答机制

在这里插入图片描述
    发送端在发送数据后,接收端收到发送端数据,就需要给发送端一个应答报文其中ACK置1并且确认序号为是一个报文序号+1,告诉发送端上一个报文我们收到了,并且下一个报文你可以按确认序号开始往后标号。如发送端发送数据1-1000,接收端返回ACK并且确认序号为1001。

2,超时重传机制

在这里插入图片描述

    如果我们发送端发送一个数据后,等待一定时间没有收到接收端返回的应答报文,那么我们就认为上一个发送的报文丢失了,接收端没有收到,我们就需要重新发送。在LIUNX中第一次等待500ms,第二次2x500ms,第三次3x500ms.后面类推。

3,滑动窗口及快重传机制

在这里插入图片描述

    发送端一次发送窗口大小的数据,暂时不用管ACK,后续收到对方的ACK时窗口移动,继续发送数据。滑动窗口大小受16位窗口大小和拥塞窗口控制,并且收到ACK后,滑动窗口不一定滑动,有3种情况:
    (1) 发送端收到ACK,窗口滑动。
在这里插入图片描述    (2) 发送端收到ACK,但接收端缓冲区满,接收不了数据了,窗口不滑动,窗口变小。
在这里插入图片描述    (3) 发送端收到ACK,但接收端接收数据的能力大量,窗口滑动,并且变大。
在这里插入图片描述
    滑动窗口丢包情况:
    (1) ACK丢了:数据包到了接收端,接收端会对每个字段的数据回复一个ACK,如果窗口之间由一个字段的ACK没收到无所谓,可以通过后续的字段的ACK确认也可以。
    (2) 数据包丢了:窗口之间的某个字段的包丢了,后续的确认ACK,只能收到丢包之前的确认序号和ACK,当收到3次重复的确认应答,需要重新发丢包的字段,然后接收端发送后续字段的确认应答,如果后面仍然丢包,重复上述操作,如果后续的数据都收到了,直接回复最后一个字段的确认应答ACK(快重传机制)
    有超时重传为什么还需要快重传?
    因为如果后续的数据字段不够3个,就无法收到三个同样的ACK,就无法进行快重传,就只能进行> 超时重传机制,超时重传机制是保底机制

4,流量控制

    流量控制是网络防止发送数据过多导致接收端缓冲区满了,收不下数据而丢包,因此发收数据必须适配,进行流量控制,通过16位窗口大小控制流量,存放接收缓冲区的大小,发送给对方,进行流量控制。

5,拥塞控制及慢启动机制

    当网络中出现大量丢包现象时,网络可能出现拥塞,此时我们不能直接重传数据,不能加重拥塞问题,应该尽量不发或少发数据,等网络恢复再正常发送。 此时我们因先等待一段时间,后面需要引入慢启动机制:先发少量数据,检测是否收到ACK,收到ACK后,可以慢慢恢复数据量。而此时我们需引入一个概念,拥塞窗口:他一个数字,表示可能引发拥塞的阈值,发送的数据量大于拥塞窗口, 可能引发网络拥塞问题,拥塞窗口的数值不是确定的,根据网络状况而定,每台主机都要有拥塞窗口,且拥塞窗口不一样,并且我们可以用拥塞窗口进行控制滑动窗口大小。拥塞窗口以指数增长(2^n),指数增长达到通信阈值后就以线性方式增长并且达到正常通信阶段。

6,延迟应答

     接收端不急着应答,然后上层可能会取走更多缓冲区的数据,使得下次更新窗口时使滑动窗口变大提高吞吐量,实现速率提升。

7,捎带应答

     发送确认ACK时,也捎带发送数据一起发送过去,既有确认功能也有发送功能。

8,粘包问题

     在接收端读取报文时,一个报文被读了一部分,或者把旁边的报文也读取了一部分,而导致读取的报文不完整,就不能直接用。如同拿一个包子,包子黏在一起,取包的时候把旁边的包子也撕下来一点,照成包子不完整,因此包子与包子之间要有边界,不能连在一起,故报文与报文之间也要有边界,我们可以通过如下几个方法区分报文:1,定长报文 。2,特殊字符。 3,自描述(读取前几个字节,这几个字节中确定有效载荷长度)+定长。 4,自描述+特殊字符(空行)UDP的长度都是固定的,不存在粘包。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP/UDP报文格式及各种通信机制简介 的相关文章

随机推荐

  • Webpack学习

    webpack是一种打包工具 安装 npm install webpack webpack cli webpack dev server D webpack配置文件 可命名 webpack config js 单个总的配置文件 也可以拆分成
  • node 模块引入与加载机制

    一 说在前面 在Node js中 以模块为单位划分功能 通过一个完整的模块加载机制使得开发人员可以将应用程序划分为多个不同的部分 模块的使用可以提高代码重用率 提高应用程序的开发效率 而且开发人员可以根据具体的需求引入第三方模块或者自定义模
  • Java 8中 Objects 类源码实现与分析

    Objects 类位于 java util 包下 自 JDK 1 7 版本新增的 它是一个 final 类 不能被继承 且构造函数是 private 的 不能被实例化 它提供了一系列操作Object对象的静态方法 通常会被当做工具类去使用
  • org.junit.jupiter.api不存在如何解决

    问题描述 报错信息 解决方案 在pom xml中添加依赖 代码如下
  • SpringCloud简单实战

    我学习时搭建的父子项目 所以文章里依赖没有
  • Windows 系统cmd设置添加静态路由方式

    电脑上添加静态路由 cmd设置路由 方法 步骤 1 首先在 运行 窗口输入cmd 按WIN R打开运行窗口 然后回车进入命令行 输入 route add 10 253 251 0 mask 255 255 255 0 p 192 254 1
  • 前端实际开发中的命名规范(个人建议)

    如果说计算机科学只存在两个难题 缓存失效和命名 那我觉得前端的命名占有一席之地 让人难以理解的命名方式 单词拼写错误 中英文混用 以数字1 9或者以a z命名 中文拼音命名 强制缩写 命名方法 每个单词之间用 或者 连接 小驼峰 除第一个单
  • JavaScript做简单的购物车效果(增、删、改、查、克隆)

    比如有时候遇到下面这种情况 点击加入购物车 然后在上方的购物车中动态的添加商品以及商品的信息 我们就可以通过JavaScript实现简单的这些操作 首先我们需要在html文档中 通过css对页面的布局做一些简单的设置 并创建两个模板 其di
  • 第二十三节:DOM对象

    DOM概述 DOM 是 JavaScript 操作网页的接口 全称为 文档对象模型 Document Object Model 它的作用是将网页转为一个 JavaScript 对象 从而可以用脚本进行各种操作 比如增删内容 浏览器会根据 D
  • python字典调用键值对作为函数的形参_前端如何学习Python——字典和函数|七日打卡...

    字典 Python 中的字典和 Javascript的对象基本是一样的 添加键值对 user user name david user age 18 print user 复制代码 name david age 18 复制代码 删除键值对
  • RuntimeError: Error(s) in loading state_dict for SENET

    错误提示 RuntimeError Error s in loading state dict for SENET Missing key s in state dict conv1 weight bn1 weight bn1 bias b
  • WebGL(threeJS)给物体打标签

    threeJS给物体打标签有以下几种方法 今天我们就郭老师的例子 依次来看看区别三中标签的区别 今天咱们现年看看效果 下次咱们分析代码 第一种 CSS2DRenderer 官方案例 CSS2DRenderer的标签本身的大小不会缩放也不会旋
  • OD华为机试 19

    分苹果 描述 A B两个人把苹果分为两堆 A希望按照他的计算规则等分苹果 他的计算规则是按照二进制加法计算 并且不计算进位 12 5 9 1100 0101 9 B的计算规则是十进制加法 包括正常进位 B希望在满足A的情况下获取苹果重量最多
  • 2022全年度净水器十大热门品牌销量榜单

    随着人们健康意识的提升 每天喝足量水的观念已经深入人心 而伴随居民生活水平的提高 当下居民对水污染问题也更加关注 对饮水品质的认知和要求也随之升级 因此 净水器在过去几年开启了高速增长的趋势 根据鲸参谋数据显示 2022年京东平台净水器的年
  • docker具名挂载与匿名挂载

    文章分为三部分 什么是具名 匿名和指定路径挂载 匿名挂载 具名挂载 什么是具名 匿名和指定路径挂载 v 容器内路径 匿名挂载 v 卷名 容器内路径 具名挂载 v 宿主机路径 容器内路径 指定路径挂载 拓展 宿主机路径 容器内路径 ro 只读
  • 好书推荐计划:Keras之父作品《Python 深度学习》

    大家好 我禅师的助理兼人工智能排版住手助手条子 可能很多人都不知道我 因为我真的难得露面一次 天天给禅师做底层工作 今天条子终于也熬到这一天 终于也有机会来为大家写文章了 激动的我啊 都忘了9月17号中午和禅师在我厂门口兰州料理吃饭 禅师要
  • C++——关于返回值优化问题

    我们知道 对于一个函数的返回值来说 其是一个对象的拷贝 并且应当是一个右值 我们现在有一个函数 A get A A a 1 return a int mian A get A return 0 这个函数的行为应当是在函数体中构造一个a 然后
  • 浅析React Router V6 useRoutes的使用

    本篇文章记录了useRoutes第一个参数的使用方法 暂不涉及第二个参数 文章目录 一 使用位置 二 嵌套路由 三 分模块管理 注意事项 一 使用位置 一开始以为可以像react router config那样使用 于是写成 import
  • 用 construct 2 制作简易弹幕游戏

    用 construct 2 制作简易弹幕游戏 1 打开construct 2 加入背景 3 建立新的图层 4 在新的图层里加入素材 超人 弹幕 4 加入鼠标 5 给超人和弹幕设置动作 超人的 弹幕的 6 加入文字框 7 编写代码 完成啦
  • TCP/UDP报文格式及各种通信机制简介

    TCP UDP报文格式及各种通信机制简介 一 UDP报文 二 TCP报文 三 TCP通信机制 1 确认应答机制 2 超时重传机制 3 滑动窗口及快重传机制 4 流量控制 5 拥塞控制及慢启动机制 6 延迟应答 7 捎带应答 8 粘包问题 一