您的位置:首页 > 教程 > linux > linux对于UDP的学习

linux对于UDP的学习

2022-06-19 20:54:59 来源:易采站长站 作者:

linux对于UDP的学习

目录一、UDP、linux基础介绍二、对于各函数使用1、对于socket函数的使用2、对于bind函数的使用3、对于recvfrom函数的使用4、对于sendto函数的使用三、扩展知识1、n...uFg站长之家-易采站长站-Easck.Com

目录
一、UDP、linux基础介绍
二、对于各函数使用
1、对于socket函数的使用
2、 对于bind函数的使用
3、 对于recvfrom函数的使用
4、 对于sendto函数的使用
三、 扩展知识uFg站长之家-易采站长站-Easck.Com

1、 netstatuFg站长之家-易采站长站-Easck.Com

2、 pidofuFg站长之家-易采站长站-Easck.Com

uFg站长之家-易采站长站-Easck.Com

一、UDP、linux基础介绍

套接字:就是IP地址+端口号uFg站长之家-易采站长站-Easck.Com
uFg站长之家-易采站长站-Easck.Com

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

一些固定的端口号uFg站长之家-易采站长站-Easck.Com
uFg站长之家-易采站长站-Easck.Com

ssh服务器,使用22端口uFg站长之家-易采站长站-Easck.Com
ftp服务器,使用21端口uFg站长之家-易采站长站-Easck.Com
telnet服务器,使用23端口uFg站长之家-易采站长站-Easck.Com
http服务器,使用80端口uFg站长之家-易采站长站-Easck.Com
https服务器,使用443端口uFg站长之家-易采站长站-Easck.Com
操作系统动态分配的端口号uFg站长之家-易采站长站-Easck.Com
客户端服务器的端口号,这个范围的端口号操作系统可以对其进行分配uFg站长之家-易采站长站-Easck.Com
uFg站长之家-易采站长站-Easck.Com

查看端口号uFg站长之家-易采站长站-Easck.Com

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

IP地址的理解:uFg站长之家-易采站长站-Easck.Com
IP地址用来标识一个主机uFg站长之家-易采站长站-Easck.Com

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

【问题】uFg站长之家-易采站长站-Easck.Com

(1)一个进程是否可以bind多个端口号呢?uFg站长之家-易采站长站-Easck.Com
可以,因为一个进程可以打开多个文件描述符,而每一个文件描述符都对应着一个端口号,所以一个进程可以绑定多个端口号uFg站长之家-易采站长站-Easck.Com

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

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

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

转换函数:uFg站长之家-易采站长站-Easck.Com

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

地址转换函数:uFg站长之家-易采站长站-Easck.Com

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

具有不可重入性,也就是不可多次调用,因为该函数自己在静态区开辟一块空间用来存放IP地址字符串的uFg站长之家-易采站长站-Easck.Com

 UDP协议:uFg站长之家-易采站长站-Easck.Com
UDP协议端格式uFg站长之家-易采站长站-Easck.Com

linux对于UDP的学习uFg站长之家-易采站长站-Easck.Com

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

UDP的特点:uFg站长之家-易采站长站-Easck.Com

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

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

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

伪首部:uFg站长之家-易采站长站-Easck.Com

linux对于UDP的学习uFg站长之家-易采站长站-Easck.Com

基于UDP的应用层的协议:uFg站长之家-易采站长站-Easck.Com

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

用UDP实现可靠传输?uFg站长之家-易采站长站-Easck.Com

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

uFg站长之家-易采站长站-Easck.Com

二、对于各函数使用

uFg站长之家-易采站长站-Easck.Com

1、对于socket函数的使用

1.1 函数原型uFg站长之家-易采站长站-Easck.Com
uFg站长之家-易采站长站-Easck.Com

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

1.2 函数的作用uFg站长之家-易采站长站-Easck.Com
在通信领域中创建一个未被绑定的套接字,并且返回一个文件描述符,可以在以后对套接字进行操作的函数调用中使用uFg站长之家-易采站长站-Easck.Com

uFg站长之家-易采站长站-Easck.Com

2、 对于bind函数的使用

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

uFg站长之家-易采站长站-Easck.Com

3、 对于recvfrom函数的使用

3.1 函数原型uFg站长之家-易采站长站-Easck.Com
uFg站长之家-易采站长站-Easck.Com

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结构的长度uFg站长之家-易采站长站-Easck.Com

uFg站长之家-易采站长站-Easck.Com
3.2 函数的作用  uFg站长之家-易采站长站-Easck.Com
用来接收从socket套接字发送来的消息。该套接字的sockaddr结构也知道uFg站长之家-易采站长站-Easck.Com

uFg站长之家-易采站长站-Easck.Com

