Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Penjelasan mendalam tentang komponen utama susunan protokol Linux

Penjelasan mendalam tentang komponen utama susunan protokol Linux

WBOY
WBOYasal
2024-03-20 12:39:03968semak imbas

Penjelasan mendalam tentang komponen utama susunan protokol Linux

Sebagai sistem sumber terbuka, sistem pengendalian Linux telah menunjukkan prestasi yang baik dalam bidang komunikasi rangkaian, dan susunan protokolnya dianggap sebagai salah satu komponen utama. Dalam artikel ini, kami akan memberikan penjelasan yang mendalam tentang komponen utama susunan protokol Linux, termasuk antara muka rangkaian, soket, susunan protokol TCP/IP, dsb., dan menggunakan contoh kod khusus untuk membantu pembaca memahami dengan lebih baik.

1. Antara muka rangkaian

Antara muka rangkaian ialah komponen paling rendah dalam susunan protokol Linux dan bertanggungjawab untuk menghantar dan menerima paket data rangkaian. Di Linux, antara muka rangkaian dilaksanakan melalui pemacu peranti, dan setiap antara muka rangkaian mempunyai pengecam unik, seperti eth0, eth1, dsb. Kita boleh melihat maklumat antara muka rangkaian dalam sistem semasa melalui arahan ifconfig, seperti yang ditunjukkan di bawah:

ifconfig

Di Linux, struktur alamat soket antara muka rangkaian ditakrifkan dalam <linux> kod > Dalam fail pengepala, pengaturcara boleh mencipta soket yang terikat pada antara muka rangkaian yang ditentukan dengan memanggil socket() dan bind(). Berikut ialah contoh kod mudah: <code><linux></linux>头文件中,程序员可以通过调用socket()和bind()来创建一个绑定到指定网络接口的套接字。下面是一个简单的示例代码:

#include <sys/types.h>
#include <sys/socket.h>
#include <linux/if.h>

int main() {
    int sockfd;
    struct sockaddr sa;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd < 0) {
        perror("socket");
        return -1;
    }

    struct ifreq ifr;
    memset(&ifr, 0, sizeof(ifr));
    strcpy(ifr.ifr_name, "eth0");

    if(setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, (void*)&ifr, sizeof(ifr)) < 0) {
        perror("setsockopt");
        close(sockfd);
        return -1;
    }

    close(sockfd);
}

2. 套接字

套接字是Linux协议栈中的中间件,负责处理应用层和传输层之间的通信。在Linux中,套接字接口定义在<sys></sys>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>

#define PORT 8080

int main() {
    int sockfd, new_sockfd;
    struct sockaddr_in server_addr, client_addr;
    char buffer[1024];

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd < 0) {
        perror("socket");
        return -1;
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(PORT);

    if(bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("bind");
        return -1;
    }

    listen(sockfd, 5);

    while(1) {
       int addrlen = sizeof(client_addr);
       new_sockfd = accept(sockfd, (struct sockaddr*)&client_addr, &addrlen);
       memset(buffer, 0, sizeof(buffer));
       read(new_sockfd, buffer, sizeof(buffer));
       write(new_sockfd, buffer, strlen(buffer));
       close(new_sockfd);
    }

    close(sockfd);
    return 0;
}

2 Soket

Soket ialah perisian tengah dalam tindanan protokol Linux dan bertanggungjawab untuk mengendalikan komunikasi antara lapisan aplikasi dan lapisan pengangkutan. Di Linux, antara muka soket ditakrifkan dalam fail pengepala <sys></sys> Pengaturcara boleh menggunakan socket(), bind(), listen(), accept(), connect (). dan fungsi lain untuk mencipta dan mengurus soket.

Berikut ialah kod contoh pelayan TCP ringkas yang melaksanakan pelayan Echo berasaskan soket ringkas:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>

#define PORT 8080
#define SERVER_IP "127.0.0.1"

int main() {
    int sockfd;
    struct sockaddr_in server_addr;
    char buffer[1024];

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd < 0) {
        perror("socket");
        return -1;
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
    server_addr.sin_port = htons(PORT);

    if(connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("connect");
        return -1;
    }

    strcpy(buffer, "Hello, Server!");
    write(sockfd, buffer, strlen(buffer));
    memset(buffer, 0, sizeof(buffer));
    read(sockfd, buffer, sizeof(buffer));
    printf("Server response: %s
", buffer);

    close(sockfd);
    return 0;
}

3 Tindanan protokol TCP/IP

Di Linux, tindanan protokol TCP/IP melaksanakan komunikasi rangkaian Lapisan pengangkutan dan lapisan rangkaian. protokol, seperti TCP, UDP, IP, dll. Pengaturcara boleh mencipta soket TCP atau UDP melalui fungsi socket(), mewujudkan sambungan melalui fungsi connect() dan menghantar serta menerima data melalui fungsi send() dan recv().

Berikut ialah contoh kod klien TCP mudah yang melaksanakan penghantaran data ke pelayan Echo dan menerima respons: 🎜rrreee🎜Melalui contoh kod di atas, pembaca boleh mempunyai pemahaman yang lebih mendalam tentang komponen utama susunan protokol Linux, termasuk rangkaian antara muka, Soket dan susunan protokol TCP/IP. Saya harap artikel ini dapat membantu pembaca memahami dengan lebih baik prinsip asas komunikasi rangkaian Linux dan cara melaksanakan aplikasi rangkaian melalui kod. 🎜

Atas ialah kandungan terperinci Penjelasan mendalam tentang komponen utama susunan protokol Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn