【网络编程】传输层协议——UDP协议

news2024/11/26 12:35:49

文章目录

  • 一、传输层的意义
  • 二、端口号
    • 2.1 五元组标识一个通信
    • 2.2 端口号范围划分
    • 2.3 知名端口号
    • 2.4 绑定端口号数目问题
    • 2.5 pidof & netstat命令
  • 三、UDP协议
    • 3.1 UDP协议格式
    • 3.2 如何理解报头?
    • 3.3 UDP协议的特点
    • 3.4 UDP缓冲区
    • 3.5 UDP传输最大长度

一、传输层的意义

数据从应用层下来并不是直接发送给网络,而是从网络协议栈自顶向下传输,经过传输层、网络层,数据链路层,最后通过硬件发送到网络。
前两章讲了应用层的两个协议:HTTP和HTTPS,应用层的主要目的是为了保证数据的安全,而传输层的目的则是为了保证数据能够可靠地传送到目标地址

二、端口号

2.1 五元组标识一个通信

端口号是用来标识一个主机上进行网络通信的不同的应用程序

因为主机上存在不同的服务,从网络中获取的数据在进行向上交付时,在传输层就会提取出该数据对应的目的端口号,进而确定该数据应该交付给当前主机上的哪一个服务进程(应用层)。即一台主机上可以同时部署端口号不同的服务。

在这里插入图片描述

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

举个例子,我们打开浏览器用不同的页面访问CSDN,虽然源IP地址是一样的,但是源端口号不同,就表示两个不同的通信。通过这个五元组,服务器就能准确的区分请求从哪里来的

  • 通信流程

1️⃣ 先提取出数据当中的目的IP地址和目的端口号,确定该数据是发送给当前服务进程的。
2️⃣ 然后提取出数据当中的协议号,为该数据提供对应类型的服务。
3️⃣ 最后提取出数据当中的源IP地址和源端口号,将其作为响应数据的目的IP地址和目的端口号,将响应结果发送给对应的客户端进程。

2.2 端口号范围划分

端口号的长度是16位,因此端口号的范围是0 ~ 65535:

0 ~ 1023:知名端口号。比如HTTP,FTP,SSH等这些广为使用的应用层协议,它们的端口号都是固定的。(类比120或110)
1024 ~ 65535:操作系统动态分配的端口号。客户端程序的端口号就是由操作系统从这个范围分配的。

2.3 知名端口号

有些服务器是非常常用的,这些服务器的端口号一般都是固定的:

ssh服务器——22端口。
ftp服务器——21端口。
telnet服务器——23端口。
http服务器——80端口。
https服务器——443端口。

  • 查看端口号

可以vim /etc/services文件,该文件是记录网络服务名和它们对应使用的端口号及协议。
在这里插入图片描述

2.4 绑定端口号数目问题

  • 一个端口号是否可以被多个进程绑定?

不行! 因为端口号的作用就是标识唯一的一个进程。如果绑定了多个进程怎么找到对应的进程呢?所以如果绑定一个已经被绑定的端口号,就会出现绑定失败的问题。

  • 一个进程能不能绑定多个端口号?

可以! 比方说绑定了两个端口号A和B,这两个端口号标识的是同一个进程 ,这与端口号用来标识进程的唯一性不冲突。

2.5 pidof & netstat命令

  • pidof命令

查看进程的pid

在这里插入图片描述
配合kill杀死一个进程:
在这里插入图片描述
这里的xargs是用来把从管道读取的数据拼接到kill -9的后边。

  • netstat命令

用来查看网络状态

选项:

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

查看TCP相关的网络信息时,一般选择使用nltp组合选项。
在这里插入图片描述
查看UDP相关的网络信息时,一般选择使用nlup组合选项。
在这里插入图片描述

三、UDP协议

3.1 UDP协议格式

在这里插入图片描述

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

我们在用户层使用端口一直用的是uint16_t,其根本原因就是因为传输层协议当中的端口号就是16位的。我们send数据并不是直接发送到网络里,而是发给了传输层。

  • 如何将报头和有效载荷分离?

UDP采用的是固定报头,UDP的报头当中只包含四个字段,每个字段的长度都是16位,总共8字节。所以直接提取前八个字节就是报头,其他的就是有效载荷。

  • UDP如何分用?(有效载荷交给上层的哪一个协议?)

应用层每个进程都绑定有端口号,UDP就是通过报头当中的目的端口号来找到对应的应用层进程的,把有效载荷交出去。

3.2 如何理解报头?

其实这里的报头就是一种结构化数据对象:

struct udp_hdr
{
    uint16_t src_port;// 源端口
    uint16_t dsc_port;// 目的端口
    uint16_t length;// UDP长度
    uint16_t check;// 校验和
};
  • UDP数据封装过程:

