广告
返回顶部
首页 > 资讯 > 操作系统 >linux对于UDP的学习
  • 975
分享到

linux对于UDP的学习

LinuxUDP 2022-06-03 14:06:32 975人浏览 安东尼
摘要

目录一、UDP、linux基础介绍二、对于各函数使用1、对于Socket函数的使用2、 对于bind函数的使用3、 对于recvfrom函数的使用4、 对于sendto函数的使用三、 扩展知识1、 netstat2、

目录
  • 一、UDP、linux基础介绍
  • 二、对于各函数使用
    • 1、对于Socket函数的使用
    • 2、 对于bind函数的使用
    • 3、 对于recvfrom函数的使用
    • 4、 对于sendto函数的使用
  • 三、 扩展知识
    • 1、 netstat
    • 2、 pidof

一、UDP、linux基础介绍

套接字:就是IP地址+端口号

IP地址:4字节
端口号:2字节,也就是说范围是0~65535
端口号分为:知名端口号、一些固定的端口号
知名端口号
0--1023:Httpssh,ftp,telnet等一些协议端口号都是固定的,对于操作系统来说是不能对其进行分配的

一些固定的端口号

ssh服务器,使用22端口
ftp服务器,使用21端口
telnet服务器,使用23端口
http服务器,使用80端口
https服务器,使用443端口
操作系统动态分配的端口号
客户端服务器的端口号,这个范围的端口号操作系统可以对其进行分配

查看端口号


less /etc/services
 //就可以查看Linux下所有的端口号了

IP地址的理解:
IP地址用来标识一个主机

端口号的理解:
端口号就是用来告诉操作系统要对于那一个进程进行操作,也就是说端口号就是用来标识一个进程
一个端口号只可被一个进程所占用,但是一个进程可以拥有多个端口号,也就是进程和端口号是一对多的关系
当我们写一个程序使用端口号的时候,要避开这些知名端口号

【问题】

(1)一个进程是否可以bind多个端口号呢?
可以,因为一个进程可以打开多个文件描述符,而每一个文件描述符都对应着一个端口号,所以一个进程可以绑定多个端口号

(2)一个端口号是否可以被多个进程bind?
不可以
如果一个进程先绑定一个端口号,然后再fork一个子进程,这样的话就实现了多个进程绑定一个端口号,但是不同的进程绑定同一个端口号是不可以的
TIME_WaiT状态,服务器不能立即重启也说明不用进程不能同时绑定同一个端口号

