linux对于UDP的学习

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

一、UDP、linux基础介绍

套接字:就是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地址用来标识一个主机

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

【问题】

(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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 距离详解Linux下的UDP方式通讯

    UDP方式点对点通讯  #include <stdio.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <errno.h> #include <stdlib.h> #include <arpa/inet.h> int main(int argc, char

  • Linux网络编程之UDP Socket程序示例

    在网络传输协议中,TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接.TCP有一种"重传确认"机制,即接收端收到数据后要发出一个肯定确认的信号,发送端如果收到接收端肯定确认的信号,就会继续发送其他的数据,如果没有,它就会重新发送. 相对而言,UDP协议则是一种无连接的,不可靠的数据报(SOCK_DGRAM)传输服务.使用UDP套接口不用建立连接,服务端在调用socket()生成一个套接字并调用bind()绑定端口后就可

  • Linux UDP服务端和客户端程序的实现

    1. 源码 UDP服务端: /** * @brief UDP服务端 * @author Mculover666 * @date 2020/04/15 */ #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include

  • Linux中使用C语言实现基于UDP协议的Socket通信示例

    linux下udp服务器端源码示例: #include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <string.h> #include <netinet/in.h> #include <stdio.h> #include <un

  • linux对于UDP的学习

    目录 一.UDP.linux基础介绍 二.对于各函数使用 1.对于socket函数的使用 2. 对于bind函数的使用 3. 对于recvfrom函数的使用 4. 对于sendto函数的使用 三. 扩展知识 1. netstat 2. pidof 一.UDP.linux基础介绍 套接字:就是IP地址+端口号 IP地址:4字节 端口号:2字节,也就是说范围是0~65535 端口号分为:知名端口号.一些固定的端口号 知名端口号 0--1023:http,ssh,ftp,telnet等一些协议端口号都

  • Linux网络编程之基于UDP实现可靠的文件传输示例

    了解网络传输协议的人都知道,采用TCP实现文件传输很简单.相对于TCP,由于UDP是面向无连接.不可靠的传输协议,所以我们需要考虑丢包和后发先至(包的顺序)的问题,所以我们想要实现UDP传输文件,则需要解决这两个问题.方法就是给数据包编号,按照包的顺序接收并存储,接收端接收到数据包后发送确认信息给发送端,发送端接收确认数据以后再继续发送下一个包,如果接收端收到的数据包的编号不是期望的编号,则要求发送端重新发送. 下面展示的是基于linux下C语言实现的一个示例程序,该程序定义一个包的结构体,其中

  • Linux UDP socket 设置为的非阻塞模式与阻塞模式区别

    Linux UDP socket 设置为的非阻塞模式与阻塞模式区别 UDP socket 设置为的非阻塞模式 Len = recvfrom(SocketFD, szRecvBuf, sizeof(szRecvBuf), MSG_DONTWAIT, (struct sockaddr *)&SockAddr,&ScokAddrLen); UDP socket 设置为的阻塞模式 Len = recvfrom(SocketFD, szRecvBuf, sizeof(szRecvBuf), 0, (

  • linux封锁IP简单防御UDP攻击

    研究起因由于近些日子我的VPS遭受攻击,不管是win的还是linux的都遭受了UDP攻击,流量剧增不一会DOWN机了,这让我很恼火,非常想知道是谁干的 现在说下我的本地测试VPS配置 centos6.0 1.我们要查看这些流量的攻击来源,所以我们需要下载iftop 地址wget http://www.ex-parrot.com/pdw/iftop/download/iftop-0.17.tar.gz 安装的时候发现make出错 最后发先这个需要以下包 CentOS上安装所需依赖包: yum in

  • Linux shell脚本基础学习详细介绍(完整版)第1/2页

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Linux 脚本编写基础 ◆1.1 语法基本介绍1.1.1 开头程序必须以下面的行开始(必须方在文件的第一行):#!/bin/sh符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序.当编辑好脚本时,如果要执行该脚本,还必须使其可执行.要使脚本可执行:编译

  • 从Windows转向Linux教程 E3000基础学习

    本书适合广大Linux学习者.立即节省您的Linux培训银子.E3000助您学习Linux之旅更愉快!疯狂增长Linux知识.传承经典给广大Linux初学者重新洗牌! 本教程传承练成Linux高手的经典及图文并茂的特征,立即告别Linux初学者进入中级或高级阶段.同时又传承了从Windows转向Linux教程 V2.0全面多解决方案特点.图文并茂让您把握最重点最基础的Linux知识.挑战更高的Linux技能从这开始. 下载地址:CHM版:ftp://FTP_hllinux:123456@211.

  • Linux 内核通用链表学习小结

    描述 在linux内核中封装了一个通用的双向链表库,这个通用的链表库有很好的扩展性和封装性,它给我们提供了一个固定的指针域结构体,我们在使用的时候,只需要在我们定义的数据域结构体中包含这个指针域结构体就可以了,具体的实现.链接并不需要我们关心,只要调用提供给我们的相关接口就可以完成了. 传统的链表结构 struct node{ int key; int val; node* prev; node* next; } linux 内核通用链表库结构 提供给我们的指针域结构体: struct list

  • Linux shell脚本全面学习入门

    1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可执行: 编译 chmod +x filename 这样才能用./filename 来运行 1.1.2 注释 在进行shell编程时,以#开头的句子表示注释,直到这一行的结束.我们真诚地建议您

  • 基于linux程序中段的学习总结详解

    linux程序的段陆陆续续接触过一些,今天适当的总结一下,时间仓促,总结的比较零散.linux 段:text:已编译程序的机器代码..rodata:只读数据.printf中的格式串,或者开关语句的跳转表.data:已初始化的全局变量.bss:未初始化的全局变量.symtab:符号表.注意:1.如果定义一个全局变量,int i = 0;它被初始化为0,但是,它却不是放在data段中的,而是放在bss段中的.因为编译器可能会做一些优化,如果初始化为0,则它会将它等同于未初始化的变量.这样的可能要求他

  • Linux之UDP协议及其编程全流程

    目录 UDP协议的特点 UDP的编程流程 UDP接口原型 UDP服务器端 UDP客户端 UDP的报头结构 UDP的优势 UDP的数据报服务 总结 UDP协议的特点 UDP 不提供可靠性的传输,它只是把应用程序传给 IP 层的数据报发送出去,但是并不能保证它们能到达目的地. 由于 UDP 在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快. 无连接 不可靠 数据报服务 UDP发出的数据包不经过确认,可以继续发送.发送成功与否都不管,尽最大能力去发送,丢包也不负

  • linux shell数组深入学习理解

    bash shell只支持一维数组,但参数个数没有限制. 声明一个数组:declare -a array(其实不用声明,按数组方式直接赋值给变量即可,BASH就知道那是数组) 数组赋值:(1) array=(var1 var2 var3 ... varN)(2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN)(3) array[0]=var1    arrya[1]=var2    ...    array[n]=varN 计算数组元素个数:${#

  • 新手学习Linux系统的11点建议

    随着Linux应用的扩展许多朋友开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起.这里介绍学习Linux的一些建议. 一.从基础开始:常常有些朋友在Linux论坛问一些问题,不过,其中大多数的问题都是很基础的.例如:为什么我使用一个命令的时候,系统告诉我找不到该目录,我要如何限制使用者的权限等问题,这些问题其实都不是很难的,只要了解了 Linux 的基础之后,应该就可以很轻易的解决掉这方面的问题.而有些朋友们常常一接触Linux 就是希望构架网站,根本没有

随机推荐