linux一切皆文件之Unix domain socket描述符(二)
发布日期:2025-04-07 11:59:16 浏览次数:7 分类:精选文章

本文共 1693 字,大约阅读时间需要 5 分钟。

Unix域套接字(UDS)实践与分析

在本次实践中,深入探讨了Unix域套接字的工作原理及其在进程间通信中的应用,具体涉及以下环节:

一、入门认识

Unix域套接字(Unix domain socket, UDS)在Linux系统中提供了一种机内通信的高效手段。与网络套接字不同,UDS完全局限于同一台计算机内的进程通信,且其通信机制与文件操作相似,使得进程间的数据交互更加简便高效。

二、代码实践

1. 服务器端文件(server.py)

import socketserver_addr = '/tmp/server.sock'sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)sock.bind(server_addr)sock.listen(0)while True:    conn, client_addr = sock.accept()    data = conn.recv(100)    conn.sendall(data)

2. 客户端文件(client.py)

import socketimport timeserver_addr = '/tmp/server.sock'sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)sock.connect(server_addr)while True:    message = 'Hello World!'    sock.sendall(message)    time.sleep(1)    sock.recv(1)

3. 旅程见闻

运行代码,观察到以下关键现象:

  • 服务器进程(pid 2554)

    • 打开套接字文件/tmp/server.sock,并立即进入监听状态。
    • 每次接收客户端连接请求后,创建新的文件描述符(如fd 4)来处理数据传输。
  • 客户端进程(pid 2555)

    • 与服务器成功连接,打开用于通信的文件描述符(如fd 3)。
    • 定时发送“Hello World!”数据,与服务器进行互动。
  • 内核交互分析(strace输出)

    • 服务器(server.py)
      • 使用描述符4读取数据,调用recvfrom进行接收,然后立即用同样描述符发送数据。
    • 客户端(client.py)
      • 使用描述符3发送数据,然后接收服务器返回的数据,每次等待一秒后继续循环。
  • 三、深入剖析

    1. 协议与结构

    在UDS中,套接字文件/tmp/server.sock充当唯一标识符,连接建立基于该文件和进程间的文件描述符:

    • 服务器(server.py)

      • 通过socket.bind(server_addr)将套接字绑定到指定文件。
      • 进入监听状态,等待客户端的连接请求。
      • 每次接入后,使用同一套接字进行数据交换,确保非阻塞通信。
    • 客户端(client.py)

      • 通过socket.connect(server_addr)与服务器进行连接。
      • 定期发送数据至服务器,并接收返回信息,保持通信流程。

    2. 内核与用户空间交互

    通过strace分析可见,进程在用户空间向内核空间转发数据,套接字将数据存储在内存空间中各自独立的内存段内:

    • 服务器和客户端各持有一块内存段,通过描述符表示。
    • 数据在内核空间通过套接字结构体传输,回传至客户端。

    3. 优势与特点

    • 高效性:无需网络协议,直接使用内存进行数据传输,带来低延迟。
    • 简易性:操作与标准文件操作类似,便于开发和调试。
    • 版内局限性:通信仅限同机,适用于内部需求,XB fairness。

    四、小结与调整

  • 针对资源占用问题(多次连接导致文件数目增加),建议使用setsockopt或者改用AF_UNIX的不同方法,如共享句柄。
  • 为提高发送效率,需使用mMSG功能或技巧分批次读取。
  • 建议探索第三方库(如ZEROMQ)增强性能,自动管理连接等功能。
  • 通过本次实践,不仅加深了对UDS原理的理解,也掌握了进程间高效通信的实用方法。这为后续的系统设计和优化奠定了坚实基础。

    上一篇:Linux上Java的安装与配置
    下一篇:Linux、Windows渗透测试靶场手动搭建实战(附靶场安装包与安装脚本)

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2025年04月19日 07时22分57秒