深入理解udp

1.再谈端口号

1.1复习

在这里插入图片描述

我们上一篇谈了很久的应用层的http,并在此前我们使用socket编程写了一个能相互通信的客户端与服务端,但是我们也只是粗略的理解了一下tcp和udp在编程过程中所形成的差异性,并没有实质去了解一下其详细内容,那么这篇文章就来详细介绍一下传输层协议用到的udp协议,当然其他协议我们会在后面为大家一一讲解

1.2端口号

端口号用于标识一台主机上唯一的进程。(前面文章具体提到过)

当主机从网络上获取数据之后 ,这个数据要交给哪个应用程序就是由端口号决定的。

在网络通信中,数据在向上层进行交付时,传输层协议(如TCP或UDP)会提取出数据报文中的目的端口号。目的端口号指示了应该将数据交付给当前主机上的哪个服务进程。

实际上通过端口号能找到的是我们的进程ID的,其原因是因为内核中用哈希的方式维护了端口号与进程ID之间的映射关系,传输层可以通过端口号得到对应的进程ID 进而找到对应的应用层进程。

1.3端口号范围划分
  • 0 - 1023: 知名端口号, HTTP, FTP, SSH等这些广为使用的应用层协议, 他们的端口号都是固定的。

  • 1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的。

    有些服务器是非常常用的, 为了使用方便, 人们约定一些常用的服务器, 都是用以下这些固定的端口号:

ssh服务器, 使用22端口

ftp服务器, 使用21端口

telnet服务器, 使用23端口

http服务器, 使用80端口

https服务器, 使用443

平常我们自己写端口号的时候需要尽量避免这些端口号。

1.4五元组

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

在这里插入图片描述

通过netstat命令可以查看到这样的五元组信息:

在这里插入图片描述

  • Proto – 协议号

  • Local Address – 源IP地址和源端口号

  • Foreign Address – 目的IP地址和目的端口号

    netstat是一个用来查看网络状态的重要工具

    其常见的选项如下:

    • n:拒绝显示别名 能显示数字的全部转换成数字

    • l:仅列出处于LISTEN(监听)状态的服务

    • p:显示建立相关链接的程序名

    • t(tcp):仅显示tcp相关的选项

    • u(udp):仅显示udp相关的选项

    • a(all):显示所有的选项 默认不显示LISTEN相关

      pidof命令

      在查看服务器的进程id时非常方便.

      语法:pidof [进程名]

      功能:通过进程名, 查看进程id

    当然这里提到了协议号,这里简单介绍一下其定义:

    协议号是网络通信中用于标识不同网络协议的数字。每个网络协议都会被分配一个唯一的协议号,以便在数据包传输过程中能够正确地识别和路由数据。

2.UDP协议

2.1udp协议端格式

在这里插入图片描述

在这里插入图片描述

  • 16位源端口号表示数据从哪里来
  • 16位目的端口号标识数据要去哪里
  • 16位UDP长度:表示整个数据报(UDP首部+UDP数据)的长度
  • 16位UDP检验和:如果UDP报文的检验和出错 就会直接将报文丢弃

我们在应用层看到的端口号大部分都是16位的 其根本原因就是因为传输层协议当中的端口号就是16位的

2.2报头与有效载荷的分离

UDP的报头当中只包含四个字段, 每个字段的长度都是16位, 总共8字节。

因此UDP采用的实际上采用的是一种定长报头, UDP在读取报文时读取完前8个字节后剩下的就都是有效载荷了。

2.3udp的数据封装与解包
  • 当应用层将数据交给传输层后 ,在传输层就会创建一个UDP报头类型的变量,然后填充报头当中的各个字段 ,此时就得到了一个UDP报头。

  • 此时操作系统再在内核当中开辟一块空间 ,将UDP报头和有效载荷拷贝到一起 ,此时就形成了UDP报文。

  • 当传输层从下层获取到一个报文后 ,就会读取该报文的前8个字节, 提取出对应的目的端口号。

  • 通过目的端口号找到对应的上层应用层进程 ,然后将剩下的有效载荷向上交付给该应用层进程。

2.4udp协议的特点
  • 无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接;

  • 不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层

    返回任何错误信息;

  • 面向数据报: 不能够灵活的控制读写数据的次数和数量;

应用层交给UDP多长的报文 ,UDP就原样发送, 既不会拆分 ,也不会合并, 这就叫做面向数据报。

也就是说我们如果使用UDP传输一百字节的数据的话:

如果我们发送端调用了十次sendto, 发送100字节的数据 ,每次发送十字节 ,那么接收端也必须调用十次recvfrom来接受这100字节的数据。

2.5udp的缓冲区

为什么会造成上述的这种面向数据报的特性呢?

因为UDP没有真正意义上的 发送缓冲区, 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后

续的传输动作;

但是UDP具有接收缓冲区。可这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; 如果

缓冲区满了, 再到达的UDP数据就会被丢弃。

UDP的socket既能读, 也能写, 这个概念叫做 全双工

2.6udp的使用注意事项

需要注意的是 UDP协议报头当中的UDP最大长度是16位的, 因此一个UDP报文的最大长度是64K。(包含UDP报头的大小)

然而64K在当今的互联网环境下 ,是一个非常小的数字 ,如果需要传输的数据超过64K, 就需要在应用层进行手动分包 ,多次发送, 并在接收端进行手动拼装。

2.7基于udp的应用层协议
  • NFS:网络文件系统
  • TFTP:简单文件传输协议
  • DHCP:动态主机配置协议
  • BOOTP:启动协议(用于无盘设备启动)
  • DNS:域名解析协议

当然 ,也包括你自己写UDP程序时自定义的应用层协议。

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

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

相关文章

若依笔记(四):代码生成器

已知使用MyBatisPlus代码生成器可以自动生成Entity、Mapper、Service、Controller代码,前提是数据库中有数据表,生成pojo类以及对于该数据表的增删改查命令的代码,若依更进一步能选择表后生成代码、预览、下载,同时可以生产前端代…

指挥通信车360度3d虚拟互动展示系统的优势及特点

通信车是装有通信装备,用于保障通信联络的专用车辆,用于偏僻/特殊环境下的机动通信。并且机动通信局装备通常分为应急综合通信车、网络管理车、程控电话车、自适应跳频电台车、数字扩频接力车、散射通信车、卫星通信车、光缆引接车、线缆收放车和通信电源…

[idea]关于idea开发乱码的配置

在JAVA开发中,一般统一设置为UTF-8的编码,包括但不限于开发工具、日志架构、虚拟机、文件编码等。常见配置如下: 1、IDEA工具 在idea64.exe.vmoptions、idea.exe.vmoptions中添加: -Dfile.encodingUTF-8 2、JAVA 运行在window…

用前端框架Bootstrap的AdminLTE模板和Django实现后台首页的页面

承接博文 用前端框架Bootstrap和Django实现用户注册页面 继续开发实现 后台首页的页面。 01-下载 AdminLTE-3.1.0-rc 并解压缩 以下需要的四个文件夹及里面的文件百度网盘下载链接: https://pan.baidu.com/s/1QYpjOfSBJPmjmVuFZdSgFQ?pwdo9ta 下载 AdminLTE-3.1…

2 关系型数据库是如何工作的

很多人在学习数据库知识的时候,知识点都是比较分散的,本章旨在将数据库知识进行整合串联,使之可以达到知其所以然的地步。 从数据结构说起 (1)时间复杂度 对于数据库本身而言,重要不仅仅是数据量,而是在数据量增长之…

关键词搜索亚马逊商品数据接口(标题|主图|SKU|价格|优惠价|掌柜昵称|店铺链接|店铺所在地)

亚马逊提供了API接口来获取商品数据。其中,关键词搜索亚马逊商品接口(item_search-按关键字搜索亚马逊商品接口)可以用于获取按关键字搜索到的商品数据。 通过该接口,您可以使用API Key和API Secret来认证身份,并使用…

电子电器架构 —— 车载网关初入门(二)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 PS:小细节,本文字数5000+,详细描述了网关在车载框架中的具体性能设置。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他…

麒麟KYLINIOS软件仓库搭建01-新创建软件仓库服务器

原文链接:麒麟KYLINIOS软件仓库搭建01-新创建软件仓库服务器 hello,大家好啊,今天给大家带来麒麟桌面操作系统软件仓库搭建的文章01-新创建软件仓库服务器,本篇文章主要给大家介绍了如何在麒麟桌面操作系统2203-x86版本上搭建内网…

MySQL数据库操作、表操作和常用数据类型

