精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入 Linux 內核理解 socket 的本質

開發 網絡 Linux
本文將從一個初學者的角度開始聊起,讓大家了解 Socket 是什么以及它的原理和內核實現。

本文將從一個初學者的角度開始聊起,讓大家了解 Socket 是什么以及它的原理和內核實現。

一、Socket 的概念

 Socket 就如同我們日常生活中的插頭與插座的連接關系。在網絡編程中,Socket 是一種實現網絡通信的接口或機制。 想象一下,插頭插入插座后,電流得以流通,實現了能量的傳遞。而在網絡世界里,當一個程序使用 Socket 與另一臺機子建立“連接”時,就如同插頭成功插入了插座,數據能夠在兩者之間進行流通和交換。

例如,當我們在網上聊天時,發送方的程序通過 Socket 將消息發送出去,接收方的程序通過對應的 Socket 接收這些消息。又比如在下載文件時,下載程序通過 Socket 與提供文件的服務器建立連接,從而能夠獲取到所需的文件數據。

二、Socket 的使用場景

我們想要將數據從 A 電腦的某個進程發到 B 電腦的某個進程。如果需要確保數據能發給對方,就選可靠的 TCP 協議;如果數據丟了也沒關系,就選擇不可靠的 UDP 協議。初學者一般首選 TCP。

這時就需要用 socket 進行編程,首先創建關于 TCP 的 socket:

#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
int main() {
    int sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sock_fd == -1) {
        std::cerr << "Failed to create socket" << std::endl;
        return 1;
    }
 
    // 后續代碼...
 
    return 0;
}

這個方法會返回 sock_fd,它是 socket 文件的句柄。

對于服務端,得到 sock_fd 后,依次執行 bind()、listen()、accept() 方法,等待客戶端的連接請求;對于客戶端,得到 sock_fd 后,執行 connect() 方法向服務端發起建立連接的請求,此時會發生 TCP 三次握手。

連接建立完成后,客戶端可以執行 send() 方法發送消息,服務端可以執行 recv() 方法接收消息,反之亦然。

三、Socket 的設計

現在我們拋開socket,重新設計一個內核網絡傳輸功能。我們想要將數據從 A 電腦的某個進程發到 B 電腦的某個進程,從操作上來看,就是發數據給遠端和從遠端接收數據,也就是寫數據和讀數據。

但這里有兩個問題:

  • 接收端和發送端可能不止一個,因此需要用 IP 和端口做區分,IP 用來定位是哪臺電腦,端口用來定位是這臺電腦上的哪個進程。
  • 發送端和接收端的傳輸方式有很多區別,如可靠的 TCP 協議、不可靠的 UDP 協議,甚至還需要支持基于 icmp 協議的 ping 命令。

為了支持這些功能,需要定義一個數據結構 sock,在 sock 里加入 IP 和端口字段。這些協議雖然各不相同,但有一些功能相似的地方,可以將不同的協議當成不同的對象類(或結構體),將公共的部分提取出來,通過“繼承”的方式復用功能。

于是,定義了一些數據結構:

sock 是最基礎的結構,維護一些任何協議都有可能會用到的收發數據緩沖區。

在 Linux 內核 2.6 相關的源碼中,sock 結構體的定義可能類似于:

struct sock {
    // 相關字段
    struct sk_buff_head sk_receive_queue; // 接收數據緩沖區
    struct sk_buff_head sk_write_queue;  // 發送數據緩沖區
    // 其他可能的字段
};

inet_sock 特指用了網絡傳輸功能的 sock,在 sock 的基礎上還加入了 TTL、端口、IP 地址這些跟網絡傳輸相關的字段信息。比如 Unix domain socket,用于本機進程之間的通信,直接讀寫文件,不需要經過網絡協議棧。

可能的定義:

struct inet_sock {
    struct sock sk; // 繼承自 sock
    __be32 port;    // 端口
    __be32 saddr;   // IP 地址
    // 其他相關字段
};

inet_connection_sock 是指面向連接的 sock,在 inet_sock 的基礎上加入面向連接的協議里相關字段,比如 accept 隊列、數據包分片大小、握手失敗重試次數等。雖然現在提到面向連接的協議就是指 TCP,但設計上 Linux 需要支持擴展其他面向連接的新協議。

