【网络编程】UDP协议和TCP协议1

UDP协议格式

在这里插入图片描述
UDP 报文分为 UDP 报头和 UDP 数据区两部分。报头由 4 个 16 位长(2字节)字段组成,分别说明该报文的源端口、目的端口、报文长度和校验值。

UDP协议如何将报头和有效载荷分离

UDP报头是一种定长报头,长度为8个字节。UDP在读取报文时,首先读取这8个字节的报头,剩下的部分就是有效载荷。

特点

1.无连接:知道两端的ip和端口即可直接传输
2.不可靠:没有确认机制,没有重传,因为网络故障无法发送到对方,UDP协议层也不会返回任何错误信息。
3.面向数据报:应用层交给UDP多长的报文,UDP原样发送,既不拆分也不合并。(如果发送端调用一次sendto发送100个字节,接收端必须调用一次recvfrom接收100个字节;而不能循环调用10次每次10个)

UDP的缓冲区

UDP没有真正意义上的 发送缓冲区. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作;
UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; 如果缓冲区满了, 再到达的UDP数据就会被丢弃;

TCP协议格式

在这里插入图片描述
应用层对数据处理,调用write,sendto等接口将数据从用户缓冲区发送到传输层TCP的发送缓冲区,由TCP协议决定数据怎么发,发错了怎么办。接收缓冲区收到数据,由read,recv等接口读到用户级缓冲区。

窗口大小

16位窗口大小是自己的接收缓冲区剩余大小,用于流量控制。
接收端在对发送端发送过来的数据进行响应时,可以通过 TCP 的报头中的 16 位窗口大小来告知发送端自己当前接收缓冲区剩余空间的大小。此时,发送端就可以根据这个窗口大小来调整自己发送数据的速度。

窗口大小字段越大,说明接收端处理数据的能力越强,发送端可以适当地提高数据的发送速度。
窗口大小字段越小,说明接收端处理数据的能力越弱,发送端需要适当地降低数据的发送速度。 当窗口大小字段等于 0
时,说明接收端的接收缓冲区已经没有剩余空间了,发送端应该停止发送数据直到接收端处理完一些数据,接收缓冲区中有空间剩余。 通过 16 位窗口大小告知对方自己的接收能力,这样就可以做到流量控制了。

  • 在进行套接字编程时,我们调用 write / send函数向套接字中写入数据时,可能会因为套接字的发送缓冲区已经被写满而被阻塞住了,其本质就是 TCP 中的发送缓冲区已经被写满了,所以write / send 函数就需要阻塞到发送缓冲区有足够的空间来存储数据。
  • 我们调用 read / recv 函数从套接字中读取数据时,可能会因为套接字中的接收缓冲区中没有数据而被阻塞住了,其本质就是 TCP 中的接收缓冲区中没有数据,所以read / recv 就需要阻塞到接收缓冲区中有一定数量的数据。
  • 调用 write / send 和 read / recv函数会被阻塞注,本质就是生产者消费者模型中的临界资源没有就绪,需要阻塞等待直到条件满足。

如何将报头和有效载荷分离?

固定长度+自描述字段

读取报文的前20个字节:当TCP获取到一个报文后,首先会读取报文的前20个字节。这20个字节包含了TCP报头的基本信息,如源端口号、目的端口号、序列号、确认号等。
提取首部长度字段:在这20个字节中,TCP会提取出4位的首部长度字段。这个字段表示的是TCP报头的总长度,单位是4字节。因此,通过读取这个字段,TCP就可以知道报头的实际大小(size)。
判断是否存在选项字段:如果首部长度字段表示的大小(size)大于20字节,那么就说明TCP报头中还包含了选项字段。选项字段是可选的,它包含了一些用于控制TCP连接行为的参数。
读取选项字段:如果存在选项字段,TCP就需要继续从报文中读取size -20字节的数据。这部分数据就是TCP报头中的选项字段。选项字段的长度可以是0到40字节之间(因为TCP报头的最大长度是60字节,基本报头长度是20字节)。
分离有效载荷:读取完TCP的基本报头和选项字段后,剩下的部分就是有效载荷了。有效载荷是TCP报文的实际数据部分,它承载了应用层要传输的信息。

理解确认应答机制

发送方首先进行序列号分配,将数据分成tcp段的较小单元,并为每一个分段分配一个唯一的序列号,发送给接收方同时也会启动一个计时器,接收方接收到数据会回复一个ACK(确认序号),采用累计确认的方式即可以接收到多个数据包再发送一个累计的ACK。