(3)多个进程可以监听同一个端口号吗?
可以。监听之前要进行创建套接字->绑定ip::端口号->监听。我们可以在bind之前使用setsockopt函数,设置套接字选项,其中就包括REUSEADDR这个选项,表明多个进程可以复用bind函数中指定的地址和端口号
所以套接字就可以准确的标识一台主机上的一个进程,从而完成计算机之间的通信(主机A的某个进程与主机B上的另一个进程进行通信

 网络字节序转换:
对于数据在网络中传输的时候有着自己遵循的传输规则大端传输
对于主机上的数据的传输序列有着两种:
大端:即高位字节序放在低地址上
小端:即低位字节序放在低地址上
传输:均是先传输低地址上的数据然后是高地址上的数据
所以对于主机上的数据传输的时候传输到网络上的时候有可能导致数据错误(例如主机上是小端的时候,所以需要进行转换)

转换函数:


uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16 hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
h:表示主机host name
n:表示网络network
l:表示4字节long
s:表示2字节short

地址转换函数:


字符串转化为in_addr
in_addr_t inet_addr(const char* strptr)
in_addr转化为字符串
char* inet_ntoa(struct in_addr inaddr)

具有不可重入性,也就是不可多次调用,因为该函数自己在静态区开辟一块空间用来存放IP地址字符串的

 UDP协议:
UDP协议端格式

  • 16为UDP长度,表示整个数据报(UDP首部+UDP数据)的最大长度(64KB)
  • 检验和:如果校验和出错,就会直接丢弃(检验的是把首部和数据部分一起都检验)
  • 校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还要在重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检验是否出错。
  • 源端口号:在对方回信是选用,不需要时可用全0
  • 目的端口号:在终点交付报时必须要用到
  • 长度:UDP用户数据报的长度,其最小值是8(仅有首部)

UDP的特点:

  • 无连接:直到对端的IP和端口号就直接进行传输,不需要建立连接
  • 不可靠:没有确认机制,没有重传机制;因为没有网络故障该段无法发送到对方,UDP协议层也不会给应用层返回任何错误信息
  • 面向数据报:不能够灵活的控制读写数据的次数和数量
  • 控制选项较少,数据传输过程中延迟小,数据传输效率高
  • 面向数据报
  • 应用层交给UDP多长的报文,UDP原样发送,既不会拆分也不会合并

例:用UDP传输100个字节的数据
如果发送端调用一次sendto,发送100个字节。那么接收端也必须调用对应的一次recvfrom,接收100字节;而不能循环调用10次recvfrom,每次发送10个字节
UDP的缓存
UDP没有发送缓存区,调用sendto之后会直接交给内核,由内核·将数据传给网络层协议进行后续的传输动作。因为UDP是不面向连接的,所以没有重发机制,也就不需要发送缓存区将已经发送的数据保存下来为了发送失败进行重传做准备
UDP具有接收缓存区。但是这个接收缓存区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;如果缓存区满了,在到达的UDP数据就会被丢弃
UDP的Socket既能读,也能写,全双工

UDP的使用注意事项:
UDP协议首部中有一个16位的最大长度,也就是说一个UDP能传输的数据的最大长度是64K(包含UDP首部)。但是64K在当今的互联网环境下,是一个非常小的数字。如果我们需要传输的数据超过64K,就需要应用层手动的分包,多次发送,并在接收端拼装
UDP首部中校验和的计算方法有些特殊。在计算校验和时,要在UDP用户数据报之前增加12个字节的伪首部
伪首部既不向下传输也不想上递送,而仅仅是为了计算校验和
与IP数据报的校验和只检验IP数据报的首部不同,UDP的校验和是把首部和数据部分一起都检验

伪首部:

基于UDP的应用层的协议:

  • NFS:网络文件系统
  • TFTP:简单文件传输文件协议
  • DHCP:动态主机配置协议
  • DNS:域名解析协议

用UDP实现可靠传输?

  • 参考tcp的可靠性机制,在应用层实现类似的逻辑
  • 引用序列号,保证数据顺序
  • 引入确认应答,确保对端收到了数据
  • 引入超时重传,如果隔一段时间没有应答,就重发数据

二、对于各函数使用

1、对于socket函数的使用

1.1 函数原型


int socket(int domain, int type, int protocol);
domain: 领域
    AF_INET:IPV4
    AF_INET6:IPV6
type: 类型
    SOCK_STREAM
    SOCK_DGARM
protocol: 协议

1.2 函数的作用
在通信领域中创建一个未被绑定的套接字,并且返回一个文件描述符,可以在以后对套接字进行操作的函数调用中使用

2、 对于bind函数的使用

2.1 函数原型
int bind(int socket, const struct sockaddr* address, socklen_t address_len);
2.2. 函数的作用
该函数采用先前创建好的套接字来对于IP地址以及端口号进行绑定,也就是表示该套接字可以标识出在一个网络中一台确定的主机并且主机中的进程

3、 对于recvfrom函数的使用

3.1 函数原型


ssize_t recvfrom(int socket, void* restrict buffer, size_t length, 
                 int flags, struct sockaddr* restrict address, 
                socklen_t* restrict address_len);
​
socket:要接受那一个套接字的消息
buffer:用来接收消息的缓存区
length:接收的消息的长度
flags:类型
address:空指针或者存储发送信息的sockaddr结构
addless_len:指定地址参数指向的sockaddr结构的长度

3.2 函数的作用 
用来接收从socket套接字发送来的消息。该套接字的sockaddr结构也知道

4、 对于sendto函数的使用

4.1 函数原型
ssize_t recvfrom(int socket, const void* message, size_t length,
                 int flags, const struct sockaddr* dest_addr,
                socklen_t* dest_len);
4.2 函数的作用
该函数是socket套接字从dest_addr出接收消息

三、 扩展知识

1、 netstat

netstat是一个用来监控TCP/IP网络非重要工具
语法:netstat [选项]
功能:查看网络状态

选项:
-a,显示所有连线的Socket
-c,持续列出网络状态
-n,直接使用ip地址,而不通过域名服务器,也就是显示为数字
-l,显示监控中的服务器的Socket,仅列出监听(Listen)状态下的Socket
-p,显示正在使用Socket的程序的识别码和名称(PID/Program name)
-t,显示TCP传输协议的连线状况
-u,显示UDP传输协议的连线状况
-v,显示指令执行过程
-V,显示版本信息
-x,显示UNIX传输协议的连线状况
-s,显示网络工作信息统计表
-h,在线帮助

2、 pidof

查看服务器进程id是非常方面

语法:pisdof [进程名]

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

到此这篇关于linux对于UDP的学习的文章就介绍到这了,更多相关linux内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: linux对于UDP的学习

本文链接: https://www.lsjlt.com/news/11638.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • linux对于UDP的学习
    目录一、UDP、linux基础介绍二、对于各函数使用1、对于socket函数的使用2、 对于bind函数的使用3、 对于recvfrom函数的使用4、 对于sendto函数的使用三、 扩展知识1、 netstat2、...
    99+
    2022-06-03
    Linux UDP
  • python 关于epoll的学习
          在linux中,默认情况下所有的socket都是blocking;当 用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据。对于network io来说,很多时候数据在一开始还没有到达(比...
    99+
    2023-01-31
    python epoll
  • 关于JAVA8的 Stream学习
    目录一、Stream的使用1 创建2 步骤二、Stream的特性三、中间操作1 filter()2 limit()3 skip()4 map()3.1 flatM...
    99+
    2022-11-12
  • Linux入门学习,安装一个属于自己的Linux系统
    一 Linux简介Linux抽象解释肯定有人和我一样,很早就听说过Linux这个词,但是又没接触过。然后随手百度一下看着满满的命令惊呆了,不知道从哪里开始学习。 我相信大家肯定都用过Windows系统,或者也用过Mac系统,其实Linux也...
    99+
    2023-06-06
  • Linux 中的 PHP 学习笔记:适用于 Windows 用户吗?
    PHP 是一种流行的服务器端编程语言,它在网站开发中广泛使用。在 Linux 系统中,PHP 的使用率较高,因为它是开源的,可以与 Apache 或 Nginx 等 Web 服务器集成。但是,对于 Windows 用户来说,是否也适用于 ...
    99+
    2023-08-22
    linux 学习笔记 windows
  • 生命在于学习——框架-中间件的学习(一)
    声明:本篇文章仅用于学习笔记记录,不得用于其他用途。 一、什么是框架 Web框架(Web framework)或者叫做Web应用框架(Web application framework),是用于进行...
    99+
    2023-09-28
    学习 中间件 php
  • 基于Python的EasyGUI学习实践
    01_msgbox # 使用easygui功能,可以直接导入easygui模块 import easygui # 需要弹框时,要使用easygui。 # msgbox(m)方法,输出带有m内容的信息框。 # m...
    99+
    2022-06-02
    Python EasyGUI
  • 关于MySQL8的WITH查询学习
    目录前言示例练习总结 前言 对于逻辑复杂的sql,with可以大大减少临时表的数量,提升代码的可读性、可维护性 MySQL 8.0终于开始支持with语句了,对于复杂查询,可以不用写那么多的临时表了。 可以查看官方文档【点击跳转】 示...
    99+
    2021-11-25
    关于MySQL8的WITH查询学习
  • 对于初学者来说,Python异步编程和Linux编程算法的学习路线应该如何规划?
    Python和Linux是当今最受欢迎的编程语言之一,其中Python异步编程和Linux编程算法是非常重要的学习内容。对于初学者来说,学习路线的规划是非常重要的,下面将为大家详细介绍Python异步编程和Linux编程算法的学习路线。 ...
    99+
    2023-09-22
    异步编程 linux 编程算法
  • 关于系统学习Linux云计算运维,应该怎么什么学?
      随着近年来经济的快速发展,企业对Linux人才的需求也越来越高。许多人认为,Linux是一个非常简单的行业,然而,Linux行业是一个综合了云计算、Linux运维、Linux开发、Linux编程等多方面专业知识的综合性行业。开始也许并不...
    99+
    2023-06-05
  • 从零开始学习 Go 语言:适用于 Linux 用户的教程
    Go 语言是一门高效且易于学习的编程语言,由 Google 公司开发。它被广泛应用于 Web 开发、云计算、区块链等领域,是一门非常流行的编程语言。如果你是 Linux 用户,并且想要学习 Go 语言,那么这篇文章就是为你准备的。 安装 ...
    99+
    2023-07-10
    教程 linux 关键字
  • 机器学习:基于KNN对葡萄酒质量进行分类
    机器学习:基于KNN对葡萄酒质量进行分类 作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注...
    99+
    2023-09-14
    机器学习 分类 python 近邻算法
  • Python面向对象编程中关于类和方法的学习笔记
    类和实例 python是一个面向对象的语言,而面向对象最重要的概念就是类和实例, 记得刚学习的时候不太理解这些概念,直到老师说了一句”物以类聚”. 没错就是类, 归类 物以类聚 类其实就是把一些相同特性的事...
    99+
    2022-06-04
    面向对象 学习笔记 方法
  • SpringBoot学习之基于注解的缓存
    目录主要使用到的注解:使用步骤注解属性介绍@Cacheable() 的属性值及释义:@CachPut属性值及释义:@CachEvict属性值及释义:@Caching总结主要使用到的注...
    99+
    2022-11-13
  • 基于android startActivityForResult的学习心得总结
    从昨晚到现在终于调试通了一个startActivityForResult的例子,网上要么有些说的太复杂了,要么说的含糊,搞的我走了很多弯路,所以写篇心得。在一个主界面(主Act...
    99+
    2022-06-06
    学习心得 学习 Android
  • [Python学习25] 关于函数更多的
    在这一章的学习中,做了一些函数和变量的练习。并不是直接运行脚本,而是在脚本中定义了一些函数,把他们导入到Python中通过执行函数的方式运行。先看代码: def break_words(stuff): """This functio...
    99+
    2023-01-31
    函数 更多 Python
  • Linux signal()函数的使用学习
    目录signal() 函数1. 原型2.实例signal() 函数 无意中看到了 signal() 函数,感觉对这个函数的原型有诸多疑惑,学习一下,顺便分享。 1. 原型 Unix系...
    99+
    2023-05-20
    Linux signal函数 Linux signal()
  • 学习linux的建议有哪些
    这篇文章主要介绍学习linux的建议有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、从基础开始   常常有些朋友在Linux论坛问一些问题,不过,其中大多数的问题都是很基的。例如:为什么我使用一个命令的时候,...
    99+
    2023-06-13
  • Python学习—对excel表格的操作
    安装对excel操作的模块:openpyxl 1.excel中的基本定义 工作簿(workbook):整个excel表哥文件称为一个工作簿 工作表(sheet):一个工作簿中有多个工作表 活动表(active sheet):保存文件时候停...
    99+
    2023-01-31
    表格 操作 Python
  • Java面向对象:接口的学习
    本文介绍了Java中接口的基本语法, 什么是接口, java中的接口 语法规则, 接口的使用,接口的特性,如何实现多个接口,接口间的继承,以及抽象类和接口的区别 Java接口的学习 一.接口的概念二.Java中的接口1.接口语...
    99+
    2023-08-17
    java 学习 android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作