首先要知道应用层sendto数据是发给传输层的。

在这里插入图片描述
创建一块内存,计算出有效载荷的起始地址,拷贝有效载荷,强转填写报头部分。最后形成UDP报文。

  • UDP数据分用过程:

因为是定长报头,直接取出目的端口号,把有效载荷向上交付给指定协议(进程)。

3.3 UDP协议的特点

无连接:知道对端的IP和端口号就直接进行数据传输,不需要建立连接。
不可靠:没有确认机制,没有重传机制;如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息。
面向数据报:保证能读到完整的报文。

  • 面向数据报

这里就像快递一样,别人发了三个快递,那么我们一定要收到三个,不会收到一个,一个半。如果只有一个包裹,我们也不能只拿走一半。
发送了一个报文,要么不读,要么recvfrom等到读取完一整个报文返回。

如果发送端调用一次sendto,发送100字节,那么接收端也必须调用对应的一次recvfrom,接收100个字节;而不能循环调用10次recvfrom,每次接收10个字节。

3.4 UDP缓冲区

1️⃣ UDP没有真正意义的发送缓冲区,因为它没有可靠机制,不需要把数据暂存起来。它直接把数据拷贝到内核,由内核将数据传给网络层协议进行后续的传输动作。
2️⃣ UDP是有接收缓冲区的,但是不能保证收到的顺序就是发送的顺序。而且如果缓冲区满了,再来的UDP数据就会被丢弃

而UDP在读的过程中也能写,所以是全双工的。

  • 为什么UDP要有缓冲区?

如果UDP没有接收缓冲区,那么就要求上层及时将UDP获取到的报文读取上去,如果一个报文在UDP没有被读取,那么此时UDP从底层获取上来的报文数据就会被迫丢弃。

3.5 UDP传输最大长度

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

如果要传输大于64k的数据,就需要在应用层进行手动分包,多次发送,并在接收端进行手动拼装。

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

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

相关文章

基于linux下的高并发服务器开发(第一章)- GDB调试(1)1.13

掌握一个清屏快捷键&#xff1a;CTRLL 01 / 什么是GDB 02 / 准备工作 03 / GDB 命令 -- 启动、退出、查看代码 在~/Linux/lesson08目录下有test.c文件 #include <stdio.h> #include <stdlib.h>int test(int a);int main(int argc,char* argv[]){int a,b;printf(&…

React懒加载/动态加载(Suspense +lazy())简单实例

页面嵌套 两种页面嵌套的方式&#xff0c;一种是父子组件&#xff0c;一种是懒加载1、父子组件&#xff08;可略&#xff0c;只用来做例子对比&#xff09;2、使用懒加载 两种页面嵌套的方式&#xff0c;一种是父子组件&#xff0c;一种是懒加载 1、原本需要用父子组件来实现页…

计算机网络 day7 扫描IP脚本 - 路由器 - ping某网址的过程

目录 network 和 NetworkManager关系&#xff1a; 实验&#xff1a;编写一个扫描脚本&#xff0c;知道本局域网里哪些ip在使用&#xff0c;哪些没有使用&#xff1f; 使用的ip对应的mac地址都要显示出来 计算机程序执行的两种不同方式&#xff1a; shell语言编写扫描脚本 思…

selenium WebDriver 中的几种等待--sleep(),implicitly_wait(),WebDriverWait()

目录 强制等待:sleep() 隐式等待:implicitly_wait() 显示等待:WebDriverWait() 与until()或者until_not()方法结合使用 WebDriverWait与expected_conditions结合使用 显示等待,自定义等待条件 强制等待:sleep() import time sleep(5) #等待5秒 设置固定休眠时间&#x…

【JAVA】与数字相关的类,Number Math 类

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 前言数据类型Number类介绍数据格式化实例 Math类介绍静态常量实例 前言 为了解决对数字、日期和系统设置进行处理的困难&#xff0c;如&#xff1a;一些数字&数学问题、随机…

【iOS】—— 编译链接

【iOS】—— 编译链接 文章目录 【iOS】—— 编译链接编译流程预处理&#xff08;预编译Prepressing&#xff09;编译&#xff08;Compilation&#xff09;汇编&#xff08;Assembly&#xff09;链接&#xff08;Linking&#xff09; 编译流程 编译流程分为四步 预处理&#…

基于mediapipe的手势识别