重传机制:如果在计时器规定的时间内没有发送方没有收到应答便会重传数据包。
滑动窗口:允许接收方在发送一个ACK之前接收多个数据包,而不仅仅是接收一个数据包就发送一个ACK。
选择性确认(SACK):虽然TCP主要使用累积确认,但还支持一种称为选择性确认(SACK)的扩展。使用SACK,接收方可以明确地告诉发送方哪些数据包已经成功接收,哪些数据包丢失了,从而允许发送方只重传丢失的数据包,而不是整个数据流。
快速重传和快速恢复:当接收方收到一个乱序的数据包时,它会立即发送一个重复的ACK,这个重复的ACK的确认号仍然指向期望接收的下一个字节的序号。如果发送方收到三个或更多的重复ACK,它会触发快速重传机制,即立即重传缺失的数据包,而不需要等待重传超时。快速恢复是与快速重传一起使用的机制,它允许发送方在重传数据包之后立即回到之前的传输状态,而不是像正常重传那样进入慢启动阶段。

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

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

相关文章

QCC3071/QCC3081/QCC3083/QCC3084/QCC5171/QCC5181/QCC3091/QCC3095平台LDAC解码

QCC3071/QCC3081/QCC3083/QCC3084/QCC5171/QCC5181/QCC3091/QCC3095平台LDAC解码 LDAC Decoder Evaluation Kit for QCC5181 and QCC5171 (The 5181 Kit) 随着Qualcomm DSP向下开放,QCC3071/QCC3081/QCC3083/QCC3084目前可以可以实现LDAC Decoder。 QCC3071/QCC3…

【Shell脚本】Shell编程之循环语句

目录 一.循环语句 1.for语句的结构 1.1.格式 1.2.实操案例 案例1. 案例2. 案例3. 案例4. 2.while语句的结构 2.1.格式 2.2.实操案例 案例1. 案例2. 案例3. 案例4. 3.until循环命令 3.1.格式 3.2.实操案例 案例1. 二.补充 1.常用转义符 一.循环语句 1.for…

56 关于 linux 的 oom killer 机制

