Linux网络编程:传输层协议|UDP

知识引入:

端口号:

当应用层获得一个传输过来的报文时,这时数据包需要知道,自己应该送往哪一个应用层的服务,这时就引入了“端口号”,通过区分同一台主机不同应用程序的端口号,来保证数据传输的可靠性!

而我们在之前的学习知道,ip地址是唯一的地址标识,那么我们借助ip地址和端口号是不是就能找到网络中唯一的一台主机?答案是肯定的,这也就是传输层协议存在的意义之一!

 在TCP/IP协议中, 用 "源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信 

如图我们通过源ip和源端口号,就知道信息是从哪来的,知道了目的ip和目的端口号就知道信息是去往哪里的。那么就能够实现网络中唯二的两个进程通过网络进行进程间通信了!!!


端口号划分:

  • 0 - 1023: 知名端口号, HTTP, FTP, SSH等这些广为使用的应用层协议, 他们的端口号都是固定的.
  • 1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的.

查看网络连接状态命令:

// -ntpl n-带数字 t-TCP协议 p-服务名称 l-只查看listen服务
sudo netstat -ntpl
// ss命令也可以查网络服务
ss -nltp

常用选项:

  • n 拒绝显示别名,能显示数字的全部转化成数字l 仅列出有在 Listen (监听) 的服務状态
  • p 显示建立相关链接的程序名
  • t (tcp)仅显示tcp相关选项
  • u (udp)仅显示udp相关选项
  • a (all)显示所有选项默认不显示LISTEN相关

UDP协议

UDP协议端格式

如图:UDP协议报文前8字节为UDP协议的报头,后面的即为有效载荷。

我们知道网络传输需要解决的四个问题:

  • 报文如何将报头和有效载荷分离
  • 有效载荷如何向上交付给对应应用层程序
  • 报文内容是否完整
  • 报文内容是否有误

联系UDP协议格式,我们发现以上四个问题对应:

  • 解析固定报头长度来分开报头和有效载荷
  • 再通过目的端口号将有效载荷交付给应用层服务
  • 16位UDP长度对应着报文的长度(当长度不符时,直接丢包)
  • 而16位UDP检验和检测是否在传输过程中出现0变成1、1变成0

通过UDP协议报头的设计,那么我们就解决了网络传输的4个问题,而在这里我们也能理解报头(协议)是一个结构化字段。

struct UdpHeader
{uint32_t src_port:16;uint32_t dest_port:16;uint32_t length:16;uint32_t check_sum:16;
}

又因为传输层是实现在操作系统中,也就是操作系统需要维护获得的UDP报文,需要对UDP报文实现“先描述再组织”

如图为:发送端如何形成UDP报文结构示意

  1.  首先应用层需要存在报头的结构化对象和管理报文信息的sk_buff结构化对象
  2. 当用户准备通过sendto进行发送时,通过bind函数将对应端口号写入进报头信息中,另外有效载荷写入sk_buff指向的缓冲区中,这时有tail执行有效载荷的尾,_data指向有效载荷的头部(_data-_tail即为有效载荷的长度)
  3. 传输层首先将_data向左移动8个字节,给UDP的报头放入,接着完善报头中的报文长度信息和check_num(可能是一种哈希映射)
  4. 最终就形成了一段UDP报文

因为系统中可能存在多份待发送的UDP报文,所以我们需要通过数据结构来管理这些报文。最终UDP协议就实现了!!!

当接收端接收到UDP报文时:

  1. 先分开报头和有效载荷(通过分离前8个字节数据),然后读取报头中的报文长度,就能找到有效载荷
  2. 通过对有效载荷进行哈希散列,判断前后的check_num是否相等,不相等就丢弃报文。
  3. 获取到报文后就可以通过对应端口,找到接受端的应用层服务

最终我们就完成了UDP通信!!!

UDP的特点

UDP传输的过程类似于寄信,为什么这么说呢,这和UDP的特点有关

  • 无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接;
  • 不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层 返回任何错误信息;
  • 面向数据报: 不能够灵活的控制读写数据的次数和数量;(应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并; )

 我们在传输报文时,只要知道对端的地址就可以进行传输,不需要事先通知对方才能够寄信。另外,当我们写信出去后我们就无法获得这封信的状态,除非他被对方收到,并且返回收到信息给你。最终,信的寄和读都是一次的行为,跟你信里面写了多少内容无关,是一个整体。


值得注意的是:UDP协议允许报文最长为16位,也就是64k的大小,当我们传输的内容大于64k时,我们就需要多次将数据分为64kb的报文,接着不断传输。

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

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

相关文章

【VTKExamples::Utilities】第九期 FrameRate

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例FrameRate,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. FrameRate 该样例介绍 如…

【Mongo】索引结构

结论 Mongo3.2版本开始,索引的结构默认是B树。 起因 面试的时候,面试官问为什么Mongo DB底层使用B树而不是B树? 面试完赶紧恶补,结果发现面试官好像给我埋了个坑。。。 MongoDB官方描述: 翻译一下就是&#xff1…

JVM 内存布局深度解析,你所不知道的一面

作为Java开发者,想要写出高质量的代码,理解JVM的内存结构是必修课。本文将为您深度解析 Java 虚拟机(JVM)中的内存布局及其细节分析,让你在内存管理的道路上行稳致远。希望通过本文能让你彻底理解其中的奥秘。 一、内存布局概览 在我们深入具…

Python爬虫实战(实战篇)—17获取【CSDN某一专栏】数据转为Markdown列表放入文章中

