Phần cứng giao diện mạng và nhân hệ điều hành xử lý lưu lượng bằng cách di chuyển các cấu trúc dữ liệu qua ranh giới bộ nhớ. Trong những ngày đầu của mạng Internet, mỗi khung Ethernet 1500 byte tương ứng với một ngắt xử lý độc lập, một khối đệm socket được cấp phát riêng biệt và một chu trình duyệt bảng định tuyến cùng các chuỗi tường lửa. Dù kiến trúc xử lý từng gói này hoạt động ổn định trên các đường truyền 100 Mbps, những kết nối đa gigabit hiện đại đã bộc lộ giới hạn nghiêm trọng. Khi lưu lượng đi qua các đường hầm mạng riêng ảo (VPN) mã hóa, chi phí đóng gói phần mềm càng đẩy mức tiêu hao CPU lên cao, kìm hãm tốc độ truyền tải thực tế.

Để giải quyết giới hạn xử lý từng gói, nhân Linux đã tích hợp các hệ thống con gộp gói và hỗ trợ xử lý bằng phần cứng: TCP Segmentation Offload (TSO), Generic Segmentation Offload (GSO) và Generic Receive Offload (GRO). Phân tích cách các cơ chế này phối hợp cùng thiết bị TUN ảo, lớp vỏ mã hóa và trình điều khiển mạng nhân sẽ giải thích cách hạ tầng truyền vận hiện đại đạt tốc độ dây dẫn mà không làm quá tải CPU máy chủ.

Điểm nghẽn CPU theo từng gói tin: Giới hạn MTU trên các giao diện ảo

Trong mô hình mạng IP tiêu chuẩn, đơn vị truyền tải tối đa (MTU) của Ethernet thường cố định ở mức 1500 byte. Trừ đi 20 byte tiêu đề IPv4 cùng 20 hoặc 32 byte tiêu đề TCP, kích thước phân đoạn tối đa (MSS) chỉ còn 1460 byte. Để truyền tải đầy băng thông trên đường truyền 10 Gbps, hệ thống cần gửi và nhận xấp xỉ 820.000 gói tin mỗi giây.

Xử lý từng gói 1500B truyền thống:
[Dữ liệu] -> Tách TCP (1460B) -> [skb_1..skb_45] -> Netfilter -> Định tuyến -> Driver -> 45 ngắt CPU

Gộp gói GSO (Siêu gói 64KB):
[Dữ liệu] -> Một siêu gói (64KB) -> [Một skb duy nhất] -> Netfilter -> Định tuyến -> Phân đoạn muộn / Card mạng

Bão ngắt phần cứng và chi phí chuyển đổi ngữ cảnh trong luồng xử lý phần mềm

Mỗi gói tin khi đi qua nhân hệ điều hành đều kích hoạt một chuỗi các thao tác quản lý bộ nhớ và điều hướng thực thi:

  • Cấp phát và khởi tạo cấu trúc bộ đệm socket nhân (struct sk_buff).
  • Truy vấn bộ nhớ đệm bảng định tuyến và đối soát quy tắc kiểm soát truy cập qua các điểm móc netfilter hoặc eBPF.
  • Thực thi chuyển đổi mật mã (ChaCha20-Poly1305 hoặc AES-GCM) giữa hai đầu đường hầm.
  • Phát sinh ngắt mềm (NET_RX_SOFTIRQ và NET_TX_SOFTIRQ) trên các lõi xử lý khả dụng.

Khi các gói tin đến riêng lẻ với tần suất vượt 500.000 khung hình mỗi giây, các lõi CPU tiêu tốn phần lớn thời gian phục vụ các trình xử lý ngắt và liên tục làm tràn bộ nhớ đệm CPU L1/L2 thay vì tính toán logic cho ứng dụng. Trong mạng riêng ảo, mỗi gói tin đi qua giao diện ảo TUN hoặc TAP còn gánh thêm chi phí trung chuyển siêu dữ liệu qua tiến trình nền ở không gian người dùng và kích hoạt chuyển đổi ngữ cảnh hệ thống.

