热门标签 | 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()

推荐阅读
  • 在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ... [详细]
  • 本文详细介绍了如何使用Python中的smtplib库来发送带有附件的邮件,并提供了完整的代码示例。作者:多测师_王sir,时间:2020年5月20日 17:24,微信:15367499889,公司:上海多测师信息有限公司。 ... [详细]
  • 本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • Python中判断一个集合是否为另一集合子集的两种高效方法及其应用场景分析 ... [详细]
  • 本文介绍了如何使用Python的Paramiko库批量更新多台服务器的登录密码。通过示例代码展示了具体实现方法,确保了操作的高效性和安全性。Paramiko库提供了强大的SSH2协议支持,使得远程服务器管理变得更加便捷。此外,文章还详细说明了代码的各个部分,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 本文对比了杜甫《喜晴》的两种英文翻译版本:a. Pleased with Sunny Weather 和 b. Rejoicing in Clearing Weather。a 版由 alexcwlin 翻译并经 Adam Lam 编辑,b 版则由哈佛大学的宇文所安教授 (Prof. Stephen Owen) 翻译。 ... [详细]
  • 2.2 组件间父子通信机制详解
    2.2 组件间父子通信机制详解 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
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社区 版权所有