传输层协议--UDP

引入

传输层负责数据能够从发送端传输到接收端。

端口号(Port)

端口号标识了一个主机上进行通信的一个进程。

两个问题:

1. 一个进程可以绑定多个端口号吗?--可以

2.一个端口号可以绑定多个进程吗?--不可以

我们需要维护的是一个端口号唯一确定一个进程,这关系好比函数(一个x只能唯一确定一个y才是函数关系,但是y可以对应多个x,y=x²是函数,但是y²=x不是函数),一个端口号只能绑定一个进程,一个进程却可以绑定多个端口号

netstat指令

用来查看网络状况的重要工具

进程的标准输入VS命令行参数

pidof HttpServer | xargs kill -9

xargs 的作用: 将标准输入的内容转化为命令行参数 (HttpServer是程序名称)

上面是一些引入的知识,方便后面介绍使用

UDP的协议格式

几乎任何协议都要解决2个问题:

1 . 如何分离(封装) 2. 如何交付(解包) 

1. 如何分离?

UDP是固定长度的报头,可以直接将报头和有效载荷分离

2. 如何交付

根据报头中的16位端口号,进行向上交付(进程绑定了端口号)

   1. 为什么我们在应用层编写代码时候,每一次写端口号的时候,都喜欢用 uint16_t ?

                 2.UDP是如何提取整个报文的? 

  1. 因为协议用的是端口号是16位的;

                 2.  UDP具有将报文一个一个正确接受的能力的,UDP是面向数据报的,通过固定长度的报头可以获取到16位udp长度

理解报文本身

首先,我们有一个很基本的认识,操作系统的底层大部分都是C语言写的。报文在不同主机间通过网络交流传输,肯定是有大量的报文的,那OS该怎么管理他们呢?C++以及java语言的学习者,可能很容易想到类,对象之类的东西,但是 OS的底层主要是 C语言,C是用的什么呢? --结构体

struct udp_hdr
{uint32_t src_port:16;    //源端口号uint32_t dst_port:16;    //目的端口号 uint32_t udp_len:16;     //UDP长度uint32_t udp_check:16;   //udp 检验和
}

这个  : 大家有没有一点熟悉,对,位断 ,有想要进一步了解这方面知识的uu移步 :

https://blog.csdn.net/qq_59293418/article/details/122667301?sp

UDP的特点

无连接

不可靠

首先,我想强调的一点是,这里的不可靠并不是一个贬义词,和生活场景是不一样的。UDP不可靠的同时也确保了其简单和高效,像现在很多直播,视频平台就喜欢用UDP协议,其简单高效已于维护,即使是偶尔出现掉帧(数据包丢失等)情况,也是在大多数人可以接受的范围内的。

面向数据报

深入理解 IO类接口

之前写UDP或者TCP的相关代码时候经常会使用到 read/write/sendto/recvfrom/recv/send这些IO类接口。很容易以为这些函数是负责和网络交互的,其实不然,我们通过下面这个图简单分析以下

什么时候发送数据,发送多少数据,发送出错了怎么办?

 不用焦虑,这些问题OS会处理的,UDP不用负责这些。

所以,我们有了这个结论: 这些IO类接口本质的工作是将内容从用户层拷贝到内核层,至于接下来的发送系类的事就安心交给OS就好了,他们本身也只是 拷贝函数

UDP的全双工VS半双工
 

UDP的缓冲区

UDP本身没有真正意义上的发送缓冲区,他只管发送,不处理出错的问题,

但UDP具有接收缓冲区,所以UDP的socket既能读又能写,这叫全双工

怎么直观理解全双工和半双工呢

在平常的正常人际交流中,我们通常是比较客气绅士的,两个人说话会等对方说完,确认听清和理解后给出反应(这就是半双工),但是当我们有了冲突矛盾,说话也没有那么客气了,也不在乎别人说什么,这个时候大家都在说话,吵吵闹闹的状态(全双工)。

简单来说: 全双工既在输出,也在接收,半双工只能进行单一的输出或者输入

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

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

相关文章

YOLO目标检测——VOC2007数据集+已标注VOC格式标签下载分享

VOC2007数据集是一个经典的目标检测数据集,该数据集包含了20个常见的目标类别,涵盖了人、动物、交通工具等多个领域,共同11220图片。使用lableimg标注软件标注,标注框质量高,标签格式为VOC格式(即xml标签&a…

从零开发一款ChatGPT VSCode插件

‍本文作者是360奇舞团开发工程师 引言 OpenAI发布了ChatGPT,就像是给平静许久的互联网湖面上扔了一颗重磅炸弹,刹那间所有人都在追捧学习它。究其原因,它其实是一款真正意义上的人工智能对话机器人。它使用了深度学习技术,通过大…

《TCP/IP网络编程》阅读笔记--基于 TCP 的半关闭

目录 1--基于TCP的半关闭 1-1--TCP单方面完全断开的问题 1-2--shutdown()函数 1-3--半关闭的必要性 2--基于半关闭的文件传输程序 1--基于TCP的半关闭 1-1--TCP单方面完全断开的问题 Linux 系统中的 close 函数会将 TCP Socket 的连接完全断开,这意味着不能收…

苍穹外卖 day12 Echats 营业台数据可视化整合

苍穹外卖-day12 课程内容 工作台Apache POI导出运营数据Excel报表 功能实现:工作台、数据导出 工作台效果图: 数据导出效果图: 在数据统计页面点击数据导出:生成Excel报表 1. 工作台 1.1 需求分析和设计 1.1.1 产品原型 工作台是系…

智能安全帽~生命体征检测与危险气体检测一体化集成设计还是蓝牙无线外挂式方式好?

生命体征(心率、血氧等)检测&上报平台,危险气体采集&上报平台,是智能安全帽产品中常见的两种选配件,它们的实现有两种典型的模式: 1)将传感器集成到主板上,做成一体化的智能…

