0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux关于UDP的学习详细讲解

jf_f8pIz0xS 来源:CSDN技术社区 作者:_YKitty 2021-05-02 16:42 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前序

UDP(用户数据报协议)没有连接的,是面向数据报的,是不可靠

套接字

就是IP地址+端口

IP地址:4字节

端口号:2字节,也就是说范围是0~65535

端口号分为

知名端口号

0--1023:http,ssh,ftp,telnet等一些协议端口号都是固定的,对于操作系统来说是不能对其进行分配的

一些固定的端口号

ssh服务器,使用22端口

ftp服务器,使用21端口

telnet服务器,使用23端口

http服务器,使用80端口

https服务器,使用443端口

操作系统动态分配的端口号

客户端服务器的端口号,这个范围的端口号操作系统可以对其进行分配

查看端口号

less /etc/services

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

IP地址的理解:

IP地址用来标识一个主机

端口号的理解:

端口号就是用来告诉操作系统要对于那一个进程进行操作,也就是说端口号就是用来标识一个进程

一个端口号只可被一个进程所占用,但是一个进程可以拥有多个端口号,也就是进程和端口号是一对多的关系

当我们写一个程序使用端口号的时候,要避开这些知名端口号

【问题】

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

可以,因为一个进程可以打开多个文件描述符,而每一个文件描述符都对应着一个端口号,所以一个进程可以绑定多个端口号

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

不可以

如果一个进程先绑定一个端口号,然后再fork一个子进程,这样的话就实现了多个进程绑定一个端口号,但是不同的进程绑定同一个端口号是不可以的

TIME_WAIT状态,服务器不能立即重启也说明不用进程不能同时绑定同一个端口号

多个进程可以监听同一个端口号吗?

可以。监听之前要进行创建套接字-》绑定ip::端口号-》监听。我们可以在bind之前使用setsockopt函数,设置套接字选项,其中就包括REUSEADDR这个选项,表明多个进程可以复用bind函数中指定的地址和端口号

所以套接字就可以准确的标识一台主机上的一个进程,从而完成计算机之间的通信

计算机之间的通信:

主机A的某个进程与主机B上的另一个进程进行通信

网络字节序转换

对于数据在网络中传输的时候有着自己遵循的传输规则大端传输

对于主机上的数据的传输序列有着两种:

大端:即高位字节序放在低地址上

小端:即低位字节序放在低地址上

传输:均是先传输低地址上的数据然后是高地址上的数据

所以对于主机上的数据传输的时候传输到网络上的时候有可能导致数据错误(例如主机上是小端的时候,所以需要进行转换)

转换函数:

#include 《arpa/inet.h》

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协议端格式

插图: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出接收消息

5. 扩展知识

5.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,在线帮助

5.2 pidof

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

语法:pisdof [进程名]

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

5.3 scp命令

基于ssh登录进行的网络安全的远程文件拷贝命令

例:要将自己当前路径下的clinet文件发送到主机IP为192.168.153.140的home目录下

scp 。/clinet root@192.168.153.140:/home

5.4 关于防火墙的命令

启动:systemctl start firewalld

关闭:systemctl stop firewalld

查看状态:systemctl status firewalld

开机禁用:systemctl disable firewalld

开机启用:systemctl enable firewalld

# 对于UDP书写服务器的思路

由于UDP是无连接的,所以对于两个处于同一局域网下计算机的进程之间通信,所以是不需要两台计算机之间的进程进行连接的,对于UDP使用的接口是需要包含知道从哪里接收消息的,要发送消息到哪里的。

实现本地通信

服务器

只需要服务器创建一个套接字

使该套接字对于本地地址(127.0.0.1)进行绑定,并且绑定一个端口号(1024--65535)就行了

绑定本地地址是为了对于本地计算机的两个进程进程通信,而绑定端口号是为了绑定一个进程,是为了对于客户端进行发送消息到服务器的时候,可以找到服务器

然后就接受客户端发来的消息

对于客户端的消息进行处理然后就可以再次将处理后的消息进行返回

插图:服务器流程

客户端

绑定一个套接字

为了绑定一个进程,可以和服务器进行通信,将消息发送过去的时候要让服务器知道是哪一个进程再和他进程通信

客户端只需要向服务器发送消息

然后再次从客户端接收消息就好了,不需要考虑要进行连接

插图:客户端流程

实现处于同一局域网下的不同主机间进行通信

服务器

和本地通信的一致,只是对于套接字绑定的ip地址不一样了

也对于套接字要绑定该局域网的ip地址以及一个端口号,不需要在绑定本地地址(127.0.0.1)了

这样的话处于同一局域网下的计算机的进程就可以进行通信了

客户端

对于客户端来说没有任何改变,仍然是只需要知道服务器的ip和端口号就行了

对于UDP服务器要注意的问题

启动客户端

启动客户端的时候必须给客户端输入一个ip地址和端口号,这个ip地址和端口号也就是要知道客户端要发送消息给哪一个服务器进行发送

启动服务器