Suy giảm hiệu năng bộ nhớ khi trung chuyển qua ranh giới người dùng và hạt nhân

Các tiến trình dịch vụ VPN ở không gian người dùng đọc dữ liệu từ bộ mô tả mạng ảo (/dev/net/tun) thông qua các lệnh gọi hệ thống như read() hoặc recvmsg(). Nếu đường hầm xử lý dữ liệu nghiêm ngặt ở ranh giới MTU 1500 byte, một phiên truyền tệp đạt thông lượng 1 Gbps sẽ buộc hệ điều hành phải chuyển đổi ngữ cảnh hơn 80.000 lần mỗi giây.

Mỗi lần dịch chuyển giữa không gian hạt nhân và không gian người dùng gây nghẽn bộ đệm dịch địa chỉ (TLB), tuần tự hóa thanh ghi và cạnh tranh đường truyền bộ nhớ. Nếu thiếu cơ chế gom nhóm dữ liệu theo khối, CPU sẽ cạn kiệt năng lực xử lý trước khi giao diện mạng vật lý đạt tới ngưỡng bão hòa băng thông.

Tăng tốc truyền tải: Phần cứng TSO và cơ chế Generic Segmentation Offload (GSO)

Để loại bỏ hiện tượng kiệt sức CPU ở chiều gửi, các kỹ sư mạng chuyển giao nhiệm vụ chia cắt phân đoạn cho bộ điều khiển giao diện mạng (NIC) hoặc trì hoãn việc này tới ranh giới điều khiển phần mềm cuối cùng.

Tạo siêu gói tin: Bảo toàn thuộc tính giao thức với cơ chế điều phối nhịp TCP

Kỹ thuật TCP Segmentation Offload (TSO) cho phép ngăn xếp truyền tải TCP xây dựng một khối dữ liệu liền mạch duy nhất có kích thước lên tới 64 KB (GSO_MAX_SIZE), coi toàn bộ khối này là một đơn vị truyền dẫn độc lập. Thay vì phân mảnh dữ liệu thành các khối 1460 byte ngay tại tầng socket:

  1. Động cơ TCP tạo một cấu trúc sk_buff chứa lượng dữ liệu tương đương tối đa 45 khung MTU tiêu chuẩn.
  2. Siêu gói tin đi qua các chuỗi netfilter, tính toán kiểm soát tắc nghẽn và hàng đợi điều tiết lưu lượng như một thực thể đơn nhất.
  3. Bộ điều phối nhịp TCP duy trì khoảng cách thời gian chính xác giữa các đợt phát dữ liệu gộp, tuân thủ nguyên lý kiểm soát trễ từng được phân tích trong bài viết về /news/bufferbloat-active-queue-management-vpn-fq-codel-cake.
  4. Phân bổ số thứ tự gói tin và kiểm tra cửa sổ trượt chỉ diễn ra một lần cho toàn bộ siêu gói thay vì lặp lại hàng chục lần.

Do card mạng vật lý đòi hỏi vi mã phần cứng chuyên dụng để cắt nhỏ dữ liệu TSO, nhân Linux đã giới thiệu cơ chế Generic Segmentation Offload (GSO) nhằm khái quát hóa kỹ thuật tối ưu này cho mọi thiết bị, bao gồm cả card mạng ảo và đường hầm bảo mật.

Thực thi skb_gso_segment(): Phân mảnh muộn tại tầng điều khiển thiết bị

Khi siêu gói tin gửi đi tiến vào hàng đợi thiết bị, nhân hệ thống sẽ kiểm tra cờ tính năng (netdev->features). Nếu trình điều khiển hoặc phần cứng công bố hỗ trợ cờ NETIF_F_TSO hoặc NETIF_F_GSO, khối sk_buff hợp nhất sẽ được chuyển thẳng vào hàng đợi vòng của phần cứng.

