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

文章目录

  • 一、传输层
    • 1. 再谈端口号
    • 2. 端口号范围划分
    • 3. 认识知名端口号
    • 4. 两个问题
    • 5. netstat 与 pidof
  • 二、UDP协议
    • 1. UDP协议格式
    • 2. UDP协议的特点
    • 3. 面向数据报
    • 4. UDP的缓冲区
    • 5. UDP使用注意事项
    • 6. 基于UDP的应用层协议


一、传输层

传输层 负责负责两台计算机之间的端到端的通信,确保数据能够可靠的传送到目标主机,为应用层提供可靠的数据传输服务。我们可以简单的理解为传输层协议是将数据直接发送到了网络当中。


1. 再谈端口号

端口号(Port) 标识了一个主机上进行通信的不同的应用程序。当主机从网络中获取数据时,数据需要自底向上进行交付,而上层存在多个应用程序,那么交付给哪一个应用程序就由端口号来决定。

在这里插入图片描述

因此端口号是传输层的概念,在传输层协议的报头中包含有与端口号相关的字段。

五元组标识一个通信

在TCP/IP协议中, 用 "源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过 netstat -n 查看)。其中 IP 地址和端口号标识网络中唯一的一个进程,而协议号是一个整数,用于标识传输层使用的协议类型。常见的传输层协议包括 TCP 协议、UDP 协议等。

通过 netstat命令 查看五元组信息

  • -a:显示所有网络连接,包括正在监听的和建立的连接。
  • -n:以数值形式显示网络地址和端口号,而不是域名和服务名。
  • -p:显示与连接相关的进程和程序名。
  • -r:显示当前系统的路由表信息。
  • -s:显示网络统计信息,如 TCP 和 UDP 的错误、丢包等。
  • -t:显示所有 TCP 连接。
  • -u:显示所有 UDP 连接。
  • -l:显示处于监听状态的连接。

在这里插入图片描述
在这里插入图片描述

💕 关于协议号和端口号

  • 协议号是存在于IP报头当中的,其长度是8位,协议号指明了数据报所携带的数据是使用何种协议,以便于让目的主机的IP层知道应该将该数据交付给传输层的哪一个协议进行处理。
  • 端口号是存在于UDP和TCP报头当中的,其长度是16位,端口号的作用是唯一标识一台主机上的某个进程。

2. 端口号范围划分

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

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

3. 认识知名端口号

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

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

💕 查看知名端口号

/etc/services # 在该文件中查看网络服务名和它们对应使用的端口号及协议

在这里插入图片描述

我们自己写一个程序使用端口号时, 要避开这些知名端口号。


4. 两个问题

💕一个端口号可以被多个进程绑定吗?

  • 通常情况下,一个端口号只能被一个进程绑定。这是因为端口号用于标识网络上的特定服务,当客户端尝试连接到服务器的某个端口时,操作系统需要知道哪个进程负责处理该连接请求。如果多个进程绑定到同一个端口号,操作系统将无法确定应该将连接请求发送给哪个进程。因此,当一个进程试图绑定到已经被另一个进程占用的端口时,操作系统通常会返回错误。
  • 但是如果采取的通信协议不同,就可以绑定同一个端口号。例如:一个进程可以使用 TCP 协议绑定到端口号 80,而另一个进程可以使用 UDP 协议绑定到端口号 80。这是因为操作系统不仅根据端口号,还根据通信协议来区分不同的服务。因此,当客户端尝试连接到服务器的某个端口时,操作系统会根据客户端使用的通信协议来确定应该将连接请求发送给哪个进程。

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

一个进程可以绑定多个端口号,只不过现在这多个端口号唯一标识的是同一个进程罢了。我们限制的是从端口号到进程的唯一性,而没有要求从进程到端口号也必须满足唯一性,因此一个进程是可以绑定多个端口号的。


5. netstat 与 pidof

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

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

在这里插入图片描述


pidof 命令用于查找指定名称进程的进程 ID。

例如,我们随便创建一个进程演示一下:

在这里插入图片描述

pidof命令可以配合kill命令快速杀死一个进程。

在这里插入图片描述


二、UDP协议

1. UDP协议格式

在这里插入图片描述

  • 源端口:这个字段占据 UDP 报文头的前 16 位,通常包含发送数据报的应用程序所使用的 UDP 端口。接收端的应用程序利用这个字段的值作为发送响应的目的地址。
  • 目的端口:接收端计算机上 UDP 软件使用的端口,占据 16位。
  • UDP长度:该字段占据 16 位,表示 UDP 数据报长度,包含 UDP 报文头和 UDP 数据长度。因为 UDP 报文头长度是 8 个字节,所以这个值最小为 8。
  • 校验值:该字段占据 16 位,可以检验数据在传输过程中是否被损坏。如果数据报未被损坏,网络协议栈会将其传递给上层应用程序进行处理。但是如果数据报在传输过程中丢失或损坏,UDP 协议并不会对其进行重传。

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


💕 UDP是如何将报头和有效载荷进行分离的?

