传输层协议—UDP协议

news2024/11/25 18:47:50

传输层协议—UDP协议

文章目录

  • 传输层协议—UDP协议
      • 传输层
      • 再谈端口号
      • 端口号范围划分
      • pidof
      • netstat
    • UDP协议端格式
      • UDP报文
      • UDP特点
      • UDP缓冲区
      • 基于UDP的应用层协议

传输层

在学习HTTP/HTTPS等应用层协议时,为了方便理解,可以简单认为HTTP将请求和响应直接发送到网络中。实际上HTTP是将数据打包交付给下层传输层,然后传输层协议对该数据进行处理后继续向下交付,该过程贯穿成功网络协议栈,最后才将数据发送到网络中。

传输层负责将数据通过网络发送到对方主机的传输层的接收缓冲区中。因此为了方便理解,在学习传输层协议时可以简单认为传输层是直接将数据发送到网络中。

再谈端口号

端口号(Port)标识了一个主机上进行通信的不同的应用程序

当主机从网络中获取到对方发送过来的数据时,将数据自底向上进行解包交付,交付到传输层时,传输层协议要通过端口号将数据交付给应用层的指定进程(程序)。

image-20231001161950968

  • 由于端口号属于传输层概念,因此自底向上交付到传输层的报文的报头内就含有端口号,解包后传输层协议能拿到该端口号,根据该端口号将有效载荷交付给对应的程序。

五元组标识一个通信

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

  • 源IP和源端口号标识发来报文的来源主机和来源服务程序,目的IP标识网络中接收数据的主机,目的端口号标识的是传输层向上交付的应用层服务程序。
  • 协议号标识的是发送方接收方双方规定所使用的协议。

image-20231001163026001

例如服务器的IP是172.20.100.32,该服务器上有多进程版服务程序。有两个客户端连接上了服务器。因此服务器收到不同的客户端发送来的请求,是根据源IP区别出不同的主机、根据源端口号区别出目标主机上的不同程序。而客户端B发送请求给服务器需要根据目的IP找到服务器主机,目的端口号找到目标主机的服务程序。

image-20231001184231904

  • 通过源IP、目标IP、协议号、源端口号、目的端口号这五个数字标识一个通信。

五元组可以通过netstat -n查看

image-20231002123336854

  • 假如本地是服务器,那么从服务器的角度查看,Local Address对应的是目的IP和目的端口号,Foreign Address对应的是源IP和源端口号。

端口号范围划分

0—1023:知名端口号,例如HTTP,FTP,SSH等这些广为使用的应用层协议,这些端口号都是固定的。

知名端口号有:

  • ssh服务器, 使用22端口
  • ftp服务器, 使用21端口
  • telnet服务器, 使用23端口
  • http服务器, 使用80端口
  • https服务器, 使用443

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

可以通过指令查询刀知名端口号

cat /etc/services

image-20231002114755196

因此我们自己写服务器使用端口号时,就需要避开这些知名端口号。

  1. 一个端口号是否可以被多个进程bind?

数据自底向上交付时,在传输层需要找到数据报头内含的目的端口号对应的进程,并交付给该进程,这注定着一个端口号只能标识一个进程,不能一个端口号标识多个进程。因此一个端口号只能被一个进程bind。

  1. 一个进程是否可以bind多个端口号?

一个端口号只能bind一个进程,但一个进程可以bind多个端口号。服务器具备多种功能时,客户端就需要根据不同的功能,选择不同的端口号进入同一个服务器,即从不同的端口号进入同一个进程。

pidof

pidof 进程:查询到该进程的pid。

image-20231002120619634

xargs:将管道传输过来的内容尾接到后面的指令后面。例如图中的 pid httpserver | xargs kill -9管道传输过来httpserver的pid,xargs将该pid尾接到kill -9后面即给httpserver进程发送9号命令。

netstat

netstat 是一个用于查看网络连接和网络统计信息的命令行工具。它可以用来显示当前系统上的网络连接、路由表、接口统计信息等等。在 Linux 系统中,netstat 命令的用法如下:

netstat [options]

