zoukankan      html  css  js  c++  java
  • 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实现:传输负载分组

    时间要求苛刻的媒体流,丢包可接受

  • 相关阅读:
    php中__construct()和__initialize()的区别
    js的栈内存和堆内存
    CC攻击原理及防范方法
    html页面调用js文件里的函数报错onclick is not defined处理方法
    yii2深入理解之内核解析
    Scala Data Structure
    Scala Basis
    【MySql】牛客SQL刷题(下)
    【Flume】知识点整理
    【kafka】生产者API
  • 原文地址:https://www.cnblogs.com/qmcj/p/9212466.html
Copyright © 2011-2022 走看看