Trường hợp giao diện đích không hỗ trợ phân mảnh phần cứng—tình huống phổ biến khi lưu lượng được đóng gói vào các mạng phủ riêng biệt—nhân sẽ gọi hàm skb_gso_segment() tại điểm gọi dev_hard_start_xmit(). Hàm này tiến hành phân đoạn phần mềm ở giai đoạn muộn nhất:

struct sk_buff *skb_gso_segment(struct sk_buff *skb, netdev_features_t features)
{
    if (skb_needs_check(skb, true))
        return ERR_PTR(-EINVAL);

    /* Chia nho tai trong skb thanh cac phan doan MTU, nhan ban tieu de */
    return skb_mac_gso_segment(skb, features);
}

Bằng cách trì hoãn chia gói đến khoảnh khắc cuối cùng trước khi phát sóng, 95% đường dẫn xử lý của hạt nhân chỉ phải thao tác trên một cấu trúc dữ liệu duy nhất thay vì bốn mươi lăm cấu trúc, giảm thiểu đáng kể số lần giao dịch trên bus bộ nhớ.

Hợp nhất luồng nhận: Cơ chế Generic Receive Offload (GRO) trong chu trình NAPI

Trong khi GSO thúc đẩy luồng gửi dữ liệu, chiều lưu lượng đi vào hệ thống cần một cơ chế đảo ngược tương ứng. Các giao diện mạng tốc độ cao tiếp nhận hàng nghìn khung Ethernet 1500 byte rời rạc và các khung này cần được hợp nhất trước khi đi vào tầng lõi IP và TCP.

Xác thực giao thức nghiêm ngặt: Hợp nhất các phân đoạn tuần tự đúng thứ tự

Cơ chế Generic Receive Offload (GRO) hoạt động ngay bên trong vòng lặp thăm dò ngắt mềm NAPI của Linux. Khi trình điều khiển mạng lấy gói tin từ hàng đợi vòng phần cứng, hàm napi_gro_receive() sẽ phân tích các tiêu đề đến để xác định xem các gói tin kế tiếp nhau có thuộc về cùng một luồng truyền vận hay không.

GRO áp dụng các quy chuẩn xác thực giao thức khắt khe trước khi tiến hành gom nhóm phân đoạn:

  • Địa chỉ IP, cặp cổng kết nối và mã định danh giao thức phải trùng khớp hoàn toàn.
  • Số thứ tự chuỗi TCP phải liên tục, không xuất hiện khoảng trống hoặc chồng lấn dữ liệu.
  • Tùy chọn mốc thời gian TCP (RFC 7323) phải nhất quán và tăng đơn điệu.
  • Các chỉ số thông báo tắc nghẽn tường minh (ECN) phải đồng nhất trên mọi khung hình được ghép nối.

Nếu bất kỳ trường tiêu đề nào không khớp hoặc có sự xáo trộn thứ tự gói tin, GRO sẽ ngắt chuỗi gộp và chuyển ngay bộ đệm hiện tại lên tầng trên. Quá trình kiểm định chặt chẽ này bảo toàn độ chuẩn xác truyền vận, giúp các giải thuật như /news/tcp-sack-rfc-6675-loss-recovery-pipe-algorithm-vpn và /news/tcp-rack-tlp-rfc-8985-time-based-loss-recovery-vpn thu thập đo đạc thứ tự chính xác.

Giảm bớt số lần duyệt ngăn xếp: Phân phối khối dữ liệu 64 KB tới socket

Sau khi hợp nhất, một cấu trúc sk_buff duy nhất mang tải trọng lên tới 64 KB sẽ được chuyển lên ngăn xếp mạng. Thay vì phải tính toán định tuyến và đối soát quy tắc lọc gói 40 lần cho một khối 60 KB dữ liệu đi vào, hạt nhân chỉ cần đánh giá đúng một lần duy nhất. Ứng dụng nhận tại tầng socket chỉ cần thực hiện một lệnh gọi read(), xóa bỏ hàng loạt chu kỳ đánh thức tiến trình và giảm tới 70% mức tải CPU.