UDP报头当中包含4个字段,每个字段的长度都是16位,总共8字节。因此UDP采用的实际上是一种定长报头。UDP在读取报文时读取完前8个字节后剩下的就是有效载荷了。

💕 UDP如何决定将有效载荷交付给上层的哪一个协议的?

应用层的每一个网络进程都会绑定一个端口号,服务端进程必须显示绑定一个端口号,UDP就是通过报头当中的目的端口号来找到对应的应用层进程的。

这里我们需要注意的是:操作系统会维护一个端口号到进程的映射表,当网络协议栈确定了数据报应该交给哪个端口号时,它会查询这张映射表,找到对应的进程,然后将有效载荷传递给该进程进行处理。


💕 如何理解报头?

Linux内核是C语言写的,UDP协议又属于内核协议栈,因此UDP协议也是用C语言写的,UDP报头本质上也是一个结构体或者位段类型的。

UDP数据封装

在这里插入图片描述

  • 当应用层将数据交给传输层后,在传输层就会创建一个UDP报头类型的变量,然后填充报头当中的各个字段,此时就得到了一个UDP报头。
  • 此时操作系统再在内核中开辟一块空间将UDP报头和有效载荷拷贝到一起,此时就形成了UDP报文。

UDP数据分用

在这里插入图片描述

  • 当传输层从下层获取到一个报文后,就会读取该报文的前8个字节,提取出对应的目的端口号。
  • 通过目的端口号找到对应的上层应用进程,然后将剩下的有效载荷向上囧付给该应用进程。

2. UDP协议的特点

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

3. 面向数据报

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

这意味着它将应用层传递给它的数据作为一个独立的数据报来处理。每个数据报都包含了足够的信息,使得接收端能够将其独立地传递给上层应用程序。

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


4. UDP的缓冲区

sendto、recvfrom、send、recv、write 和 read 等 IO 类接口都是用于在应用程序和操作系统内核之间传输数据的系统调用。它们的本质是在用户空间和内核空间之间拷贝数据。

除了拷贝数据之外,这些 IO 类接口还会执行其他操作,如检查套接字状态、设置套接字选项、处理错误等。因此,它们不仅仅是简单的拷贝函数。

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

UDP协议使用缓冲区来存储发送和接收的数据。在Linux内核中,这些缓冲区由sk_buff结构体表示。每个sk_buff结构体都包含指向数据缓冲区的指针,以及有关数据包的其他信息。

当应用程序调用sendto函数发送数据时,内核会将数据拷贝到一个sk buff结构体中,然后将其添加到发送队列中。网络协议栈会从发送队列中取出数据包,并将其发送到网络。

当内核接收到一个UDP数据包时,它会将数据包存储在一个sk buff结构体中,并将其添加到接收队列中。当应用程序调用recvfrom函数接收数据时,内核会从接收队列中取出一个数据包,并将其中的数据拷贝到应用程序提供的缓冲区中。

UDP本身会维护一个接收缓冲区,当有新的UDP报文到来时就会把这个报文放到接收缓冲区当中,此时上层在读数据的时就直接从这个接收缓冲区当中进行读取就行了,而如果UDP接收缓冲区当中没有数据那上层在读取时就会被阻塞。因此UDP的接收缓冲区的作用就是,将接收到的报文暂时的保存起来,供上层读取。


5. UDP使用注意事项

我们注意到,UDP协议首部中有一个16位的最大长度,也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。

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


6. 基于UDP的应用层协议

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

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


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

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

相关文章

java原子类-Atomic

什么是原子类? java 1.5引进原子类,具体在java.util.concurrent.atomic包下,atomic包里面一共提供了13个类,分为4种类型,分别是: 原子更新基本类型,原子更新数组,原子更新引用&…

Pritunl搭建OpenVPN服务器详细流程,快速实现公网远程连接!

文章目录 前言1.环境安装2.开始安装3.访问测试4.创建连接5.局域网测试连接6.安装cpolar7.配置固定公网访问地址8.远程连接测试 前言 Pritunl是一款免费开源的 VPN 平台软件(但使用的不是标准的开源许可证,用户受到很多限制)。这是一种简单有…

GO学习之 通道(nil Channel妙用)

GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…

STM32F4VGT6-DISCOVERY:uart1驱动

对于这款板子&#xff0c;官方并没有提供串口例程&#xff0c;只能自行添加。 一、PA9/PA10复用成串口1功能不可用 驱动测试代码如下&#xff1a; main.c: #include "main.h" #include <stdio.h>void usart1_init(void) {GPIO_InitTypeDef GPIO_InitStruct…

前端 : 用html ,css,js写一个你画我猜的游戏

1.HTML&#xff1a; <body><div id "content"><div id "box1">计时器</div><div id"box"><div id "top"><div id "box-top-left">第几题:</div><div id "box…

linux-磁盘应用

目录 一、磁盘内容简述 1、一些基本概念 2、分区简述 3、常见文件系统 4、linux硬盘文件 二、对linux系统进行分区 1、用fdisk进行分区 2、用parted进行分区 一、磁盘内容简述 1、一些基本概念 - 扇区大小&#xff1a;512Btyes&#xff0c;0.5KB - 磁盘最小存储单位&…

