当前位置: 首页 > news >正文

Python--网络编程(下)

五、OSI 七层模型
  1. 模型分层与功能
    层级名称核心功能
    7应用层定义数据格式(如 HTTP 协议)
    6表示层数据编码/解码、加密/解密(如 UTF-8 编码)
    5会话层建立、维护、终止会话(如 TCP 三次握手)
    4传输层端到端通信,确保数据完整性(如 TCP/UDP 协议)
    3网络层IP 寻址和路由(如路由器处理 IP 包)
    2数据链路层MAC 地址寻址,数据帧封装(如交换机处理 MAC 地址)
    1物理层物理介质传输二进制数据(如网线传输电信号)
  2. 数据传输流程示例

    • 用户访问网页:

      1. 应用层生成 HTTP 请求:GET /s?wd=你好 HTTP/1.1​
      2. 表示层编码为字节流:...encode('utf-8')​
      3. 传输层添加端口信息(目标端口 80,本地端口随机)
      4. 网络层添加源/目标 IP 地址
      5. 数据链路层封装 MAC 地址
      6. 物理层通过网卡发送数据
  3. 实际开发中的体现

    • 开发者关注层:应用层(HTTP)、传输层(TCP/UDP)
    • 底层自动处理:网络层以下由操作系统和网络设备完成

六、TCP 与 UDP 协议
  1. 核心对比
    特性TCPUDP
    连接方式面向连接(三次握手)无连接
    可靠性可靠传输(ACK 确认、重传机制)尽最大努力交付,不保证可靠性
    速度较慢(需建立连接和确认)极快(无连接开销)
    应用场景文件传输、网页访问实时视频、语音通话
  2. TCP 三次握手与四次挥手

    • 三次握手(建立连接):

      客户端 --> SYN=1, seq=x --> 服务端  
      服务端 --> SYN=1, ACK=1, seq=y, ack=x+1 --> 客户端  
      客户端 --> ACK=1, seq=x+1, ack=y+1 --> 服务端  
      
    • 四次挥手(断开连接):

      客户端 --> FIN=1 --> 服务端  
      服务端 --> ACK=1 --> 客户端  
      服务端 --> FIN=1 --> 客户端  
      客户端 --> ACK=1 --> 服务端  
      
  3. 代码示例

    • TCP 服务端:

      sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      sock.bind(('127.0.0.1', 8001))
      sock.listen(5)  # 监听连接
      conn, addr = sock.accept()  # 阻塞等待客户端连接
      
    • UDP 服务端:

      server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
      server.bind(('127.0.0.1', 8002))
      data, addr = server.recvfrom(1024)  # 直接接收数据
      

七、粘包问题与解决方案
  1. 粘包原因

    • 发送方多次快速发送小数据包,接收方缓冲区合并读取
    • 网络传输中数据分片重组
  2. 解决方案

    • 定长头部法:

      1. 发送数据前附加固定长度头部(如 4 字节),标明数据长度
      2. 接收方先读头部,再按长度读取完整数据
      # 发送端
      header = struct.pack('i', len(data))  # 4字节头部
      conn.sendall(header + data)
      
      # 接收端
      header = conn.recv(4)
      data_length = struct.unpack('i', header)[0]
      data = conn.recv(data_length)
      
  3. 优化策略

    • 动态调整缓冲区大小
    • 使用消息队列分隔数据包

八、阻塞与非阻塞模式
  1. 阻塞模式

    • 特点:accept()​、recv()​、connect()​ 会阻塞线程直到操作完成
    • 适用场景:简单客户端/服务端,无需高并发
  2. 非阻塞模式

    • 启用方法:

      sock.setblocking(False)  # 设置为非阻塞
      
    • 异常处理:操作未完成时抛出 BlockingIOError​,需配合重试机制

    • 适用场景:高并发场景,需结合 IO 多路复用


九、IO 多路复用
  1. 核心机制

    • select:遍历监控的文件描述符,返回就绪的 IO 对象
    • poll:与 select 类似,但无最大文件数限制
    • epoll:基于事件回调,高效处理大量连接(Linux 专属)
  2. 代码示例(select 实现多客户端处理)

    inputs = [server_socket]
    while True:
        r, _, _ = select.select(inputs, [], [], 0.1)
        for sock in r:
            if sock == server_socket:
                conn, addr = sock.accept()
                inputs.append(conn)
            else:
                data = sock.recv(1024)
                if data:
                    print(f"Received: {data.decode()}")
                else:
                    inputs.remove(sock)
    
  3. 适用场景

    • 服务端需同时处理数千连接
    • 客户端需批量发送请求(如爬虫并发下载)

相关文章:

  • GPTQ - 生成式预训练 Transformer 的精确训练后压缩
  • C++编程指南23 - 在无关线程之间共享资源时应使用shared_ptr
  • IntelliJ IDEA 华为云远程开发配置步骤
  • 通用文件模型
  • Axure设计之数据列表动态列设置/列筛选案例
  • 设计模式Python版 状态模式
  • 开发者社区测试报告(功能测试+性能测试)
  • 尚硅谷爬虫note14
  • ZooKeeper 基本概述
  • 意向锁的目的
  • 探索数据仓库自动化:ETL流程设计与实践
  • 【Pandas】pandas Series swaplevel
  • Python爬虫实战:一键采集电商数据,掌握市场动态!
  • 自然语言处理(NLP)中文文本预处理主流方法
  • python中采用opencv作常规的图片处理的方法~~~
  • 华为OD机试-发现新词的数量(Java 2024 E卷 100分)
  • Kafka 消息不丢失:全方位保障策略
  • redis菜鸟教程
  • 【MATLAB源码-第271期】基于matlab的雷达发射回波模拟,包括匹配滤波,加窗旁瓣控制,以及MTD处理。
  • C++ STL string容器全解析
  • 官方静态网站模板/seo作弊
  • 个人网站申请/深圳seo技术
  • 工信部网站 登陆/成都网站seo技巧
  • 一家专做二手手机的网站叫什么手机/线上销售方案
  • 上饶网站建设srsem/关键字排名优化公司
  • 小程序注册失败/优化神马网站关键词排名价格