tun/tap詳解

一、tun/tap概述

tun/tap是一種虛擬網絡設備,它可以將數據包從用戶空間傳輸到內核空間,或者反過來,通過用戶空間的程序來協議地訪問網絡設備。

tun/tap模塊的出現,主要是為了滿足虛擬網絡設備的需求。尤其是虛擬機技術的普及,使得網絡設備需要能夠高效地和虛擬機進行通信和交互,tun/tap成為了這方面的最佳選擇。

// 用戶空間程序創建並使用一個tun設備
#include 
#include 
#include 
#include 
#include 
#include 

int tun_alloc(char *dev) {
    struct ifreq ifr;
    int fd, err;

    if ((fd = open("/dev/net/tun", O_RDWR)) < 0) {
        return fd;
    }

    memset(&ifr, 0, sizeof(ifr));
    ifr.ifr_flags = IFF_TUN;
    if (*dev) {
        strncpy(ifr.ifr_name, dev, IFNAMSIZ);
    }

    if ((err = ioctl(fd, TUNSETIFF, (void *)&ifr))  0) {
        printf("Received %lu bytes\n", strlen(buffer));
    }

    close(tun_fd);
    return 0;
}

二、tun/tap的工作原理

tun/tap依賴於內核的TUN/TAP驅動模塊,它通過創建一個虛擬網絡設備,來實現一個虛擬的網絡接口,作為網絡數據包的收發通道。整個過程可以分為以下幾個步驟:

  1. 用戶程序申請創建tun/tap設備
  2. 內核向用戶程序返回tun/tap設備信息
  3. 用戶程序配置tun/tap設備
  4. tun/tap設備準備就緒,可以開始數據包的收發
  5. 用戶程序通過read/write等系統調用,向tun/tap設備中寫入/讀取數據包

在數據包的收發過程中,用戶程序和TUN/TAP驅動模塊之間通過ioctl系統調用交互,完成接口狀態、MAC和IP地址等的設置、讀取和修改等。同時,內核還會調度進程,執行網絡協議棧,完成數據包的處理和轉發等操作。

三、tun/tap的使用場景

tun/tap最常見的使用場景是虛擬機和容器技術,因為它可以實現網絡設備的隔離、共享和管理。在虛擬機中,將tun/tap設備掛載到虛擬機中,就可以實現虛擬機網絡設備和宿主機網絡設備之間的通信,也可以方便地實現虛擬機之間的網絡互通。

tun/tap還可以用於VPN和隧道網絡等場景,可以實現在公共網絡中建立私有網絡的功能。此外,tun/tap還可以用於網絡監控和測試等需求,方便收集和分析數據包。

四、tun/tap的高級特性

1. 多隊列支持

在網絡設備高負載的情況下,多隊列支持可以提高網絡設備的轉發性能。tun/tap對於多隊列的支持,可以通過參數設置和ioctl系統調用相結合的方式實現。通過設置多個隊列,不同流量可以被映射到不同隊列中,在每個隊列上進行處理,從而提高並發性和負載均衡性。

// 多隊列的創建與設置
int tun_queue[tun_queues];

for (int i = 0; i < tun_queues; i++) {
    // 創建tun設備
    tun_queue[i] = tun_create(tun_queue_name[i], IFF_TAP | IFF_NO_PI);
    // 為tun設備設置隊列數量
    ioctl(tun_queue[i], TUNSETQUEUE, i);
}

// 讀取隊列數據包操作
char buf[BUFLEN];
for (;;) {
    int ret = select(maxfd + 1, &rfds, NULL, NULL, NULL);
    if (ret < 0) {
        perror("select");
        break;
    }

    for (int i = 0; i < tun_queues; i++) {
        // 測試該文件描述符是否就緒
        if (FD_ISSET(tun_queue[i], &rfds)) {
            // 讀取數據
            int len = read(tun_queue[i], buf, BUFLEN);
            if (len < 0) {
                perror("read()");
                break;
            }

            // 處理數據包
            // ...
        }
    }
}

2. 用戶空間和內核空間之間的零拷貝技術

在tun/tap的數據收發過程中,往往會涉及到數據的拷貝,因為數據需要在用戶程序和內核之間進行傳遞。為了避免頻繁的數據拷貝對系統性能帶來的負面影響,tun/tap可以使用零拷貝技術,即在發送數據包時,將數據包的內存映射到內核空間,這樣就可以直接從內存中訪問數據包,避免了數據的複製操作。

int tun_fd;
char buffer[2048];

tun_fd = open("/dev/net/tun", O_RDWR);
if (tun_fd < 0) {
    perror("open");
    return EXIT_FAILURE;
}

memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TUN | IFF_NO_PI;

if (dev && *dev) {
    strncpy(ifr.ifr_name, dev, IFNAMSIZ);
}

if (ioctl(tun_fd, TUNSETIFF, (void *)&ifr) cmsg_level = IPPROTO_IP;
cmsg->cmsg_type = IP_TOS;
cmsg->cmsg_len = CMSG_LEN(sizeof(int));
*(int *)CMSG_DATA(cmsg) = IPTOS_LOWDELAY;

// 零拷貝技術的實現
int bytes_sent = sendmsg(tun_fd, &msg, MSG_DONTWAIT);

3. tun/tap虛擬設備的擴展

在tun/tap虛擬設備的使用中,還可以根據需要來自定義設備的協議和實現方式。比如,可以通過對TUN/TAP驅動模塊的修改,增加虛擬設備的類型和功能,也可以通過對用戶程序的修改,增加自定義的數據包處理邏輯。

原創文章,作者:TTANJ,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/333793.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
TTANJ的頭像TTANJ
上一篇 2025-02-01 13:34
下一篇 2025-02-01 13:34

相關推薦

  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性傳感器,能夠同時測量加速度和角速度。它由三個傳感器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變量讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分佈式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25

發表回復

登錄後才能評論