一些常用的选项包括:

  • -a:显示所有的连接,包括监听中和已建立的连接。
  • -t:显示 TCP 协议的连接。
  • -u:显示 UDP 协议的连接。
  • -n:以数字形式显示 IP 地址和端口号,而不是尝试进行 DNS 解析。
  • -p:显示与连接关联的进程信息。
  • -r:显示路由表。
  • -l:仅显示监听中的连接。
  • -atun:显示所有的TCP和UDP连接

image-20230825190401543

注意一下:这里出现了两个连接,原因在于服务器和客户端在同一台主机上,即服务器和客户端完成了本地环回,因此能看到两个连接。

UDP协议端格式

UDP报文

image-20231002124703979

  • 报文=报头+有效载荷。报头长度为8字节,即UDP报头为固定报头,当传输层收到UDP报文时,提取前8字节,剩下的为有效载荷,直接向上交付给应用层即可。
  • 报头内含16位源端口号,16位目的端口号,16位UDP长度,16位UDP校验和。当发送UDP报文给对方时,需要对整个UDP报文做检查,16位UDP校验和标识UDP报文的完整性。对方收到UDP报文后,先对整个UDP报文做检查,也形成一个16位UDP校验和,然后将形成的校验和与UDP报头的校验和做比对,若相同则说明UDP报文完整,没有在传输途中发生报文丢失。若校验和出错,就会直接将UDP报文丢弃。
  • 源端口号和目的端口号的长度是16位的原因是内核的端口号也是16位的,底层决定了上层数据长度。
  • 16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的最大长度。而2的16次方大约是64kb,这意味着UDP报文大小最大为64kb。因此通过UDP通信,报文大小大于64KB时,就需要将一个报文拆解成多个报文进行发送。
  • 应用层将数据以UDP协议的方式发送到网络中,其实是将数据自顶向下做封装。传输层拿到应用层交付的数据后,给该数据添加UDP报头,然后继续向下交付。

image-20231002155011305

  • 实际上报头是OS层面定制的协议。由于Linux内核是由C语言写的,因此可以把报头看作是一个结构体struct udp_hdr,那么传输层收到应用层交付过来的数据时,先开辟一块空间,空间容纳一个报头大小,将报头里面的属性填充,最后加上数据就成为一个报文了。

UDP特点

  • 无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接。
  • 不可靠:没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层 返回任何错误信息。UDP在传输层交付給下层就不关心了,即掉包后没有反应。
  • 面向数据报:不能够灵活的控制读写数据的次数和数量,給多少发多少。sendto 几次recvfrom几次。相比于:TCP可能发了很多次,而接收要根据应用层实现。

UDP缓冲区

image-20231002150359165

  • UDP没有真正意义上的发送缓冲区. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后 续的传输动作。没有发送缓冲区使得上层应用层的send/write函数调用完直接返回,不用阻塞。因为该函数直接将数据拷贝到传输层,由传输层自主决定将数据拷贝到OS的内核缓冲区,拷贝完直接返回,因此函数不关心数据的发送。
  • UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致。如果缓冲区满了, 再到达的UDP数据就会被丢弃;
  • UDP的socket即能够读也能够写,虽然没有发送缓冲区,但是有接收缓冲区,因此通过UDP协议通信可以完成全双工通信。

基于UDP的应用层协议

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

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

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

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

相关文章

基于Java的图书个性化推荐系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

基于Java的校园失物招领平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

E. Mishap in Club

题目: 样例1: 输入 --输出 1 样例2: 输入 --- 输出 3 思路: 数学贪心模拟思路,由于不知道在俱乐部的人数和在外面的人数,又要尽可能少的人数,那么定义两个变量,一个是里面的人数 i…

Python中使用IDLE调试程序

在IDLE中,使用菜单栏中的“Debug”对IDLE打开的python程序进行调试。 1 打开调试开关 选择IDLE菜单栏的“Debug->Debugger”,如图1①所示;此时在IDLE中会显示“[DEBUG ON]”,即“调试模式已打开”,如图1②所示&am…

JMeter学习第三天+

性能测试前言 老师开局一句话:性能测试和你会不会JMeter一点关系没有…… 作者坚持技多不压身的原则,还是多学一点JMeter吧,看老师到底要怎么讲下去,什么并发量、吞吐量啥的…… 性能测试的核心思想:在于创造大量并发去…

16,8和4位浮点数是如何工作的

