Linux学习记录——삼십오 传输层UDP协议

文章目录

  • 1、端口号
  • 2、UDP协议


信息加上应用层报头后,下一步发送到传输层

1、端口号

端口号标识了一个主机上进行通信的唯一一个应用程序。 在TCP/IP协议中,通过源IP,源端口号,目的IP,目的端口号,协议号来标识唯二的两个主机之间的通信。

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

在这里插入图片描述

Linux可通过命令: vim /etc/services来打开一个文件,里面有各个固定的端口号。自己写的程序在使用端口号时要避开知名端口号。

一个进程可以绑定多个端口号,一个端口号不能被多个进程绑定。

netstat命令。命令选项-nltp显示正在运行的网络连接,会显示端口号,去掉n就是显示对应的服务器,-ntp只显示tcp套接字的,有p就显示PID,-np就显示所有协议,-nup显示udp服务,-naup显示所有的udp服务。l仅列出有在监听(Listen)的服务状态。

pidof命令

在这里插入图片描述

在登陆云服务器,开始使用bash时,整个服务是由第一行/usr/sbin/sshd来做的,它就是守护进程,守护进程的名字都是d结尾。登陆后,会运行起一个子进程,看第一行的PID就能找到这个子进程,这个子进程通过程序替换把bash加载给用户去使用,加载的过程是将标准输入输出错误重定向到套接字中,然后用户输入的就是在网络中发送,服务端再给出响应。pidof可以获得sshd以及它启动的服务的PID,直接pidof sshd。pidof可以查看进程id,pidof后跟进程名。

2、UDP协议

在这里插入图片描述

上图是UDP报头 + 数据,数据就是有效载荷,有效载荷是上层通过send或者write这样的系统调用把数据发送给了传输层。UDP报头总共4字节,前16个比特位是源端口号,后16位是目的端口号。还有4字节,一半表示16位UDP长度,一半表示UDP检验和。

那么UDP的报头和有效载荷如何分离?通过上段得知,UDP报头是固定长度的,而且还知道UDP长度,这个长度减去8字节就是有效载荷的长度。报头中有目的端口号,那么就知道要交付给谁,有效载荷就能上交给应用层了。

了解上面的结构后,接下来再看这个结构对应到实际应当是什么样的报文,以及这些数据信息是怎么封装并发送,解包的。

tcp/ip是属于操作系统的,现在用的系统是Linux,Linux是用C写的,udp也就是C写的,任何报头都是遵守协议的,协议本质就是struct,struct有两个形式,结构体和位段,报头也是struct类型的。

struct udp_header
{
	uint16_t src_port;
	uint16_t dst_port;
	uint16_t udp_len;
	uint16_t check;
}

//上结构体,下位段

struct udp_header
{
	uint32_t src_port: 16;
	uint32_t dst_port: 16;
	uint32_t udp_len: 16;
	uint32_t check: 16;
}

客户端和服务端都认识udp协议,客户端应用层有一串数据,要拷贝给系统内部,做法就是定义一个缓冲区,用char指针指向它,让指针往后走8个字节,拷贝进有效载荷,也就是应用层的数据;指针回到一开始,给它强转成struct udp_header类型,填写各个成员,比如指针p,((struct udp_header)p)->src_port = …,这时候就完成了封装;服务端收到后,开始提取,也是定义一个char*指针s,s + sizeof(struct udp_header)就指向了有效载荷起始处,拿到了有效载荷,回到起始位置,强转成struct udp_header类型,获取4个成员们,就成功分离,并拿到所有信息了,这也就是解包。

应用层因为协议变化多,所以需要协议配合序列化反序列化;而传输层的TCP和网络层的IP协议定下后就不会怎么变了,所以用结构体就可以,也节省空间。

如果检验和出错,就直接丢弃报文。16位UDP长度表示整个数据报(UDP报头 + UDP数据)的最大长度。

UDP的特点