Java并发编程第7讲——CompletableFuture、Future和ForkJoinPool(万字详解)

在Java中进行异步计算是比较难以理解的。一般来说,我们希望将任何计算都视为一系列步骤,但是在异步的情况下,这些步骤通常以回调函数的形式存在,要么散布在代码中,要么互相嵌套的很深。而我们需要处理可能发生在某个步…

设计模式-01简单工厂模式详解 详细代码对比

目录 ChatGpt问答原生代码简单工厂模式代码 简单工厂模式(Simple Factory Pattern)新增boat 对比两种方法原生代码为什么使用强制转换?简单工厂模式 简单工厂方法总结与原生代码的区别:优点:缺点: 参考 本文将介绍什么…

二维数组笔试题及其解析

Lei宝啊 :个人主页 愿所有美好不期而遇 前言: 数组名在寻常情况下表示首元素地址,但有两种情况例外: 1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小 2.&数组名,这里的…

Hystrix和Sentinel熔断降级设计理念

目录 1 基本介绍2 Hystrix信号量和线程池区别2.1 信号量模式2.2 线程池模式2.3 注意 3 Sentinel介绍 1 基本介绍 Sentinel 和 Hystrix 的原则是一致的: 当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源…

目前无法建立VS2013与Qt的连接???

因为下载组件的时候,没有哪个选项,还是没有MSVC2013

微信小程序集成腾讯im,会话列表数据过多(长列表),卡顿问题的解决

说明 我这边用小程序集成im,然后结合公司的需求,做了一个聊天的小程序,在测试上线的时候没有问题,结果到客户那边,因为他们聊天的人多,会话列表达到了300多条,然后点击会话列表,进入…

C#,《小白学程序》第十六课:随机数(Random)第三,正态分布的随机数的计算方法与代码

1 文本格式 // 定义一个全局性&#xff08;公共&#xff09;的随机数发生器&#xff0c;便于大家&#xff08;各函数&#xff09;后面共同使用。 Random global_rnd new Random(); /// <summary> /// 生成服从标准正态分布的随机数 /// https://zhuanlan.zhihu.com/p/6…

Postern配置HTTP和HTTPS的步骤

Postern是一款强大的Android代理工具&#xff0c;它允许您在设备上配置全局代理来实现安全、隐私保护和自由上网。本文将详细介绍如何使用Postern在Android设备上配置HTTP和HTTPS代理&#xff0c;为您提供更便捷的上网体验。 步骤1&#xff1a;下载和安装Postern应用 首先&am…

pdf怎么合并在一起?几种方法快速合并

pdf怎么合并在一起&#xff1f;在处理PDF文件时&#xff0c;有时需要将多个PDF文件合并成一个文件。这种操作在日常学习、工作和生活中很常见。但是&#xff0c;如果没有专业的PDF工具&#xff0c;这项任务可能会变得非常繁琐、耗时和费力。因此&#xff0c;我们需要一款功能强…

Faster RCNN

【简介】 Faster RCNN[7]是第一个端到端&#xff0c;最接近于实时性能的深度学习检测算法&#xff0c;该网络的主要创新点就是提出了区域选择网络用于申城候选框&#xff0c;能几大提升检测框的生成速度。该网络首先输入图像到卷积网络中&#xff0c;生成该图像的特征映射。在特…

ActiveReportsJs 账票印刷

参考资料 官方文档 一. HTML部分 在页面上添加了Loading效果&#xff0c;账票印刷开始时显示Loading效果&#xff0c;印刷结束后隐藏Loading效果。ar-js-core.js是核心文件ar-js-pdf.js用来印刷PDFar-js-xlsx.js用来印刷EXCELar-js-locales.js用来设置语言 <!DOCTYPE htm…

优化SOCKS5的方法

在今天的互联网世界中&#xff0c;保护个人隐私和提升网络速度至关重要。作为一种常用的代理协议&#xff0c;SOCKS5代理服务器不仅可以保护您的隐私&#xff0c;还可以实现更快速的网络访问。本文将为您介绍一些优化SOCKS5代理服务器的方法&#xff0c;以提高网络速度和安全性…

阿里云2核4G服务器5M带宽五年租用价格表

阿里云2核4G服务器5M带宽可以选择轻量应用服务器或云服务器ECS&#xff0c;轻量2核4G4M带宽服务器297元一年&#xff0c;2核4G云服务器ECS可以选择计算型c7、c6或通用算力型u1实例等&#xff0c;买5年可以享受3折优惠&#xff0c;阿腾云分享阿里云服务器2核4G5M带宽五年费用表&…

Xcode,swift:Error Domain=kCLErrorDomain Code=1 (null)问题解决

问题描述: iOS开发时,当使用用户的位置权限时,获取用户经纬度报错:Error DomainkCLErrorDomain Code1 "(null)",错误域kCLError域代码1“(null)” 解决方法: 打开模拟机的设置-通用-语言与地区 将地区设置为中国(如果你的开发位置在中国的话) 点击左上方Features,选择…

发光太阳聚光器的蒙特卡洛光线追踪研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…