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. 适用场景

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值