无连接:知道对端的IP和端口号就可以进行传输
不可靠:没有确认机制,没有重传机制,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息,直接丢弃报文,也就是丢包了。客户端创建套接字,服务器创建套接字绑定就可以传。
面向数据报:不能够灵活地控制读写的次数和数量。

如果报文不对,UDP的检验和就会出错,UDP层就丢弃这个报文,所以UDP一定会保证报文的正确,然后再发送出去。每一层都是如此,别人发出来什么报文,我这层就一定能得到什么报文,这就是面向数据报。发送端调用一次sendto,发送100个字节,接收端也必须调用对应的一次recvfrom,接收100个字节,而不能循环接收,每一次都接收10个字节。

UDP没有真正意义上的发送缓冲区。调用sendto会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作;UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;如果缓冲区满了,再到达的UDP数据就会被丢弃。不保证顺序就表明了UDP的不可靠性。UDP的socket既能读也能写,这就是全双工,半双工则意味着一次只能读或者写。

UDP协议首部中有一个16位的最大长度,2的16次方个比特位,也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部),然而64K在当今的互联网环境下,是一个非常小的数字,如果我们需要传输的数据超过64K,就需要在应用层手动的分包,多次发送,并在接收端手动拼装。

基于UDP的应用层协议

在这里插入图片描述

结束。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

静态网页设计——红旗汽车官网(HTML+CSS+JavaScript)

前言 声明:该文章只是做技术分享,若侵权请联系我删除。!! 感谢大佬的视频: https://www.bilibili.com/video/BV1gK411x7Bg/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术:HTMLCSSJS(…

Maven(mvn)的学习下载和配置

文章目录 Maven(mvn)1.Maven 是什么?2.Maven做什么?2.1传统方式对项目的管理2.2Maven对jar包的管理 3.Maven怎么学3.1Maven如何创建项目3.2Maven的下载与配置3.3Maven的项目结构3.4Maven依赖的引入3.5Maven依赖的剔除3.6Maven依赖…

【教学类-09-04】20240102《游戏棋N*N》数字填写,制作棋子和骰子

作品展示 背景需求: 最近在清理学具材料库,找到一套1年多前的《N*N游戏棋》,把没有用完的棋盘拿出来,,想给大4班换花样,并把它们用掉。 程序代码在这里 【教学类-09-03】20221120《游戏棋10*10数字如何直接…

GUI三维绘图

绘制三维图plot3 t0:pi/50:10*pi; xsin(t); ycos(t); zt; plot3(x,y,z); 产生栅格数据点meshgrid 这个接口在绘制三维图像里面相当重要,很多时候要将向量变成矩阵才能绘制三维图。 x0:0.5:5; y0:1:10; [X,Y]meshgrid(x,y); plot(X,Y,o); x和y是向量,…

124基于matlab的禁忌搜索算法和蚁群优化算法优化TSP路径

基于matlab的禁忌搜索算法和蚁群优化算法优化TSP路径,动态输出路径规划过程及输出最小距离。数据可更换自己的,程序已调通,可直接运行。需要直接拍下,拍下后发邮箱。标价为程序价格,不包含售后。程序保证可直接运行。 …

1.大数据概述

目录 概述hadoophadoop 模块hadoop 发行版apache社区版本CDP(CDHHDP)其它云产商框架选择 hadoop 安装 结束 概述 先了解几个常用的网站 apache 官网hadoop 官网hadoop githubhttps://github.com/apache/xxx [https://github.com/apache/spark (example)] hadoop hadoop 模块…

Linux内核--进程管理(六)内核进程管理几种CPU调度策略