Tích hợp giao diện TUN ảo: IFF_VNET_HDR và cơ chế tăng tốc UDP trong VPN

Trong môi trường ảo hóa và mạng bảo mật, ranh giới hiệu năng then chốt nằm ở điểm giao tiếp giữa ngăn xếp mạng nhân và động cơ đóng gói đường hầm.

Vận chuyển siêu dữ liệu Virtio Net qua ranh giới thiết bị /dev/net/tun

Theo cách thức truyền thống, giao diện /dev/net/tun của Linux loại bỏ toàn bộ thông tin offload phần cứng, buộc các bộ điều hợp ảo chỉ xử lý dữ liệu bị giới hạn trong khung MTU. Để khắc phục trở ngại này, Linux đã bổ sung cờ IFF_VNET_HDR dành riêng cho thiết bị TUN/TAP.

Khi ứng dụng VPN kích hoạt cờ IFF_VNET_HDR, mỗi gói tin trao đổi với thiết bị /dev/net/tun sẽ được gắn kèm một tiêu đề struct virtio_net_hdr ở phần đầu:

struct virtio_net_hdr {
    uint8_t  flags;       /* Trang thai checksum hop le hoac can tinh toan */
    uint8_t  gso_type;    /* Kieu offload VIRTIO_NET_HDR_GSO_TCPV4, UDP */
    uint16_t hdr_len;     /* Chieu dai tieu de Ethernet + IP + TCP */
    uint16_t gso_size;    /* Kich thuoc MSS dich cho phan doan cuoi */
    uint16_t csum_start;  /* Vi tri bat dau vung tinh checksum */
    uint16_t csum_offset; /* Do lech de ghi gia tri checksum */
};

Cấu trúc này truyền tải định hướng offload xuyên qua ranh giới thiết bị. Tiến trình VPN ở không gian người dùng có thể nhận trọn vẹn một siêu gói 64 KB chỉ bằng một lệnh read(), bảo toàn toàn bộ siêu dữ liệu GSO. Tiến trình sau đó mã hóa dữ liệu theo khối lớn và chuyển giao cho card mạng vật lý mà không cần phân đoạn trung gian.

Phân đoạn UDP và cơ chế GRO cho đường hầm WireGuard cùng IPsec

Các kiến trúc VPN hiện đại phần lớn đóng gói dữ liệu bên trong datagram UDP. Trong các phiên bản nhân Linux từ 4.18 trở đi, sự xuất hiện của tính năng UDP GSO (UDP_SEGMENT) và UDP GRO (UDP_GRO) đã mở ra bước tiến vượt bậc:

  1. UDP GSO: Cho phép ứng dụng VPN xây dựng một datagram UDP duy nhất có độ lớn lên tới 64 KB và chỉ định kích thước phân đoạn mong muốn cho nhân thông qua tùy chọn socket UDP_SEGMENT.
  2. Mã hóa khối hàng loạt: Giao thức đường hầm xử lý mã hóa các khối 64 KB trong bộ nhớ bằng tập lệnh vector hóa chuyên dụng (AVX-512 hoặc ARM NEON), tránh lãng phí chi phí nạp lại trạng thái mật mã cho từng gói tin nhỏ.
  3. Phân phối phần cứng: Card mạng vật lý phụ trách chia nhỏ các gói tin ngoài dây dẫn, duy trì hiệu suất MTU tối đa mà không gây ra hiện tượng phân mảnh đường hầm.

Cách tiếp cận này ngăn ngừa sụt giảm thông lượng do hiện tượng bộ nhớ đệm bão hòa đột ngột trong giai đoạn khởi động chậm, vấn đề đã được khảo cứu chuyên sâu trong bài viết về /news/tcp-hystart-plus-rfc-9406-bufferbloat-slow-start-vpn.

Tối ưu hóa kiến trúc hạ tầng: Động cơ đường ống truyền tải cao RiceGuard