前言 这里主要讲的是 linux 的 oom killer 机制 在系统可用内存较少的情况下,内核为保证系统还能够继续运行下去,会选择杀掉一些进程释放掉一些内存。 通常oom_killer的触发流程是:进程A想要分配物理内存(通常是读写内存&#…

笨方法自学python(九)-读写文件

读取文件 前面已经学过了 input 和 argv,这些是你开始学习读取文件的必备基础。你可能需要多多实验才能明白它的工作原理,这节练习涉及到写两个文件。一个正常的 ex15.py 文件,另外一个是 ex15_sample.txt,第二个文件并不是脚本&…

图像锐化——非锐化掩膜USM和锐化掩膜SM(附代码)

非锐化掩膜 (USM) 和锐化掩膜 (SM) 都是常用的图像锐化技术。它们都可以通过增强图像的边缘信息来提高图像的清晰度。 目录 一、非锐化掩膜USM1.1 USM原理1.2 USM实现步骤1.3 优点1.4 代码 二、锐化掩膜SM2.1 SM原理2.2 SM实现步骤2.3 优点2.4 代码 三、锐化效果四、总结4.1 效…

Qt三方库:QuaZIP介绍、编译和使用

前言 Qt使用一些压缩解压功能,探讨过libzip库,zlib库,libzip库比较原始,还有其他库,都比较基础,而在基础库之上,又有高级封装库,Qt中的QuaZIP是一个很好的选择。Quazip是一个用于压缩…

5.11学习记录

20长安杯部分 检材 1 的操作系统版本 CentOS Linux 7.6.1810 (Core) 检材 1 中,操作系统的内核版本是 3.10.0-957.el7.x86_64 检材 1 中磁盘包含一个 LVM 逻辑卷,该 LVM 开始的逻辑区块地址(LBA)是 2099200 物理卷&#xff…

20240510每日后端---聊聊文件预览,doc,image,ppt转PDF预览

一、引入依赖 <dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>15.8</version></dependency><dependency><groupId>com.aspose</groupId><artifactId>crac…

(Mac)RocketMQ的本地安装测试(详细图示)

目录 部署服务 namesrv / broker下载解压缩运行 namesrvnohup ./bin/mqnamesrv & 启动命令详解运行 broker 测试收发消息运行自带的生产者测试类运行自带的消费者测试类 部署 Dashboard 可视化下载打包运行访问 部署服务 namesrv / broker 下载解压缩 官网下载 https://r…

mac苹果电脑卡顿反应慢如何解决?2024最新免费方法教程

苹果电脑以其稳定的性能、出色的设计和高效的操作系统&#xff0c;赢得了广大用户的喜爱。然而&#xff0c;随着时间的推移&#xff0c;一些用户会发现自己的苹果电脑开始出现卡顿、反应慢等问题。这不仅影响使用体验&#xff0c;还会影响工作效率。那么&#xff0c;面对这些问…

FPGA -手写异步FIFO

一&#xff0c;FIFO原理 FIFO&#xff08;First In First Out&#xff09;是一种先进先出的数据缓存器&#xff0c;没有外部读写地址线&#xff0c;使用起来非常简单&#xff0c;只能顺序写入数据&#xff0c;顺序的读出数据&#xff0c;其数据地址由内部读写指针自动加1完成&a…

win10无法被远程桌面连接,Win10系统无法被远程桌面连接的原因有哪些

win10无法被远程桌面连接&#xff0c;Win10系统无法被远程桌面连接的原因有哪些&#xff1f; 先&#xff0c;我们需要明确Win10系统无法被远程桌面连接的可能原因。其中&#xff0c;最常见的原因包括&#xff1a;远程桌面功能未启用、网络连接问题、防火墙或安全软件设置不当、…

哪个牌子的电视盒子好用?小编分享最新电视盒子排名

最近电视盒子是大家热议的话题&#xff0c;就目前来看它的地位依然无可替代&#xff0c;但许多朋友硬不知道哪个牌子的电视盒子好用&#xff0c;面对众多品牌和产品究竟要如何选择才是最好的呢&#xff1f;本期小编要分享最新发布的电视盒子排名&#xff0c;看看哪些电视盒子最…

C++ 抽象与封装

一 抽象 抽象实例&#xff1a;时钟 数据抽象&#xff1a; 具有表面当前时间的时、分、秒 行为抽象&#xff1a; 具有设置时间和显示时间两个最基本的功能。 抽象实例&#xff1a;人 数据抽象&#xff1a;姓名、年龄、性别等。 行为抽象&#xff1a; 生物属性&#xff1a;吃…

【线性代数】英语版听课笔记

线性代数 - 北京航天航空大学&#xff08;英文版&#xff09;_哔哩哔哩_bilibili 39.concept of vector space in this lecture we will studyvector space&#xff0c; the concept of basis dimension and coordinates 向量空间的维数&#xff1a;向量空间的基底所含向量的…

TCP超时重传机制

一、TCP超时重传机制简介 TCP超时重传机制是指当发送端发送数据后&#xff0c;如果在一定时间内未收到接收端的确认应答&#xff0c;则会认为数据丢失或损坏&#xff0c;从而触发重传机制。发送端会重新发送数据&#xff0c;并等待确认应答。如果在多次重传后仍未收到确认应答&…

车载测试__公司面试题(整理)

案例1&#xff1a; 镁佳 外包岚图汽车 车载测试 区域经理视频面试 1.首先自我介绍一下 2.项目是怎么测的举例说明 3.你是怎么看待加班的 4.你是怎么看待驻场单位 5.是否可以接受外派去做一段时间的技术支持&#xff0c;比如去襄阳&#xff0c;最长一个月。 6.多快能到…

Codigger:优化Vim编辑器的关键是可视化

Vim是一款高度灵活的文本编辑器&#xff0c;以其高效的快捷键和命令行界面而闻名。然而&#xff0c;对于一些初学者来说&#xff0c;Vim的复杂性和强大的功能可能会让他们感到困惑。为了使Vim更易于使用&#xff0c;Codigger引入可视化操作的概念&#xff0c;将原本抽象的、难以…

智慧公厕,运用数据提升公共厕所管理水平!

随着城市人口的增加和生活水平的提高&#xff0c;公共厕所的管理变得越来越重要。传统的厕所管理方式已经无法满足人们对卫生、便利和舒适的需求。而智慧公厕作为新一代公厕管理方式&#xff0c;通过运用数据技术和大数据分析手段&#xff0c;彻底改变了公厕管理的模式&#xf…

C++对象的赋值

同类的对象之间可以互相赋值&#xff0c;即一个对象的值可以赋值给另一个对象。对象之间的赋值通过“”进行。默认就是把一个对象所有非static数据成员的值依次赋值给另一个对象。 对象赋值的一般形式为&#xff1a; 对象名1 对象名2; 注意:对象名1和对象名2必须是属于同一个…