必须要给服务器绑定一个ip地址和端口号,也就是要注意该服务器处于该计算机上的哪一个进程上
编辑:lyn

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11628

    浏览量

    217973
  • 服务器
    +关注

    关注

    13

    文章

    10094

    浏览量

    90883
  • UDP
    UDP
    +关注

    关注

    0

    文章

    331

    浏览量

    35215
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【免费送书】成为硬核Linux开发者:《Linux 设备驱动开发(第 2 版)》

    Linux系统的设备驱动开发,一直给人门槛较高的印象,主要因内核机制抽象、需深度理解硬件原理、开发调试难度大所致。2021年,一本讲解驱动开发的专著问世即获市场青睐,畅销近万册——这便是《Linux设备驱动开发》。
    的头像 发表于 11-18 08:06 434次阅读
    【免费送书】成为硬核<b class='flag-5'>Linux</b>开发者:《<b class='flag-5'>Linux</b> 设备驱动开发(第 2 版)》

    【书籍评测活动NO.67】成为硬核Linux开发者:《Linux 设备驱动开发(第 2 版)》

    ,以获得最佳学习效果。第1篇:Linux内核开发基础开篇从环境搭建入手,详细讲解如何获取Linux内核源码,在x86宿主机上配置ARM的
    发表于 11-17 17:52

    学习Linux应该从哪里开始?

    在工业控制、边缘计算、人工智能这些领域,有一句几乎约定俗成的话: “会不会 Linux,决定了你能走多远。” 但对很多刚入门的工程师来说,Linux 看起来像个庞大又神秘的世界——命令行、驱动、内核
    的头像 发表于 10-16 09:51 300次阅读
    <b class='flag-5'>学习</b><b class='flag-5'>Linux</b>应该从哪里开始?

    【「Yocto项目实战教程:高效定制嵌入式Linux系统」阅读体验】+基础概念学习理解

    系统的基础知识,及yocto的基础知识。这部分内容对于我这样有一定 Linux 基础的读者来说,起到了很好的复习和巩固作用,同时也为后续学习 Yocto 项目奠定了坚实的理论基础。 元数据 元数据架构
    发表于 08-04 22:29

    第六章 W55MH32 UDP Multicast示例

    本文介绍了在W55MH32芯片上实现UDP组播的原理、应用场景及回环测试方法,并通过实战代码展示了其具体实现过程。下一篇文章将聚焦DNS例程,讲解其工作原理及实现方法,帮助大家更深入地理解网络通信。敬请期待!
    的头像 发表于 07-24 09:19 650次阅读
    第六章 W55MH32 <b class='flag-5'>UDP</b> Multicast示例

    第五章 W55MH32 UDP示例

    本文介绍了在 W55MH32 芯片上实现 UDP 通信及数据回环测试的方法。阐述了 UDP 协议的概念、特点、应用场景、报文传输流程和报文结构,展示了实现过程,借助网络调试工具完成测试。
    的头像 发表于 07-24 09:13 647次阅读
    第五章 W55MH32 <b class='flag-5'>UDP</b>示例

    IPC2221简略学习笔记

    关于IPC2221的学习笔记。
    发表于 03-14 18:07 7次下载

    Linux常用命令行总结

    学习了一段时间的linux之后,开始着手基本命令的学习,这里主要记录一些学习过程中重要的知识点供以后查阅。
    的头像 发表于 03-03 10:40 810次阅读
    <b class='flag-5'>Linux</b>常用命令行总结

    L298电机驱动模块的详细讲解

    电动小车的组成 • 一个电动小车整体的运行性能,首先 取决于它的电源模块和电机驱动模块。 • 电机驱动模块主要功能:驱动小车轮子 转动,使小车行进。 • 电源模块:顾名思义,就是为整个系统 提供动力支持的部分 下载PDF文档了解L298电机驱动模块详细讲解
    发表于 02-26 15:53

    开源直接用!UDP-UART数据透传来了

    今天就来分享一下UDP-UART透传示例,源码开放,可根据实际需求灵活应用。 一、UDP-UART透传简介 UDP-UART透传是一种将UDP数据流直接传输到UART接口的通信方式。它
    的头像 发表于 02-05 17:14 565次阅读
    开源直接用!<b class='flag-5'>UDP</b>-UART数据透传来了

    TCP协议与UDP协议的区别

    UDP(用户数据报协议) : 无连接 :UDP不建立连接,数据可以直接发送,不需要任何握手过程。 不可靠性 :UDP不保证数据的可靠传输,数据包可能会丢失,不会重传。 2. 数据传输 TCP : 流控制 :TCP使用窗口机制
    的头像 发表于 01-22 09:44 1746次阅读

    【ELF 2学习板试用】板卡接口功能测试

    ,可以说是从基础讲起。前面是硬件部分的讲解,每个硬件模块也都详细的进行讲解。之后是Linux讲解,虚拟机的搭建和常用指令也都进行了
    发表于 01-18 23:24

    Web端TCP/UDP测试工具!小白必学~

    Web端TCP/UDP测试工具,方便大家进行各种基于TCP和TDP的模拟测试。该测试工具不仅支持TCP和UDP测试,还支持SSL,使用极为便捷。 按照如下测试示例步骤,即可把TCP/UDP web
    的头像 发表于 01-08 18:17 1985次阅读
    Web端TCP/<b class='flag-5'>UDP</b>测试工具!小白必学~

    一文了解Android UDP通信

    一、了解UDP通信协议 UDP(User Datagram Protocol,用户数据报协议)是一种无连接、不可靠的传输层协议。它提供简单的数据传输服务,无需在发送方和接收方之间建立连接。每个UDP
    发表于 12-30 10:56

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-Linux内核移植之内核简介

    仓库中,供用户查看和下载。下面以NXP的仓库为例进行讲解。 地址:https://github.com/nxp-imx/linux-imx (一)切换到对应的版本,因为开发板是在linux
    发表于 12-16 13:08