目录 一、引言 二、CPU调度的直观想法 ------>2.1、FIFO ------>2.2、Priority ------>2.3、调度矛盾 三、各种CPU调度算法 ------>3.1、FCFS(First Come,First Served) ------>3.2、SJF(Short Job First,短作业优先) ------>3.3、RR算法(按时间片…

使用idea构建父子类springboot项目教程

第一步创建一个父类java项目(最外层java项目) 1.点击File 然后点击new 再点击Project 2.点击Maven 配置Java版本 再点击next 3.GroupId:包结构,ArtifactId:项目名称,填写完,点击next 4.点击…

MATLAB - MPC - 优化问题(Optimization Problem)

系列文章目录 前言 模型预测控制可在每个控制间隔内解决一个优化问题,具体来说就是二次规划(QP)。求解结果决定了被控对象在下一个控制间隔之前使用的操纵变量(MV)。 该 QP 问题具有以下特点: 目标或 "成本 "函数 - …

智慧旅游景区解决方案:PPT全文49页,附下载

关键词:智慧景区建设,智慧旅游平台,智慧旅游运营检测系统项目,智慧文旅,智慧景区开发与管理,智慧景区建设核心,智慧景区开发与管理 一、智慧景区建设现状 1、基础设施建设:智慧景区…

Linux Debian12系统gnome桌面环境默认提供截屏截图工具gnome-screenshot

一、简介: 在Debian12中系统gnome桌面环境默认提供一个截图捕获工具screenshot,可以自定义区域截图、屏幕截图、窗口截图和录制视频,截图默认保存在“~/图片/截图”路径下。 可以在应用程序中搜索screenshot,如下图: 也可以在桌面右上角找到…

Windows安装DolphinDB,配置单节点启动与GUI

1. 安装Java 首先,进入网址:jdk11 下载jdk-11.0.20_windows-x64_bin.exe,然后安装即可 安装完成后,打开命令提示符,输入: java javac如果这两个命令都出现一大堆东西,而不是找不到指令的提示的…

pycharm调整漂亮的颜色主题

主题样式: 一、设置主题为白色 二、pycharm 如何设置字体颜色 打开pycharm编辑器,file > settings > editor > color scheme > python > 你也可以直接用我资源中的配置好的文件

Leetcode刷题笔记题解(C++):无重复字符的最长子串

思路: 利用滑动窗口的思想,用起始位置startindex和curlength来记录这个滑动窗口的大小,并且得出最长距离;利用哈希表来判断在滑动窗口中是否存在重复字符,代码如下所示: class Solution { public:int len…

【深度学习每日小知识】数据增强

数据增强是通过对原始数据进行各种转换和修改来人工生成附加数据的过程,旨在增加机器学习模型中训练数据的大小和多样性。这对于计算机视觉领域尤为重要,因为图像经常被用作输入数据。 计算机视觉中的数据增强 数据增强的主要目标是解决过拟合问题&…

死锁与读写锁

一、死锁 死锁(Deadlock)是在并发计算中的一种状态,其中两个或多个进程无法继续执行,因为每个进程都在等待另一个进程释放所占用的资源。这种情况通常发生在系统中的资源分配过程中,其中每个进程都占用一些资源&#…

Java反射篇----第二篇

系列文章目录 文章目录 系列文章目录前言一、实现Java反射的类:二、反射机制的优缺点:三、Java 反射 API前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、实现…

34534

在10.2节中介绍垃圾回收线程时说过,当触发YGC时会产生一个VM_GenCollectFor-Allocation类型的任务,VMThread线程会调用VM_GenCollectForAllocation::doit()函数执行这个任务。在doit()函数中调用GenCollectorPolicy::satisfy_failed_allocation()函数处理…

win10报错“zlib.dll文件丢失,软件无法启动”,修复方法,亲测有效

zlib.dll文件是一个由Zlib创建的动态链接库文件,它是用于Windows操作系统的数据压缩和解压缩的软件。Zlib是一个广泛使用的软件库,广泛应用在许多不同类型的软件中,包括游戏、浏览器和操作系统。 zlib.dll的主要作用是提供数据压缩和解压缩的…

Ubuntu20.04安装ROS2 Foxy

Ubuntu20.04安装ROS2 Foxy 实操安装 安装ROS2的教程在网上很多,但是我操作之后都有问题,大部分的问题是在 sudo apt update 时访问packages.ros.org无法成功,主要的原因是没有外网,而自己整一个外网代理又非常麻烦,所…