小黑子—spring:第一章 Bean基础

spring入门1.0 一 小黑子对spring基础进行概述1.1 spring导论1.2 传统Javaweb开发困惑及解决方法1.3 三大的思想提出1.3.1 IOC入门案例1.3.2 DI入门案例 1.4 框架概念1.5 初识spring1.5.1 Spring Framework 1.6 BeanFactory快速入门1.7 ApplicationContext快速入门1.8 BeanFact…

python之计算平面点集的的面积

在当今数据驱动的世界中&#xff0c;计算平面点集的最小外接轮廓面积被广泛应用于各种实际场景中。它是一项重要而魅力十足的任务&#xff0c;旨在找到一个最小的矩形或多边形区域&#xff0c;能够完全包围给定的离散点集。这个看似简单的问题背后隐藏着许多挑战&#xff0c;需…

HTML5+CSS3+Vue小实例:路飞出海的动画特效

实例:路飞出海的动画特效 技术栈:HTML+CSS+Vue 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=&…

windows下OOM排查

如下有一段代码 package com.lm.demo.arthas.controller;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import java.util.A…

车载音频项目

加我微信hezkz17进数字音频系统研究开发交流答疑群(课题组) ー 1&#xff0e;负责此项目的音频链路的设计及其实现 在ADSP21375上实现音频链路的处理。如噪声门&#xff0c;压限器&#xff0c;高低通&#xff0c;PEQ、各种效果等。 2&#xff0e;负责DSP与MCU端SPI协议实现。M…

Python文件——使用Python读取txt文件

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 本文专栏&#xff1a;Python专栏 专栏介绍&#xff1a;本专栏为免费专栏&#xff0c;并且会持续更新python基础知识&#xff0c;欢迎各位订阅关注. 目录 一、文件的编码 1. 什么是编码 2. 常见的编码 二、P…

【纯离线】Ubuntu离线安装ntp时间同步服务

Ubuntu离线安装ntp服务 准备阶段&#xff1a;下载安装包 apt-get download ntp apt-get download ntpdate 一、服务端( 192.166.6.xx) 1、环境准备 先判断是否已安装 systemd-timesyncd systemctl is-active systemd-timesyncd 如果返回结果是 active&#xff0c;则表示…

文件夹批量改名:如何在文件夹名左边添加递增的自动编号

在文件管理的过程中&#xff0c;我们有时需要对文件夹进行重命名&#xff0c;使其更具区分度和可读性。为了实现这一目标&#xff0c;我们可以采用在文件夹名左边添加递增的自动编号的方法。本文将介绍云炫文件管理器如何进行文件夹批量改名&#xff0c;以在文件夹名左边添加递…

mathtype7.4破解永久激活码

MathType(数学公式编辑器)是由Design Science公司研发的一款专业的数学公式编辑工具。MathType功能非常强大&#xff0c;尤其适用于专门研究数学领域的人群使用。使用MathType让你在输入数学公式的时候能够更加的得心应手&#xff0c;各种复杂的运算符号也不在话下。 MathType最…

Vue3.0插槽

用法&#xff1a; 父组件App.vue <template><div><!--将html代码插入到子组件中带默认名称的插槽中--><AChild><!--这段html会插入到AChild组件中<slot></slot>插槽中--><!-- 注意&#xff1a;写在父组件中的html代码只能在父组…

百度网盘使用指南

文章目录 备份篇手机文件备份电脑文件备份 查找篇移动端PC端 文件操作文件解压文件扫描PDF工具图片工具音频操作 备份篇 手机文件备份 在百度网盘APP种点击 我的–设置–自动备份设置 里边有相册备份, 文档备份, 微信文件备份, 手机通讯录, 短信, 通话备份等功能 电脑文件备…

目标检测类项目数据集汇总

一、玩手机数据集及检测 玩手机数据集下载地址分享: https://download.csdn.net/download/qq_34717531/19870205 二、狗的数据集及检测 狗目标检测数据集下载地址分享:https://download.csdn.net/download/qq_34717531/20813390 三、猫数据集及检测 猫数据集下载地址分享: ht…

回归算法|长短期记忆网络LSTM及其优化实现

本期文章将介绍LSTM的原理及其优化实现 序列数据有一个特点&#xff0c;即“没有曾经的过去则不存在当前的现状”&#xff0c;这类数据以时间为纽带&#xff0c;将无数个历史事件串联&#xff0c;构成了当前状态&#xff0c;这种时间构筑起来的事件前后依赖关系称其为时间依赖&…

c++设计模式三:工厂模式

本文通过一个例子简单介绍简单工厂模式、工厂模式和抽象工厂模式。 1.简单工厂&#xff08;静态&#xff09; 假如我想换个手机&#xff0c;换什么手机呢&#xff1f;可以考虑苹果或者华为手机&#xff0c;那我们用简单工厂模式来实现这个功能&#xff1a; 我们关注的产品是手…
最新文章