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 实现: 传输负载分组
时间要求苛刻的媒体流, 丢包可接受
来源: http://www.bubuko.com/infodetail-2654342.html