UDP——python网络编程笔记
Ip协议:数据包传至正确的机器:主机定位
维护两个程序的会话
1.区别同一主机上不同程序的数据包:多路复用
2.修复数据包的错误:丢失重传,错序重组,丢弃冗余:可靠传输
UDP:提供端口号,多路分解。原始数据包的多路复用
消息队列
数据包提供端口号:源端口,目标端口
客户端查询服务器:
内存中构造查询
OS:将查询封装为UDP数据包
目标地址:识别客户端,返回响应
客户端没有显式声明端口号——OS自动分配
socket.getservbyname('域名'):查询域名服务的端口号
0-1023知名端口
socket.getaddinfo()解析端口
API设计
python标准库封装了:兼容posixOS网络操作的底层系统调用。封装后的函数名与原始调用名
为原始调用提供了基于对象的接口
网络操作背后的系统调用围绕着socket套接字进行
套接字:通信端点,OS用整数标识。python用socket.socket对象表示,内部维护OS分配的整数(fileno)
调用socket.socket对象的方法,请求使用套接字的系统调用时,自动使用内部维护的整数标识符。
fileno整数,也是一个文件描述符。从表示所有打开文件的整数池中获取
os.read/.write 文件描述符就是套接字
调用一次socket.socket()返回socket对象,之后在这个套接字对象上调用
创建空套接字,指定协议族与数据报(datagram)类型。
数据报(datagram)应用层数据块传输
OS网络栈不保证数据包是单个数据报
bind,绑定UDP网络地址:python二元组:IP+端口
.getsockname获取二元组信息
recvfrom 接收数据报,返回
发送者的客户端地址
数据包内容
sendto
要发送的信息与目标地址(自身地址如何被服务器识别?如需通信,要包含自身地址与端口)
没有检查数据报的源地址
不考虑地址是否正确,接收并处理所有收到的数据包的网络监听客户端:混杂客户端
服务器是混杂客户端?
解决方法:
1.唯一标识符 客——服——客
2.检查地址
UDP提供寻址方案,但不提供自身地址打包?
connect阻止其他地址向客户端发送数据包
客户端与服务器:
请求与响应是相对的?绝对的?
UDP客户端:不可靠性,需要在循环内发送请求,无法区分以下事件:
1.响应时间长,但终会传至客户端
2.请求/响应在传输中丢失
3.服务器宕机,无法做出响应
UDP客户端选择等待时间,超时重发请求。否则无限等待
socket.timeout,中断recv调用
recv调用阻塞调用方
丢包主要原因:网络拥堵,重发只会恶化,选择合适的间隔时间,避开阻塞
指数退避
长连接UDP:先验:最近几次响应时间
无法区分:不能被观测到的事物与不存在的事物
显式bind:服务器
隐式bind:客户端:OS分配临时端口
connect:指定send目标位置(IP+端口),按地址过滤数据包的来源
只能绑定一个目标地址,重复绑定覆写
解决客户端混杂性
getpeername
connect没有实际网络操作
可以伪造数据包的地址为其他服务器地址
请求ID(每次不同)
将响应与重复发送的请求对应
攻击者得到请求数据包——安全性失效
服务器响应先到——有效
2.3绑定接口
服务器bind绑定可使用
127.0.0.1 本机数据包
‘’通配符 任何网络接口收到的数据包
服务器绑定到外部IP,限制可与服务器通信的外部主机
同机器客户端自环接口连接服务:服务器不会响应
客户端连接到外部IP,可以通信
同一机器多个服务器:
一个连接自环接口
一个连接外部IP
UDP套接字名是二元组,可以不同IP指定相同端口
服务器绑定到自环端口,防止接受外部数据包
实际取决于OS的选择与配置?
2.4UDP分组
UDp发送原始数据报。被封装成IP数据包,加入信息:发送方与接收方的端口。
UDP大数据报——分成小数据报——单独IP数据包——网络传输
大数据包容易丢包、数据兼容差
2.5套接字选项
setsocketopt,getsocketopt 获取,设置套接字选项
SO_BROADCAST
SO_DONTROUTE:只向与本机连接的子网内主机发送数据包
SO_TYPE:套接字类型,传给getsocket查询
2.6广播
接受广播数据包的服务器(多个)
发送广播数据包的客户端
UDP适用场景:每次发送一条消息然后等待响应
多条消息:智能消息队列:信息打包
TCP实现:传输负载分组
时间要求苛刻的媒体流,丢包可接受