例如:

struct inet_connection_sock {
    struct inet_sock inet; // 繼承自 inet_sock
    struct request_sock_queue accept_queue; // accept 隊列
    // 其他相關字段
};

tcp_sock 就是正兒八經的 TCP 協議專用的 sock 結構,在 inet_connection_sock 基礎上還加入了 TCP 特有的滑動窗口、擁塞避免等功能。同樣 UDP 協議也會有一個專用的數據結構,叫 udp_sock。

大概如下:

struct tcp_sock {
    struct inet_connection_sock icsk; // 繼承自 inet_connection_sock
    // TCP 特有的字段,如滑動窗口、擁塞避免等相關字段
};

有了這套數據結構,將它跟硬件網卡對接一下,就實現了網絡傳輸的功能。

四、提供 Socket 層

由于這里面的代碼復雜,還操作了網卡硬件,需要較高的操作系統權限,再考慮到性能和安全,于是將它放在操作系統內核里。

為了讓用戶空間的應用程序使用這部分功能,將這部分功能抽象成簡單的接口,將內核的 sock 封裝成文件。創建 sock 的同時也創建一個文件,文件有個文件描述符 fd,通過它可以唯一確定是哪個 sock。將fd暴露給用戶,用戶就可以像操作文件句柄那樣去操作這個 sock 。

struct file{
    //文件相關的字段
    .....
    void *private_data; //指向sock
}

創建socket時,其實就是創建了一個文件結構體,并將private_data字段指向sock。

有了 sock_fd 句柄后,提供了一些接口,如 send()、recv()、bind()、listen()、connect() 等,這些就是 socket 提供出來的接口。

所以說,socket 其實就是個代碼庫或接口層,它介于內核和應用程序之間,提供了一堆接口,讓我們去使用內核功能,本質上就是一堆高度封裝過的接口。

我們平時寫的應用程序里代碼里雖然用了socket實現了收發數據包的功能,但其 實真正執行網絡通信功能的,不是應用程序,而是linux內核。

在操作系統內核空間里,實現網絡傳輸功能的結構是sock,基于不同的協議和應用場景,會被泛化為各種類型的xx_sock,它們結合硬件,共同實現了網絡傳輸功能。為了將這部分功能暴露給用戶空間的應用程序使用,于是引入了socket層,同時將sock嵌入到文件系統的框架里,sock就變成了一個特殊的文件,用戶就可以在用戶空間使用文件句柄,也就是socket_fd來操作內核sock的網絡傳輸能力。

五、Socket 如何實現網絡通信

以最常用的 TCP 協議為例,實現網絡傳輸功能分為建立連接和數據傳輸兩個階段。

1. 建立連接

在客戶端,執行 socket 提供的 connect(sockfd, "ip:port") 方法時,會通過 sockfd 句柄找到對應的文件,再根據文件里的信息指向內核的 sock 結構,通過這個 sock 結構主動發起三次握手。

在服務端,握手次數還沒達到“三次”的連接叫半連接,完成好三次握手的連接叫全連接,它們分別會用半連接隊列和全連接隊列來存放,這兩個隊列會在執行 listen() 方法的時候創建好。當服務端執行 accept() 方法時,就會從全連接隊列里拿出一條全連接。

雖然都叫隊列,但半連接隊列其實是個哈希表,而全連接隊列其實是個鏈表。

在 Linux 內核 2.6 版本的源碼中,相關的代碼實現可能位于網絡子系統的部分。例如,建立連接的過程可能涉及到 tcp_connect() 等函數。

2. 數據傳輸

為了實現發送和接收數據的功能,sock 結構體里帶了一個發送緩沖區和一個接收緩沖區,其實就是個鏈表,上面掛著一個個準備要發送或接收的數據。

當應用執行 send() 方法發送數據時,會通過 sock_fd 句柄找到對應的文件,根據文件指向的 sock 結構,找到這個 sock 結構里帶的發送緩沖區,將數據放到發送緩沖區,然后結束流程,內核看心情決定什么時候將這份數據發送出去。

接收數據流程也類似,當數據送到 Linux 內核后,先放在接收緩沖區中,等待應用程序執行 recv() 方法來拿。