4、 WkARwefIq对于sendto函数的使用

4.1 函数原型uFg站长之家-易采站长站-Easck.Com
ssize_t recvfrom(int socket, const void* message, size_t length, uFg站长之家-易采站长站-Easck.Com
                 int flags, const struct sockaddr* dest_addr, uFg站长之家-易采站长站-Easck.Com
                socklen_t* dest_len);uFg站长之家-易采站长站-Easck.Com
4.2 函数的作用uFg站长之家-易采站长站-Easck.Com
该函数是socket套接字从dest_addr出接收消息uFg站长之家-易采站长站-Easck.Com

uFg站长之家-易采站长站-Easck.Com

三、 扩展知识uFg站长之家-易采站长站-Easck.Com

uFg站长之家-易采站长站-Easck.Com

1、 netstatuFg站长之家-易采站长站-Easck.Com

netstat是一个用来监控TCP/IP网络非重要工具uFg站长之家-易采站长站-Easck.Com
语法:netstat [选项]uFg站长之家-易采站长站-Easck.Com
功能:查看网络状态uFg站长之家-易采站长站-Easck.Com

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

uFg站长之家-易采站长站-Easck.Com

2、 pidofuFg站长之家-易采站长站-Easck.Com

查看服务器进程id是非常方面uFg站长之家-易采站长站-Easck.Com

语法:pisdof [进程名]uFg站长之家-易采站长站-Easck.Com

功能:通过进程名,查看进程iduFg站长之家-易采站长站-Easck.Com

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

如有侵权,请联系QQ:279390809 电话:15144810328

相关文章

  • Linux下用GHOST来做系统备份

    Linux下用GHOST来做系统备份

    在Windows系统下备份我们可以用GHOST工具软件完成,Linux系统不能完全依赖于GHOST工具,一则是GHOST本身是有版权的软件,二是GHOST只支持ext2、ext3文件系统的Linux分区,不支持reiserfs、xfs等
    2019-10-25
  • 给 FreeBSD 12.1 安装 GNOME3 图形界面

    给 FreeBSD 12.1 安装 GNOME3 图形界面

    FreeBSD是一个完全开放的、安全的系统,可以Do it yourself的系统。但是个人还是不喜欢呆板的命令行界面,所有就给 FreeBSD 12.1 安装 GNOME3 图形界面。 开始操作,启动FreeBSD 12.1,以root身份
    2019-10-27
  • Ubuntu Studio一个不错的操作系统

    Ubuntu Studio一个不错的操作系统

    Ubuntu Studio 是一个基于 Ubuntu 而面向音频、视频及图形爱好者的操作系统。本次推出的 Ubuntu Studio 为 7.04 版,目前仅支持 Intel i386 兼容的处理器。 Ubuntu Studio 从大量的开源多媒体创作程序
    2019-10-25
  • 最受欢迎的10款Linux免费游戏

    最受欢迎的10款Linux免费游戏

    图为在Linux下运行的免费游戏America's Army 如果你认为 Linux下没有什么好游戏的话,那就错了!我们来看看Linux下最受欢迎的10款游戏吧,而且这些游戏都是完全免费的! # skyreal update(06-12
    2019-10-25
  • compiz fusion特效使用心得(附3D桌面图)

    compiz fusion特效使用心得(附3D桌面图)

    3D桌面图 LINUX发行版就是好,当大多数人还在沉迷于那些什么风格图标鸟玻璃效果甚至孜孜不倦津津乐道的时候,Linux的高手们已经悄悄为我们开启了一个桌面系统3D的时代。 当我第一次
    2019-10-25
  • Ubuntu 下aMule 的安装配置

    Ubuntu 下aMule 的安装配置

    aMule 是一个类似于 eMule 的多平台 P2P 客户端程序。以下将简略叙述 aMule 在 Ubuntu 中的安装及配置 [High ID] 与 [KAD] 的过程。 安装: sudo apt-get install amule sudo apt-get install amule-utils 如果需要
    2019-10-25
  • JMeter jp@gc - stepping thread group插件

    JMeter jp@gc - stepping thread group插件

    这是一个出单接口压力测试的小例子,了解一下压力测试最最基础的基础。出单接口是用来保险出单的,不需要在UI界面下一步下一步的出单,接口一调数据入库完事~~~。再啰嗦一句接
    2019-10-27
  • Ubuntu 下使用K3B软件刻录光盘(图)

    Ubuntu 下使用K3B软件刻录光盘(图)

    不知大家会不会在Ubuntu下刻录光盘呢?k3b是KDE环境下的一个CD/DVD刻录软件,有非常容易使用的界面,功能比较齐全。用起来感觉就象是win下的Nero一样简单自然,比ubuntu里原来的刻录CD方式
    2019-10-25