热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python网络编程之UDP协议

UDP和TCP的区别 TCPUDP连接性面向连接面向无连接传输可靠性可靠不可靠传输模式流数据报应用场景传输大量的数据少量数据速度慢快TCP:TCP的可靠体现在传输数据之前,会有三次

UDP 和 TCP 的区别

 TCPUDP
连接性面向连接面向无连接
传输可靠性可靠不可靠
传输模式数据报
应用场景传输大量的数据少量数据
速度

TCP:

TCP 的可靠体现在传输数据之前,会有三次握手来建立连接。在数据传完后,还会断开连接用来节约系统资源。在数据传递时,有确认机制、重传机制、拥塞控制机制以保证传输的可靠性,但这些机制都会消耗大量的时间和系统资源,每个连接都会占用系统的 CPU、内存等硬件资源,所以也导致 TCP 容易被人利用,比如 DDOS、CC 等攻击。

一般用于文件传输、收发邮件或远程登录等对数据准确性要求高的场景。

UDP:

UDP 没有 TCP 那些可靠的机制,所以在数据传递时,如果网络质量不好,就会很容易丢包。但 UDP 也是无法避免攻击的,比如:UDP Flood 攻击。

一般用于即时通讯、在线视频、网络电话等对传输效率要求高,但对准确性要求相对低的场景。

  • 面向有连接型

《Python 网络编程之 UDP 协议》

发送数据之前,需要在收发主机之间建立一条通信线路,在通信传输前后,专门进行建立和断开连接的处理,如果与对端之间无法通信,可避免发送无谓的数据。

  • 面向无连接型

《Python 网络编程之 UDP 协议》

这种类型不要求建立和断开连接,发送端可任何时候发送数据,接收端也不知道自己何时从哪里接受数据,这种情况下,接收端需要时常确认是否收到数据,彼此也不需要确认对方是否存在。

关于 TCP 网络编程的实现请参考我的另一篇博文 Socket 通信原理

UDP 网络编程实现

面向无连接的 UDP 时序图

《Python 网络编程之 UDP 协议》

创建 Socket

sock = socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

  1. family -> 地址族

    • socket.AF_UNIX: 用于同一台机器上的进程通信(既本机通信)
    • socket.AF_INET: 用于服务器与服务器之间的网络通信
    • socket.AF_INET6: 基于 IPV6 方式的服务器与服务器之间的网络通信
  2. type -> Socket 对象的类型

    • socket.SOCK_STREAM: 基于 TCP 的流式 Socket 通信
    • socket.SOCK_DGRAM: 基于 UDP 的数据报式 Socket 通信
    • socket.SOCK_RAW: 原始套接字,普通的套接字无法处理 ICMP、IGMP 等网络报文,而 SOCK_RAW 可以;其次 SOCK_RAW 也可以处理特殊的 IPV4 报文;此外,利用原始套接字,可以通过 IP_HDRINCL 套接字选项由用户构造 IP 头
    • socket.SOCK_SEQPACKET: 可靠的连续数据包服务
  3. proto -> 协议编号,默认是 0,一般可以忽略该参数
  4. fileno -> Socket 的文件描述符,如果指定了 fileno,则其他参数将被忽略,返回指定文件描述符的 Socket。

创建 TCP Socket:

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

创建 UDP Socket:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

UDP 通信

sock.recvfrom(bufsize[, flags])

接受 UDP 套接字的数据,与 recv() 类似,但返回值是 tuple(data, address)。其中 data 是包含接受数据的字符串,address 是发送数据的 Socket 地址

注意协议接收到的数据可能大于 buf 的长度,所以在这种情况下要调用几次 recv 函数才能把 Socket 接收缓冲区中的数据 copy 完。recv 函数仅仅是 copy 数据,真正接收数据是由协议来完成的。

sock.sendto(bytes, address)

发送 UDP 数据,将数据发送到 Socket,address 形式为 tuple(ipaddr, port),指定远程地址发送,返回值是发送的字节数

Python 2.x 发送的报文是 str 类型,Python 3.x 发送的报文是 bytes 类型,在发送前要记得编码。

客户端代码

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
address = ('127.0.0.1', 8020)
while True:
msg = input('Wanna send: ')
if not msg:
break
sock.sendto(bytes(msg, 'utf-8'), address) # Return the number of bytes sent
data, addr = sock.recvfrom(1024)
data = data.decode('utf-8')
print('Response:', data)
sock.close()

服务端代码

import socket
import time
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('127.0.0.1', 8020))
print('waiting for message...')
while True:
data, addr = sock.recvfrom(1024)
data = data.decode('utf-8')
print('Got message from', addr)
print('Received message:', data)
sock.sendto(bytes('[%s] %s' % (time.ctime(), data), 'utf-8'), addr)
sock.close()

推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 概述H.323是由ITU制定的通信控制协议,用于在分组交换网中提供多媒体业务。呼叫控制是其中的重要组成部分,它可用来建立点到点的媒体会话和多点间媒体会议 ... [详细]
  • POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai ... [详细]
  • 1、概述首先和大家一起回顾一下Java消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了:然后在另一篇博客《Java消息队列-ActiveMq实战》中 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • Python中sys模块的功能及用法详解
    本文详细介绍了Python中sys模块的功能及用法,包括对解释器参数和功能的访问、命令行参数列表、字节顺序指示符、编译模块名称等。同时还介绍了sys模块中的新功能和call_tracing函数的用法。推荐学习《Python教程》以深入了解。 ... [详细]
  • 本文介绍了iOS开发中检测和解决内存泄漏的方法,包括静态分析、使用instruments检查内存泄漏以及代码测试等。同时还介绍了最能挣钱的行业,包括互联网行业、娱乐行业、教育行业、智能行业和老年服务行业,并提供了选行业的技巧。 ... [详细]
  • 交换机配置:intg100unshintvlani1ipadd192.168.56.177qstelseuser-iv4authaaaproinsshupl3qsshuserpyt ... [详细]
  • 1、DashAPI文档Dash是一个API文档浏览器,使用户可以使用离线功能即时搜索无数API。程序员使用Dash可访问iOS,MacOS, ... [详细]
author-avatar
多米音乐_34306427
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有