當應用進程執行 recv() 方法嘗試獲取(阻塞場景下)接收緩沖區的數據時,如果有數據,取走就好;如果沒數據,就會將自己的進程信息注冊到這個 sock 用的等待隊列里,然后進程休眠。如果這時候有數據從遠端發過來了,數據進入到接收緩沖區時,內核就會取出 sock 的等待隊列里的進程,喚醒進程來取數據。

當多個進程通過 fork 的方式 listen 了同一個 socket_fd,在內核它們都是同一個 sock,多個進程執行 listen() 之后,都會將自身的進程信息注冊到這個 socket_fd 對應的內核 sock 的等待隊列中。在 Linux 2.6 以前,會喚醒等待隊列里的所有進程,但最后其實只有一個進程會處理這個連接請求,其他進程又重新進入休眠,會消耗一定的資源,這就是驚群效應。在 Linux 2.6 之后,只會喚醒等待隊列里的其中一個進程,這個問題被修復了。

服務端 listen 的時候,那么多數據到一個 socket 怎么區分多個客戶端的?以 TCP 為例,服務端執行 listen 方法后,會等待客戶端發送數據來。客戶端發來的數據包上會有源 IP 地址和端口,以及目的 IP 地址和端口,這四個元素構成一個四元組,可以用于唯一標記一個客戶端。服務端會創建一個新的內核 sock,并用四元組生成一個 hash key,將它放入到一個 hash 表中。下次再有消息進來的時候,通過消息自帶的四元組生成 hash key 再到這個 hash 表 里重新取出對應的 sock 就好了。

六、Socket 怎么實現“繼承”

Linux 內核是 C 語言實現的,而 C 語言沒有類也沒有繼承的特性,是通過結構體里的內存是連續的這一特點來實現“繼承”的效果。將要繼承的“父類”,放到結構體的第一位,然后通過結構體名的長度來強行截取內存,這樣就能轉換結構體,從而實現類似“繼承”的效果。

例如:

struct tcp_sock {
    /* inet_connection_sock has to be the first member of tcp_sock */
    struct inet_connection_sock inet_conn;
    // 其他字段
};
 
struct inet_connection_sock {
    /* inet_sock has to be the first member! */
    struct inet_sock icsk_inet;
    // 其他字段
};
 
// sock 轉為 tcp_sock
static inline struct tcp_sock *tcp_sk(const struct sock *sk) {
    return (struct tcp_sock *)sk;
}

七、總結

socket 中文套接字,可理解為一套用于連接的數字。

sock 在內核,socket_fd 在用戶空間,socket 層介于內核和用戶空間之間。

在操作系統內核空間里,實現網絡傳輸功能的結構是 sock,基于不同的協議和應用場景,會被泛化為各種類型的 xx_sock,它們結合硬件,共同實現了網絡傳輸功能。為了將這部分功能暴露給用戶空間的應用程序使用,于是引入了 socket 層,同時將 sock 嵌入到文件系統的框架里,sock 就變成了一個特殊的文件,用戶就可以在用戶空間使用文件句柄,也就是 socket_fd 來操作內核 sock 的網絡傳輸能力。

服務端可以通過四元組來區分多個客戶端。

內核通過 C 語言“結構體里的內存是連續的”這一特點實現了類似繼承的效果。

責任編輯:趙寧寧 來源: 一安未來
相關推薦

2025-04-28 02:00:00

2021-09-10 06:50:03

Node.jsSocket端口

2025-04-18 04:05:00

2021-05-19 07:56:26

Linux內核搶占

2012-11-22 10:11:16

LispLisp教程

2017-01-12 19:34:58

2021-12-09 08:09:31

Linux內核臟頁

2021-07-26 07:47:36

數據庫

2025-06-16 05:10:00

2021-07-20 08:02:41

Linux進程睡眠

2021-07-05 06:51:45

Linux內核調度器

2021-07-02 06:54:44

Linux內核主調度器

2020-09-28 08:44:17

Linux內核

2024-07-05 10:59:26

2025-08-28 07:58:18

2021-08-31 10:32:11

LinuxPage Cache命令

2014-03-12 10:19:54