50年前Kernighan、Ritchie和他们的C语言书的第一版开始,人们就知道单精度“float”类型有32位大小,双精度类型有64位大小。还有一种具有扩展精度的80位“长双精度”类型,这些类型几乎涵盖了浮点数据处理的所有需求。但是在最近几年&#xff0…

Javase ------> 泛型

Jdk自从5.0后引入泛型之后一直没有删除,而且在我们的集合框架中进场能使用的到,今天我们就详细介绍一下泛型的一些特性和使用须知,希望能对你的编程学习带来一些帮助. 1.什么是泛型 泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参&…

c# 中的类

反射 Activator.CreateInstance class Program {static void Main(string[] args){//反射Type t typeof(Student);object o Activator.CreateInstance(t, 1, "FJ");Student stu o as Student;Console.WriteLine(stu.Name);//动态编程dynamic stu2 Activator.Cre…

【算法】二分相关题目

文章目录 二分相关二分查找在排序数组中查找元素的第一个和最后一个位置寻找峰值x 的平方根0~n-1中缺失的数字## 搜索插入位置 二分相关 二分查找 https://leetcode.cn/problems/binary-search/ 在一个有序数组当中,查找值为target的元素,返回下标 cla…

SSM - Springboot - MyBatis-Plus 全栈体系(十七)

第三章 MyBatis 五、MyBatis 高级扩展 1. mapper 批量映射优化 1.1 需求 Mapper 配置文件很多时,在全局配置文件中一个一个注册太麻烦,希望有一个办法能够一劳永逸。 1.2 配置方式 Mybatis 允许在指定 Mapper 映射文件时,只指定其所在的…

2023年中国家用智能门锁市场发展概况分析:家用智能门锁线上市场销量290.4万套[图]

智能门锁是指区别于传统机械锁的基础上改进的,在用户安全性、识别、管理性方面更加智能化简便化的锁具。智能门锁是门禁系统中锁门的执行部件。智能门锁区别于传统机械锁, 是具有安全性, 便利性, 先进技术的复合型锁具。 智能门锁级别分类 资料来源:共研…

MARS: An Instance-aware, Modular and Realistic Simulator for Autonomous Driving

● MARS: An Instance-aware, Modular and Realistic Simulator for Autonomous Driving(基于神经辐射场的自动驾驶仿真器) ● https://github.com/OPEN-AIR-SUN/mars ● https://arxiv.org/pdf/2307.15058.pdf ● https://mp.weixin.qq.com/s/6Ion_DZGJ…

flink处理函数--副输出功能

背景 在flink中,如果你想要访问记录的处理时间或者事件时间,注册定时器,或者是将记录输出到多个输出流中,你都需要处理函数的帮助,本文就来通过一个例子来讲解下副输出 副输出 本文还是基于streaming-with-flink这本…

解决SpringBoot Configuration Annotation Processor not configured

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 问题描述 在使用ConfigurationProperties注解和EnableConfigurationProperties注解时,IDEA报错:SpringBoot Configuration Annotation Processor no…

【chainlit】使用chainlit部署chatgpt

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

微服务架构改造案例

最后一个部分,结合我们自己的财务共享平台项目进行了微服务架构改造案例分析。 对于改造前的应用,实际上存在四个方面的问题。 其一是关于高可用性方面的,即传统的单体应用我们在进行数据库水平扩展的时候已经很难扩展,已经出现…

XShell远程连接Ubuntu

环境 系统:Ubuntu 18.04.6 LTS IP:192.168.1.4 ps:查看ubuntu版本 lsb_release -a 查看ubuntu的ip地址 Ubuntu系统准备工作 root权限 打开ubuntu系统后,打开终端,切换为root权限:su root 如果出现su root认证失…

管理经济学基本概念(五):一些基本术语

1、理性-行动者范式 使经济学家行动一致的东西就是采用理性-行动者范式来预判人的行为。简单地说,这个范式认为人们的行动式理性的、优化的和自利的。 2、税后净营业利润 税后经营净利润(NOPAT)是指将公司不包括利息收支的营业利润扣除实付所得税税金之后的数额加…

Acwing 907. 区间覆盖

Acwing 907. 区间覆盖 知识点题目描述思路讲解代码展示 知识点 贪心 题目描述 思路讲解 代码展示 #include <iostream> #include <algorithm>using namespace std;const int N 100010;int n;struct Range {int l, r;bool operator < (const Range &W) …