【网络编程】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://xiahunao.cn/news/3030000.html

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

相关文章

kaldi学习参考

HMM模型 https://www.cnblogs.com/baixf-xyz/p/16777438.htmlhttps://www.cnblogs.com/baixf-xyz/p/16777438.htmlGMM-HMM 基于GMM-HMM的语音识别系统https://www.cnblogs.com/baixf-xyz/p/16777439.html https://www.cnblogs.com/baixf-xyz/p/16777426.htmlhttps://www.cnbl…

全网最详细使用war包的方式结合Tomcat和向量数据库PostgreSQL本地部署Xwiki教学

部署 XWiki 在 CentOS 7 上的过程涉及多个步骤,主要包括安装环境依赖、配置数据库以及安装和配置XWiki。以下是一个详细的步骤说明: 1. 系统准备 首先,确保您的系统是最新的: sudo yum update2. 安装 Java 这里需要注意一下版本…

【静态分析】软件分析课程实验A4-类层次结构分析与过程间常量传播

官网:作业 4:类层次结构分析与过程间常量传播 | Tai-e 参考:https://www.cnblogs.com/gonghr/p/17984124 ----------------------------------------------------------------------- 1 作业导览 为 Java 实现一个类层次结构分析&#xf…

又被System.out.print给坑了一把

学过java的同学都应该知道,第一个程序很多人都是这样: public class Hello {public static void main(String[] args) { System.out.print("Hello,world!");} } 打印结果是:Hello,world! 接着可能会…

中国地面基本气象逐小时数据获取方式

环境气象数据服务平台提供了全国大约2100个点位,2023年1月1日至今的小时级数据。包括气温、气压、湿度、风、降水等要素。 数据基于ECMWF ERA5-Land Hourly陆面再分析资料和中国地面基本气象观测逐三小时数据,使用机器学习模型加工所得,对比…

记一次DNS故障导致用户无法充值的问题(下)

上一篇说到DNS故障导致无法充值,后来我们通过拨测发现业务域名的解析目标地址被解析到了【127.0.0.1】IP。 1、联系阿里云厂商,通过沟通,阿里云反馈我们的域名被XX省通管单位封禁了,导致解析到了不正确的地址。 2、为了解决用户问…

ADS基础教程11 - TouchStone文件的导出及导入

目录 一、 T o u c h S t o n e 介绍 \color{#4285f4}{ \mathbf{ 一、TouchStone介绍}} 一、TouchStone介绍 二、文件导出、导入方式 \color{#4285f4}{ \mathbf{ 二、文件导出、导入方式}} 二、文件导出、导入方式1.原理图操作1)原理图中导出2.原理图中导入 3.DDW中…

云服务器性能大揭秘:4核与8核你知道多少?

​  云计算服务中,通常使用具有多个 CPU 的服务器集群,以便为企业和个人等提供可扩展的计算资源。这使他们能够处理大量数据处理和存储,而无需自己投资昂贵的硬件。像术语“4核”和“8核”,在云服务器领域中就比较常见&#xff…

中国地面气候资料日值数据获取方式

数据简介 环境气象数据服务平台提供了全国大约2100个点位,2000年至2023年的逐日数据。包括气温、气压、湿度、风、降水等要素。 数据基于ECMWF reanalysis-era5-land、reanalysis-era5-single-levels 以及中国2100站点地面气候资料日值观测数据,使用机器…

winform植物大战僵尸

winform植物大战僵尸 植物大战僵尸源码 半成品 需要的拿去学习 登陆注册选择关卡 向日葵 豌豆射手 双枪豌豆射手 项目获取: 项目获取:typora: typora/img (gitee.com) 备用项目获取链接1:yifeiyixiang/kamo: 源码下载 (github.com) 备用…

Capl复合数据类型:枚举

用于定义一组有穷的、命名的常量。常量有了命名更容易理解和记忆,枚举中常量的命名,必须在整个capl程序中唯一。 定义的枚举类型变量,里面的成员如果没有赋值,默认从左到右,依次为012345...。如果有赋值就该成员就代表…

【全开源】Java外卖霸王餐免费吃外卖小程序+APP+公众号+H5多端霸王餐源码

一、特色功能 霸王餐活动管理:允许商家发布和管理霸王餐活动,包括设置活动时间、具体优惠、活动规则等。用户参与与浏览:用户可以在小程序中浏览霸王餐活动列表,查看活动的详情信息,如商品或服务的免费赠送、活动规则…

【NLP练习】使用seq2seq实现文本翻译

使用seq2seq实现文本翻译 🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 from __future__ import unicode_literals, print_function, division from io import open import unicodedata import string impo…

Ubuntu/Linux 安装Docker + PyTorch

文章目录 1. 提前准备2. 安装Docker2.1. 卸载冲突软件(非必要)2.2. 在Ubuntu系统上添加Docker的官方GPG密钥2.3. 将Docker的仓库添加到Ubuntu系统的APT源列表中2.4. 安装最新Docker2.5. 检查 3. 安装Nvidia Container Toolkit3.1. 在Ubuntu系统上添加官方…

1688一键采购1000+商品||1688API数据采集接口||1688官方合作伙伴如何实现1688代采

货源采购是跨境电商卖家日常工作的一个重要部分,1688平台是很多卖家常用的货源采购平台。在1688平台采购时,很多卖家会进行批量采购,可能会达到上百甚至上千单,如果一件一件的采购,可能会浪费卖家大量的时间。我们可以…

【java9】java9新特性之改进JavaDocs

Java9在JavaDocs方面的主要新特性是,其输出现在符合兼容HTML5标准。在之前的版本中,默认的HTML版本是 HTML4.01,但在Java9及之后的版本中,JavaDocs命令行工具将默认使用HTML5作为输出标记语言。这意味着,使用JavaDocs工…

MemoryModule - exp - test

文章目录 MemoryModule - exp - test概述笔记测试环境GetModuleFileName不能正常执行GetModuleFileNameWntdll_LdrGetDllFullName猜测原因用LoadLibrary载入的DLL中功能是正常的 gLog可以正常使用内存载入DLL无法支持的功能的折中方法COM操作正常调用方代码接口代码 接口入参测…

Visual Studio的使用方法

目录 1. 下载软件 2. 软件安装 3. 软件使用 4. VS工具的字体背景美化 5. 程序调试 1. 下载软件 官网地址:Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 (microsoft.com) 2. 软件安装 1.选中vs_Professional,鼠标右击选择“以管理员身份…

Capl复合数据类型:结构

结构是由一系列的相同或不同的数据类型构成的整体。结构中的每一项数据成为一个成员。每个成员可以有各自的数据类型。所有成员一起表示一个整体结构。 1.定义结构体类型 运行结果 2.修改结构体变量的成员。自定义一个常量给结构体变量的成员重新赋值即可。 3.定义一个结构体类…