iOS對象

2022-11-09 08:12:07

2023-02-10 08:11:43

Linux系統調用

2025-10-28 04:25:00

點贊
收藏

51CTO技術棧公眾號

久久久久久网站| 欧美日韩美少妇| 好吊妞www.84com只有这里才有精品| 精品无码m3u8在线观看| 欧美aaaaa级| 日韩人在线观看| 在线国产伦理一区| 人妻偷人精品一区二区三区| 午夜在线一区二区| 久久夜色精品国产| 亚洲欧美日本一区| 日韩av懂色| 精品国产999| 一区二区精品在线| 欧美日韩影视| 激情久久五月天| 热久久这里只有精品| 人妻少妇精品一区二区三区| 伊人久久综合影院| 精品国内片67194| 日韩肉感妇bbwbbwbbw| sm久久捆绑调教精品一区| 久久精品综合网| 岛国一区二区三区高清视频| 中文字幕+乱码+中文| 亚洲国产精品第一区二区三区| 这里只有精品在线播放| 噜噜噜在线视频| 成人台湾亚洲精品一区二区| 欧美日韩一区小说| 女性隐私黄www网站视频| 欧美aaaaaaa| |精品福利一区二区三区| 欧美日韩一区在线播放| 丰满人妻一区二区三区无码av| 麻豆国产欧美一区二区三区| 欧美在线一级视频| 日韩欧美一区二区一幕| 欧美日韩伊人| 美女福利精品视频| 亚洲女人毛茸茸高潮| 极品美女一区二区三区| 国产视频精品一区二区三区| 视频免费在线观看| 成人av综合网| 欧美大胆人体bbbb| 国产吃瓜黑料一区二区| 激情视频亚洲| 欧美一三区三区四区免费在线看| www.国产视频.com| 亚洲欧美专区| 欧美日韩国产电影| 簧片在线免费看| 在线看欧美视频| 色综合久久久久综合体| 国产男女无遮挡| 毛片无码国产| 在线观看国产91| 亚洲xxxx2d动漫1| 日韩一区二区三区在线免费观看| 欧美性少妇18aaaa视频| 成年人网站大全| 在线国产成人影院| 在线观看亚洲精品视频| 国产精品一区二区小说| 日本成人一区二区| 88在线观看91蜜桃国自产| 国产福利精品一区二区三区| 国产精品xnxxcom| 精品日韩在线观看| 久久久久国产精品区片区无码| 欧美激情影院| 国产亚洲激情在线| 来吧亚洲综合网| 欧美激情一区| 7m精品福利视频导航| 欧美a视频在线观看| 热久久国产精品| 18成人免费观看网站下载| 亚洲乱码国产乱码精品精软件| 99视频热这里只有精品免费| 日本一区二区视频| 成人高清免费在线| 亚洲二区在线观看| 国产自偷自偷免费一区| 成人豆花视频| 日韩精品免费在线视频| 天天操天天干天天操天天干| 一区二区三区网站| 欧美一区二区三区精品电影| 中文字幕在线观看国产| 国产不卡视频在线播放| 欧美日韩免费高清| www.久久ai| 欧美日韩一区二区在线 | av在线日韩国产精品| 综合激情成人伊人| 欧美黄网站在线观看| 欧美美女福利视频| 亚洲国产一区自拍| 97在线观看视频免费| 一区二区三区福利| 91精品免费视频| 手机看片福利在线观看| 日韩一区中文字幕| 2022亚洲天堂| 日韩激情精品| 一本色道久久88亚洲综合88| 国产午夜福利片| 久久精品国产在热久久| 久久riav| 羞羞网站在线看| 欧美性欧美巨大黑白大战| a级片在线观看视频| 色小子综合网| 国产91在线播放九色快色| www精品国产| 国产精品不卡在线| 日本在线视频www| 成人在线日韩| 色哟哟入口国产精品| 免费黄色网址在线| 国产综合色在线| 亚洲 国产 日韩 综合一区| caoporn-草棚在线视频最| 欧美视频一区二区三区| 全黄一级裸体片| 伊人久久亚洲热| 99理论电影网| 国产1区在线| 欧美剧在线免费观看网站| 天堂久久精品忘忧草| 亚洲乱码视频| 国产欧美一区二区在线播放| 影院在线观看全集免费观看| 欧美日韩国产天堂| 国产三级av在线播放| 免费在线欧美黄色| 精品国产免费一区二区三区| 成人爽a毛片免费啪啪动漫| 欧美一区三区二区| 日韩欧美123区| 激情综合网天天干| 免费在线观看污污视频| 青青青国产精品| 久久久成人精品视频| 一级二级三级视频| 亚洲欧洲成人自拍| 天堂在线一区二区三区| 99九九热只有国产精品| 国产欧美精品一区二区三区介绍| av每日在线更新| 欧美少妇性性性| 久久久久人妻一区精品色| 免播放器亚洲一区| 伊人婷婷久久| 欧美电影院免费观看| 欧美理论电影在线观看| 亚洲精品免费在线观看视频| 亚洲午夜av在线| xxxx黄色片| 久久成人在线| 亚洲成人蜜桃| 秋霞影院一区| 孩xxxx性bbbb欧美| 青青青草网站免费视频在线观看| 日韩人在线观看| 中文字幕91视频| 国产精品一区一区| 久在线观看视频| 久久93精品国产91久久综合| 国产美女91呻吟求| 色呦呦呦在线观看| 精品网站999www| 亚洲熟妇av乱码在线观看| 亚洲欧美一区二区三区久本道91| 又黄又色的网站| 久久深夜福利| 伊人久久大香线蕉综合75| 亚洲日本va午夜在线电影| 91国在线精品国内播放| 成人在线免费看| 日韩一级欧美一级| 日韩欧美一级视频| 中文字幕一区二区三区四区| 一级黄色大片免费看| 午夜一区不卡| 日韩国产精品毛片| 精品在线手机视频| 91精品国产综合久久久久久丝袜| 日韩大片免费观看| 久久av在线播放| 色播色播色播色播色播在线| 欧美精品视频www在线观看| 国产精品成人国产乱| 国产农村妇女精品| 国产日韩视频一区| 免费看日韩精品| 成人一区二区免费视频| 91蜜臀精品国产自偷在线 | 国产日产精品一区二区三区四区的观看方式 | 韩国一区二区视频| 37pao成人国产永久免费视频| 99国产精品免费视频观看| 美日韩精品免费| 2020最新国产精品| 国产欧美日韩91| 超级碰碰久久| 久久免费少妇高潮久久精品99| 成人在线观看一区| 日韩国产精品一区| 亚洲av永久无码国产精品久久| 日韩欧美亚洲国产一区| 18精品爽视频在线观看| 亚洲欧美日韩系列| 手机毛片在线观看| 久久综合国产精品| 国产高清成人久久| 国产精品夜夜爽| 亚洲一级免费在线观看| 久久男女视频| 免费成人在线视频网站| 亚洲香蕉网站| 成人污网站在线观看| 97精品国产| 欧洲一区二区日韩在线视频观看免费| 国产劲爆久久| 成人激情直播| 日韩精品一级| 444亚洲人体| 日韩成人精品| 亚洲va电影大全| 性欧美video另类hd尤物| 国产精品高精视频免费| 欧美成人影院| 青青草原成人在线视频| 天天综合av| 欧美亚洲在线视频| 色偷偷色偷偷色偷偷在线视频| 欧美精品久久久久久久免费观看| 91高清在线观看视频| 超碰91人人草人人干| 麻豆av在线导航| xvideos成人免费中文版| 麻豆91在线| 久久91精品国产91久久久| 91在线中字| 欧美成人中文字幕| 黑人玩欧美人三根一起进| 色综合视频一区中文字幕| 久久99亚洲网美利坚合众国| 久久久久久久久久久免费| 美女精品视频| 午夜精品一区二区三区在线视频| 草美女在线观看| 97精品一区二区视频在线观看| 久草免费在线视频| 日韩av手机在线| 日本美女久久| 91亚洲精品在线观看| 日韩激情综合| 久久精品人成| 欧美精品系列| 青春草在线视频免费观看| 国产中文一区| 777久久久精品一区二区三区| 老司机精品导航| 三上悠亚在线一区| 大白屁股一区二区视频| 亚洲精品乱码久久| 欧美国产精品专区| 欧美丰满艳妇bbwbbw| 婷婷激情综合网| 亚洲国产无线乱码在线观看| 91精品国产综合久久精品图片| 亚洲黄色在线播放| 亚洲毛片在线观看| 免费网站成人| 992tv成人免费视频| 黄色精品视频| 高清不卡日本v二区在线| 亚洲美女15p| 中文字幕日韩一区二区三区| 亚洲性图久久| 青青草原国产在线视频| 成人午夜在线免费| 欧美一区二区三区粗大| 悠悠色在线精品| 草莓视频18免费观看| 91精品国产丝袜白色高跟鞋| av女名字大全列表| 精品国产一区二区三区在线观看 | 免费一级做a爰片久久毛片潮| 国产精品福利av| 九九热在线视频播放| 3751色影院一区二区三区| 亚洲AV成人无码一二三区在线| 中文字幕不卡av| 国产盗摄——sm在线视频| 国产欧美日韩精品丝袜高跟鞋| 哺乳挤奶一区二区三区免费看| 亚洲精品久久区二区三区蜜桃臀| 亚洲视频福利| av中文字幕网址| 久久亚洲综合色| 国产一级中文字幕| 欧美精品自拍偷拍| 国际av在线| 韩国三级日本三级少妇99| 9.1麻豆精品| 日本在线一区| 亚洲欧美网站| 小毛片在线观看| 亚洲激情第一区| 91精品国产乱码久久久| 亚洲视频国产视频| av在线最新| 国产高清在线精品一区二区三区| 91亚洲一区| www.超碰com| wwwwww.欧美系列| 国产真人真事毛片| 日韩欧美亚洲国产另类| 麻豆免费在线视频| 成人高h视频在线| 久久国产精品亚洲人一区二区三区| 精品99在线视频| 91社区在线播放| 久久精品国产亚洲AV无码男同| 91精品国产综合久久精品麻豆| 免费黄网站在线播放| 国产精品第一页在线| 国产99久久久国产精品成人免费| 91免费黄视频| www.欧美日韩国产在线| 日韩成人免费在线观看| 精品国产乱码久久久久久浪潮| 3d玉蒲团在线观看| 亚洲最大成人免费视频| 亚洲女同中文字幕| 美女被艹视频网站| 亚洲精品乱码久久久久| 亚洲爱爱综合网| 欧美激情久久久| 超碰地址久久| 欧美a v在线播放| 91麻豆swag| 无码人妻精品一区二区三区9厂| 亚洲美女性视频| 国产一区二区主播在线| 五月天丁香综合久久国产| 蜜桃久久av一区| 任你操精品视频| 欧美一区二区在线观看| 在线āv视频| 精品欧美一区二区久久久伦| 日韩午夜激情| 日本高清www| 欧美日韩一区二区三区免费看 | 亚洲av无码一区二区三区dv| 欧美黄网免费在线观看| 精品欧美午夜寂寞影院| 成年人视频网站免费观看| 亚洲国产成人自拍| 国产精品视频在线观看免费| 欧美美女15p| 羞羞答答一区二区| 精品日韩久久久| 亚洲精品成人悠悠色影视| 日本黄视频在线观看| 日韩暖暖在线视频| 国产精品99久久久久久动医院| 手机在线观看日韩av| 亚洲mv在线观看| 福利在线播放| 99精彩视频在线观看免费| 亚洲一区免费| 国产精品久久国产精麻豆96堂| 日韩视频一区在线观看| 涩涩av在线| 9999在线观看| 成人精品免费看| 在线观看亚洲黄色| 欧美精品国产精品日韩精品| 精品中文字幕一区二区三区av| 四虎成人在线播放| 精品动漫一区二区三区| 免费网站免费进入在线| 精品一区二区三区自拍图片区 | 成人av资源在线播放| 一区福利视频| 91ts人妖另类精品系列| 亚洲激情视频在线播放| 成人黄色免费观看| 精品久久久久久无码中文野结衣| 欧美韩日一区二区三区四区| 性一交一乱一伧老太| 国产精品日韩精品| 一本色道精品久久一区二区三区| 激情五月激情综合|