VPNRice ứng dụng trực tiếp các bước đột phá về cơ chế offload nhân vào ngăn xếp đường hầm thông qua động cơ tăng tốc RiceGuard:

  • Kiến trúc TUN đa hàng đợi: Thiết lập các hàng đợi ảo chuyên biệt gắn chặt với từng lõi CPU cụ thể, loại bỏ hiện tượng tranh chấp khóa xoay trong các bộ phân phối gói tin đa luồng.
  • Tăng tốc tiêu đề Vnet: Tích hợp chặt chẽ cùng IFF_VNET_HDR và TUNSETOFFLOAD, luân chuyển các siêu gói 64 KB GSO trực tiếp giữa vòng tròn mã hóa và ngăn xếp mạng hệ thống.
  • Phân tách UDP GRO thích ứng: Tự động nhận diện dung lượng bộ đệm socket của thiết bị nhận, gom các gói tin đường hầm mã hóa đến thành siêu gói trước khi thực hiện xác thực chữ ký số.
  • Vòng bộ nhớ phi sao chép: Phân bổ trước các bộ đệm vòng tròn thẳng hàng với đường dẫn bộ nhớ đệm CPU, triệt tiêu sự cố tràn bộ đệm dịch địa chỉ trong suốt quá trình truyền tải tốc độ cao.

Nhờ những cải tiến hạ tầng này, VPNRice duy trì thông lượng tối đa trên các kết nối cáp quang và sóng 5G hiện đại, đồng thời kiểm soát nhiệt độ thiết bị ở mức mát mẻ và tiết kiệm năng lượng tối đa trên các thiết bị di động.

Đo kiểm thực nghiệm trên Linux: Cấu hình và xác minh tính năng GSO và GRO

Các kỹ sư mạng và quản trị viên hệ thống có thể kiểm tra cũng như thiết lập các thông số phân mảnh offload trên cổng kết nối Linux bằng các công cụ dòng lệnh tiêu chuẩn.

Kiểm tra năng lực offload mạng bằng tiện ích ethtool

Lệnh ethtool cho phép truy vấn và hiệu chỉnh các tính năng xử lý phần cứng trên giao diện mạng:

# Truy van trang thai cac tinh nang offload tren giao dien vat ly eth0
ethtool -k eth0 | grep -E "segmentation|receive-offload"

# Ket qua mau tra ve:
# tcp-segmentation-offload: on
# generic-segmentation-offload: on
# generic-receive-offload: on
# large-receive-offload: off [fixed]

Để kích hoạt hoặc thiết lập lại trạng thái offload mong muốn:

# Dam bao GSO va GRO duoc kich hoat tren bo dieu hop mang WAN
sudo ethtool -K eth0 gso on gro on tso on

# Theo doi so lieu thong ke gop goi cua trinh dieu khien
ethtool -S eth0 | grep -E "gro|gso|tso"

Để tối ưu hóa hiệu quả của GSO và GRO, bộ nhớ đệm socket nhân cần được cấu hình đủ lớn nhằm chứa được các siêu gói 64 KB mà không xảy ra tràn hàng đợi:

# Tang gioi han bo nho dem socket mac dinh va toi da cua he thong
sudo sysctl -w net.core.rmem_max=16777216
sudo sysctl -w net.core.wmem_max=16777216

# Thiet lap cac nguong bo nho TCP (toi thieu, mac dinh, toi da tinh bang trang)
sudo sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sudo sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"

# Kiem tra gioi han kich thuoc goi GSO tren giao dien duong ham ao
ip -d link show dev tun0

Việc bảo đảm card mạng vật lý, giao diện TUN ảo và các bộ đệm socket nhân hoạt động đồng bộ với cơ chế offload giúp doanh nghiệp xóa bỏ các nút thắt tuần tự hóa CPU, khai phóng đường truyền bảo mật đạt hiệu năng đa gigabit ổn định.

Tải VPNRice.