文章目录 专栏导读背景结果预览1、页面分析2、通过返回数据发现适合利用lxmlxpath3、进行Markdown语言拼接总结 专栏导读 在这里插入图片描述 🔥🔥本文已收录于《Python基础篇爬虫》 🉑🉑本专栏专门针对于有爬虫基础准备的一套基…

电脑可以录音吗?这里有你想要的答案!

在数字化时代,电脑已经成为我们日常生活中不可或缺的工具。除了办公、娱乐等基本功能外,电脑还具备许多实用的辅助功能,其中之一就是录音功能。可是电脑可以录音吗?本文将介绍两种在电脑上录音的方法,希望通过本文的介…

客服快捷回复话术分享:618议价话术和催发货话术

随着618活动大促的临近,客服小伙伴们将迎来一年中最繁忙的时刻。面对顾客的议价、催发货等需求,我们应该如何回复才能既满足顾客的需求,又能保持良好的服务形象呢?下面就为大家分享一些议价和催发货的快捷回复话术,希望…

申请免费通配符SSL证书教程

申请免费通配符SSL证书的步骤相对直接,但需要注意的是免费且支持通配符的证书提供商较为有限,JoySSL是一个被多次提及提供此类服务的机构。以下是一个基于汇总信息的简明教程,帮助你申请免费的通配符SSL证书: 1. 准备工作 确认兼…

Android studio 连接 adb传输文件到电脑

前提是已经连接到adb window R: 打开控制台adb devices:可以查看已经连接的设备adb pull /storage/emulated/0/Download/aa.png C:\Users\Administrator\Desktop:拉取连接设备的文件 aa.png 到电脑桌面上 (在电脑控制台进行拉取操作) 如果…

C字符串和内存函数介绍(二)——长度不固定的字符串函数

前面我们一起学习了strlen,strcpy,strcmp,strcat的使用以及它们的模拟实现,它们的特点是你传参的时候,传过去的是数组首元素的地址,然后无论是计算长度,实现拷贝,相互比较还是进行追…

拓展虚拟世界边界,云手机可以做到吗

虚拟世界,AI,VR等词汇是21世纪最为流行的词汇,在科技背后,这些词汇的影响变得越来越大,已经走进了人们的世界,比如之前APPLE发布的vision pro,使人们能够更加身临其境的体验到原生os系统&#x…

如何理解Spring Boot自动配置原理和应用?

我们知道,基于Spring Boot,我们只需要在类路径中引入一组第三方框架的starter组件,就能在Spring容器中使用这些框架所提供的各项功能。这在当下的开发过程中已经习以为常,但在Spring Boot还没有诞生之前却是不可想象的。如果我们使…

这款信创FTP软件,可实现安全稳定的文件传输

信创,即信息技术应用创新,2018年以来,受“华为、中兴事件”影响,国家将信创产业纳入国家战略,并提出了“28n”发展体系。“8”具体指金融、石油、电力、电信、交通、航空航天、医院、教育等主要行业。目前企业使用比较…

0527_C++1

练习1&#xff1a; 定义自己的命名空间my_sapce&#xff0c;在my_sapce中定义string类型的变量s1&#xff0c;再定义一个函数完成对字符串的逆置。 #include <iostream>using namespace std; namespace my_space {string s1"hello world";void my_strreverse…

对比表征学习(一)Contrastive Representation Learning

对比表征学习&#xff08;二&#xff09;Sentence Embedding 主要参考翁莉莲的Blog&#xff0c;本文主要聚焦于对比损失函数 对比表示学习&#xff08;Contrastive Representation Learning&#xff09;可以用来优化嵌入空间&#xff0c;使相似的数据靠近&#xff0c;不相似的数…

数据结构(四)双向链表

文章目录 一、概念二、无头双向链表示意图三、操作&#xff08;一&#xff09;定义结构体&#xff08;二&#xff09;创建链表1. 函数定义2. 注意点3. 代码实现 &#xff08;三&#xff09;插入1. 函数定义2. 注意点3. 代码实现 &#xff08;四&#xff09;删除1. 函数定义2. 注…

B端:ElementUI、AntDesign、若依等看腻了,来点不一样的。

现在对ElementUI、AntDesign和若依这些 UI 框架感到厌倦了&#xff0c;本次给大家分享一些更加个性化的UI界面。

干货|图生代码实例整理,让你的代码更高效

前言 “图生代码”。这项新功能允许开发人员直接利用产品设计图一键生成相应的代码&#xff0c;极大地提高了编程效率和研发速度。甚至会未来软件开发可能迎来一场革命性的变革。但图生代码究竟能直到什么程度&#xff1f;本文结合一款图生代码的实例程序整理了一些有代表意义…

C语言 数组——排序算法的函数实现

目录 交换法排序 用交换法对成绩数组升序排序 选择法排序 冒泡法排序 归并法排序 交换法排序 用交换法对成绩数组升序排序 选择法排序 冒泡法排序 归并法排序

期望薪资30k字节java2面,A给B转账的同时B给A转账怎么并发量最高

一面 1、自我介绍 2、详细介绍一下自己的做的项目&#xff1f;根据项目提了一些问题 3、hashmap原理 4、B树原理&#xff1f; 5、final禁止重排序原理&#xff1f; 6、设计一个榨汁机类&#xff0c;面向对象怎么设计&#xff1f; 7、get、post区别&#xff0c;使用场景&…

已解决ModuleNotFoundError : No module named ‘pandas亲测有效!!!

已解决ModuleNotFoundError : No module named ‘pandas亲测有效&#xff01;&#xff01;&#xff01; 亲测有效 报错问题解决思路解决方法 报错问题 在运行Python代码时&#xff0c;你可能会遇到以下报错信息&#xff1a; ModuleNotFoundError: No module named pandas这个…