安装opencv:pip install opencv-python 安装mediapipe:pip install mediapipe draw_utils.py: import cv2 import numpy as npdef draw_line(img, width, height, hand, start_index, stop_index):for i in range(start_index, stop_index):x1, y1 = int(hand.landma…

Unity 多相机 同屏显示

一 首先了解&#xff1a; 相机和Canvas 的渲染先后关系 什么是相机的渲染顺序&#xff1f; 答&#xff1a;简单理解就是 用毛刷 刷墙面&#xff0c;先刷的&#xff0c;会被后刷的 挡住 。 列如&#xff1a;相机01&#xff1a; 先渲染的大海&#xff0c;相机02&#xff1a;后…

爬虫之Scrapy

一 介绍 Scrapy一个开源和协作的框架&#xff0c;其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的&#xff0c;使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。但目前Scrapy的用途十分广泛&#xff0c;可用于如数据挖掘、监测和自动化测试等领域&#x…

jquery实现甘特图时效管理

一、效果图 二、html文件 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html lang"en"><head><script src"../../../baoBiaoHtml/js/jquery-1.9.0.js"></script><script src"../..…

【GitOps系列】自动化构建Image

文章目录 使用 GitHub Action 构建镜像使用 GitLab CI 构建镜像使用 Tekton 构建镜像Tekton组件安装Tekton 简介创建 Tekton Pipeline创建 Task创建 Pipeline创建 EventListener创建 TriggerTemplate创建 Service Account 和 PVC设置 Secret 创建 GitHub Webhook触发 Pipeline …

markdown2html 转化流程

定义一个extensions function markedMention() {return {extensions: [{name: mention,level: inline,start(src) {// console.log("markedMention start....", src);return src.indexOf(#)},tokenizer(src, tokens) {const rule /^(#[a-zA-Z0-9])\s?/const match…

巴斯夫与长三角物理研究中心开展合作,专注固态和钠离子电池领域

“巴斯夫&#xff0c;全球知名化学公司&#xff0c;宣布与长三角物理研究中心合作&#xff0c;在江苏溧阳市成立联合研究中心&#xff0c;专注于固态电池和钠离子电池的科研。” 根据巴斯夫官方微博消息&#xff0c;新成立的研究中心名为“巴斯夫–长三角物理研究中心新能源汽车…

RAID6故障导致分区打不开的服务器数据恢复案例

服务器数据恢复环境&#xff1a; 一台infortrend存储&#xff0c;有一组由12块硬盘组建的RAID6&#xff0c;RAID6的所有空间划分给一个LUN并映射到WINDOWS系统上&#xff0c;WINDOWS系统上划分了一个GPT分区。 服务器故障&分析&#xff1a; 存储无法访问&#xff0c;经过检…

TIOBE统计数据

TIOBE统计数据&#xff08;2023年7月&#xff09; TIOBE Index编程社区指数是编程语言流行度的一个指标。评级基于全球熟练工程师的数量、课程和第三方供应商的数量。Google、Bing、Yahoo!、维基百科、亚马逊、YouTube 和百度等流行搜索引擎用于计算评级。 七月头条&#xff1…

【C语言提升】深入了解动态内存管理

目录 一、静态分配和动态分配 二、内存管理函数 1、malloc 申请堆区空间 2、calloc 申请堆区空间 3、free回收堆区空间权限 4、memset内存设置函数 5、realloc内存增减函数 三、内存泄漏&#xff08;了解&#xff09; 一、静态分配和动态分配 1、静态分配 在程序编译…

【Python】类型注解 ② ( 基础变量设置类型注解 | 类对象设置类型注解 | 容器变量设置简易类型注解 | 容器变量设置详细类型注解 )

文章目录 一、为变量设置类型类型注解1、变量设置 " 类型注解 " 语法2、为 基础类型变量 设置 " 类型注解 "3、为 类 的 对象类型 设置 " 类型注解 "4、为 基础容器类型变量 设置 简易 " 类型注解 "5、为 基础容器类型变量 设置 详细 …

gma 2 教程(二)数据操作:3. 支持生成的栅格格式信息

为了方便了解和选择输出栅格格式、配置高级创建选项&#xff0c;下表列出了gma可以生成&#xff08;复制/创建/转换&#xff09;的所有栅格格式的主要信息&#xff1a; 格式名生成模式支持数据类型扩展名多维栅格支持色彩映射表支持的数据类型多波段支持压缩模式AAIGrid复制By…

Redis学习(三)分布式缓存、多级缓存、Redis实战经验、Redis底层原理

文章目录 分布式缓存Redis持久化RDB持久化AOF持久化 Redis主从Redis数据同步原理全量同步增量同步 Redis哨兵哨兵的作用和原理sentinel&#xff08;哨兵&#xff09;的三个作用是什么&#xff1f;sentinel如何判断一个Redis实例是否健康&#xff1f;master出现故障后&#xff0…

Java-API简析_java.lang.ProcessBuilder类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131729933 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…