1、数据库操作 1.1 创建数据库 语法:CREATE DATABASE [IF NOT EXISTS] 数据库名 charset utf8;(注意字母不区分大小写,分号为英文输入法),[ ]为可选项,意思为如果系统没有想要创建(数据库名&am…

酷克数据出席永洪科技用户大会 携手驱动商业智能升级

10月27日,第7届永洪科技全国用户大会在北京召开。酷克数据作为国内云原生数仓代表企业,受邀出席本次大会,全面展示了云数仓领域最新前沿技术,并进行主题演讲。 携手合作 助力企业释放数据价值 数据仓库是商业智能(BI…

Simulink的To Workspace

To Workspace模块将Simulink产生的数据存储到matlab的工作区。 用To Workspace模块中的数据进行绘图。 参见Matlab/simulink/simscape multibody-to wotkspace模块使用_to workspace模块_五VV的博客-CSDN博客To workspace模块入门详解_哔哩哔哩_bilibili(很好&#…

[极客大挑战 2019]LoveSQL 1

题目环境:判断注入类型是否为数字型注入 admin 1 回显结果 否 是否为字符型注入 admin 1 回显结果 是 使用堆叠注入 采用密码参数进行注入 爆数据库1; show database();#回显结果 这里猜测注入语句某字段被过滤,或者是’;被过滤导致不能堆叠注入 爆字段数…

项目资源不足,常见的5种处理方式

软件开发中,经常会遇到项目资源不足的情况,项目团队如果无法及时获得所需的人力、财力、物力等资源,往往会影响团队士气以及任务质量,造成无法按时完成任务,进而影响项目进度。 因此及时处理和应对资源不足的情况&…

Linux 命令|服务器相关

1. 在公共 linux 上创建 python 虚拟环境 【精选】在公共Linux服务器上创建自己的python虚拟环境_服务器创建自己的环境-CSDN博客 2. 查看现存的状态,看有没有程序在跑 nvidia-smi命令详解-CSDN博客 3. 上传本地文件到服务器 在本地 Mac 计算机的终端中&#x…

【MATLAB第81期】基于MATLAB的LSTM长短期记忆网络预测模型时间滞后解决思路(更新中)

【MATLAB第81期】基于MATLAB的LSTM长短期记忆网络预测模型时间滞后解决思路(更新中) 在LSTM预测过程中,极易出现时间滞后,类似于下图,与一个以上的样本点结果错位,产生滞后的效果。 在建模过程中&#xf…

【Python语言速回顾】——数据可视化基础

目录 引入 一、Matplotlib模块(常用) 1、绘图流程&常用图 ​编辑 2、绘制子图&添加标注 ​编辑 3、面向对象画图 4、Pylab模块应用 二、Seaborn模块(常用) 1、常用图 2、代码示例 ​编辑 ​编辑 ​编辑 ​…

kafka为什么如此之快?

天下武功,唯快不破。同样的,kafka在消息队列领域,也是非常快的,这里的块指的是kafka在单位时间搬运的数据量大小,也就是吞吐量,下图是搬运网上的一个性能测试结果,在同步发送场景下,…

Java SE 学习笔记(十七)—— 单元测试、反射

目录 1 单元测试1.1 单元测试概述1.2 单元测试快速入门1.3 JUnit 常用注解 2 反射2.1 反射概述2.2 获取类对象2.3 获取构造器对象2.4 获取成员变量对象2.5 获取常用方法对象2.6 反射的作用2.6.1 绕过编译阶段为集合添加数据2.6.2 通用框架的底层原理 1 单元测试 1.1 单元测试概…

【Linux】常见的Linux命令

目录 一、与目录有关的操作 二、与文件有关的操作 三、针对目录的操作 三、在linux上搭建环境 一、与目录有关的操作 1.ls 显示目录内容列表 ls / 这里的 / 表示根目录,相当于windows中的此电脑,linux中没有盘符。 ls -l / 显示详细信息 可以…

Redis Twemproxy 集群,水平扩展 ,扩容方案

文章目录 一、概述二、Twemproxy 分布模式三、测试规划四、Redis 服务实例准备4.1 配置Redis实例4.2 创建关资源4.3 启动Redis服务实例 五、Twemproxy 安装准备六、Twemproxy 安装及集群配置6.1 安装 Twemproxy6.2 配置 Twemproxy6.3 启动 twemproxy6.4 测试 twemproxy 集群 如…