色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux如何操作將數據包發送出去

dyquk4xk2p3d ? 來源:良許Linux ? 2023-06-17 16:00 ? 次閱讀

Linux 服務器收到網絡數據包,需要經過哪些處理,一步步將數據傳給應用進程的呢?應用進程發送數據包時,Linux 又是如何操作將數據包發送出去的呢?今天我們就來聊聊這個話題

在準備好接收網絡數據包之前,Linux需要做很多準備工作,例如:網絡子系統的初始化、協議棧的注冊、網卡驅動的初始化、啟動網卡等等,只有這些都準備好了之后,才能真正開始接收網絡包。

網絡協議棧

在介紹Linux收發網絡數據包之前,我們先來了解一下Linux網絡協議棧。

國際標準化組織制定了開放式系統互聯通信參考模型(Open System Interconnection Reference Model),也就是 OSI 網絡模型,該模型主要有 7 層,分別是應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層以及物理層。

由于 OSI 模型太復雜,提出的只是存在于概念和理論上的一種模型,分層太多,增加了網絡工作的復雜性,所以沒有大規模應用。 我們比較常見是TCP/IP 網絡模型,Linux 系統正是按照這套網絡模型來實現網絡協議棧的。

TCP/IP 網絡模型共有 4 層,分別是應用層、傳輸層、網絡層和網絡接口層,每一層負責的職能如下:

1、應用層對應于OSI參考模型的高層,為用戶提供所需要的各種服務,例如:FTP、Telnet、DNS、SMTP等.

2、傳輸層對應于OSI參考模型的傳輸層,為應用層實體提供端到端的通信功能,保證了數據包的順序傳送及數據的完整性。該層定義了兩個主要的協議:傳輸控制協議(TCP)和用戶數據報協議(UDP).

3、網絡層對應于OSI參考模型的網絡層,主要解決主機到主機的通信問題。它所包含的協議設計數據包在整個網絡上的邏輯傳輸。注重重新賦予主機一個IP地址來完成對主機的尋址,它還負責數據包在多種網絡中的路由。該層有三個主要協議:網際協議(IP)、互聯網組管理協議(IGMP)和互聯網控制報文協議(ICMP)。

4、網絡接口層與OSI參考模型中的物理層和數據鏈路層相對應。它負責監視數據在主機和網絡之間的交換。事實上,TCP/IP本身并未定義該層的協議,而由參與互連的各網絡使用自己的物理層和數據鏈路層協議,然后與TCP/IP的網絡接入層進行連接。地址解析協議(ARP)工作在此層,即OSI參考模型的數據鏈路層。 e6ec1544-0cb3-11ee-962d-dac502259ad0.png

接收網絡數據包

e6fe5286-0cb3-11ee-962d-dac502259ad0.png

網絡數據包到達網卡后,按照FIFO順序被存入網卡的接收隊列,網卡通過 DMA 技術,將網絡包寫入到指定的內存地址(Ring Buffer)。

Ring Buffer是在網卡驅動程序啟動時創建和初始化的,存儲的是sk_buff緩沖區的描述符(物理地址和大小等)。

當網絡包到達時,從Ring Buffer獲取指向的sk_buff描述符,通過DMA將數據寫入該地址。等sk_buff中的數據交由上層協議棧處理后,Ring Buffer中的描述更新為新分配的sk_buff。

接著網卡向 CPU 發起硬件中斷,當 CPU 收到硬件中斷請求后,根據中斷注冊表,找到注冊的中斷處理函數。

硬件中斷處理函數會做如下的事情:

1、屏蔽網卡的中斷

目的是避免CPU被頻繁中斷而無法處理其他任務,屏蔽中斷是告訴網卡已經知道內存中有數據了,下次再收到數據包直接寫內存就可以了,不要再通知 CPU 了。

2、發起軟中斷,恢復剛才屏蔽的中斷

內核中的 ksoftirqd 線程收到軟中斷后,就會調用相應軟中斷的處理函數來輪詢處理數據,即:從Ring Buffer 中獲取一個數據幀,用 sk_buff 表示,作為一個網絡包交給網絡協議棧從下到上進行逐層處理。

網絡協議棧對網絡包的處理流程如下:

1、網絡接口層

首先,網絡接口層檢查報文的合法性和正確性,如果不合法或報文校驗不正確則丟棄,否則找出上層協議的類型(IPv4還是IPv6),去掉幀頭、幀尾,然后交給上層即網絡層處理。

2、網絡層

網絡層取出IP頭,判斷網絡包下一步的走向,是轉發還是交給上層。當確認網絡包是要發送給本機后,就取出上層協議的類型(比如TCP或UDP),去掉IP頭,然后交給傳輸層處理。

3、傳輸層

傳輸層取出 TCP 頭或者 UDP 頭后,根據四元組【 源 IP、源端口、目的 IP、目的端口 】,找出對應的 Socket,并把數據拷貝到 Socket 的接收緩沖區。

4、應用層

最后,應用層程序調用 Socket 接口,將內核的 Socket 接收緩沖區的數據拷貝到應用層的緩沖區。

到這里,一個網絡包的接收過程就結束了。

發送網絡數據包

我們了解了網絡包的接收流程后,就很容易理解網絡包的發送流程了。網絡包的發送方向,正好跟接收方向相反。

首先,應用程序調用 Socket 發送網絡包的接口。這是一個系統調用,會從用戶態陷入到內核態的套接字層中。

套接字層會申請一個內核態的 sk_buff 內存,將用戶待發送的數據拷貝到 sk_buff 內存,并將其加入到Socket發送緩沖區等待網絡協議棧的處理。

由于網絡數據包從應用程序傳到內核時是原始數據,協議棧要在原始數據中加入通信約定才能保證數據到達服務端能被正確識別。網絡協議棧從 Socket 發送緩沖區中,取出數據包,然后按照 TCP/IP 棧的分層(傳輸層、網絡層、網絡接口層),從上到下逐層進行處理,各層將協議的頭信息不斷插入到數據包中。

協議棧對發送數據包的處理流程如下:

1、傳輸層

在傳輸層,會為器添加TCP頭,同時拷貝一個新的 sk_buff 副本,這是因為 sk_buff 在到達網卡發送完成的時候,會被釋放掉,而TCP 協議是支持重傳的,為確保網絡包可靠傳輸,在收到對方的 ACK 之前,這個 sk_buff 不能被刪除。

2、網絡層

在網絡層,主要會做這些工作:選取路由(確認下一跳的 IP)、填充 IP 頭、netfilter 過濾、對超過 MTU 大小的數據包進行分片。處理完這些工作后會交給網絡接口層處理。

3、網絡接口層

網絡接口層會進行物理地址尋址,以找到下一跳的 MAC 地址,填充幀頭和幀尾,將其放到發送隊列中。然后觸發軟中斷告訴網卡驅動程序:隊列中有新的網絡包需要發送。驅動程序收到通知會通過 DMA ,從發送包隊列中讀出網絡幀,并通過DMA將數據寫入網卡的FIFO發送隊列。

4、網卡設備

網卡設備從FIFO發送隊列中取出數據包,將其發送到網絡;當發送完成的時候,網卡設備會觸發一個硬中斷來釋放內存,主要是釋放 sk_buff內存和清理 RingBuffer 內存。最后,當收到這個 TCP 報文的 ACK 應答時,傳輸層就會釋放原始的 sk_buff。

至此,一個網絡包的發送流程就結束了。

責任編輯:彭菁

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11320

    瀏覽量

    209833
  • 數據包
    +關注

    關注

    0

    文章

    263

    瀏覽量

    24412
  • 模型
    +關注

    關注

    1

    文章

    3262

    瀏覽量

    48916

原文標題:終于有人把Linux系統收發網絡數據包的過程講清楚了!

文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux系統收發網絡數據包的工作過程

    Linux 服務器收到網絡數據包,需要經過哪些處理,一步步數據傳給應用進程的呢?應用進程發送數據包
    發表于 06-08 12:34 ?545次閱讀
    <b class='flag-5'>Linux</b>系統收發網絡<b class='flag-5'>數據包</b>的工作過程

    加入IGMP組后,數據包不再通過UDP發送,為什么?

    有誰知道IGMP_Join后發送數據包需要什么 似乎在加入IGMP組后,數據包不再通過UDP發送。 在下面的示例中,第一個數據包總是被
    發表于 07-10 07:20

    一個packet寫到發送隊列時,該隊列會立刻數據發送出去還是會等待發送隊列中的數據包到達該隊列的閾值?

    QMSS和CPPI接收外部數據,分發給每個核以及核間通訊4.問題:a.發送數據時,當一個packet寫到發送隊列時,該隊列會立刻
    發表于 06-25 04:39

    請問用光敏實驗采集的數據,怎么樣通過WIFI發送出去

    比如用光敏實驗采集的數據,怎么樣通過WIFI發送出去?怎么樣通過WIFI用電腦控制開發板上面的LED燈,這類的問題,謝謝解答。
    發表于 06-03 21:35

    lwip中數據不能發送出去

    我現在在stm32上用lwip和上位機通訊,正常情況下數據每次能發送出去,并且lwip中tcp_output函數里 pcb->unacked == NULL的,但是當出現異常情況時,數據發送
    發表于 07-04 04:35

    請問特征值發送出去用什么函數?

    請問下,我想把特征值 里面的值發送出去需要用什么函數呢?還是說我只要用SimpleProfile_SetParameter()這個函數設置好要發的特征值就可以了,讓主機自己去讀呢?小白請教大家。謝謝。
    發表于 03-05 10:30

    NRF24L01如何才能將所有數據發送出去呢?

    利用NRF24L01通信發送數據,資料說的是可以發送最長32個字節但是我只能發送16個字節,只能發送一半,后面的全部都為了0了,請問這是為什
    發表于 06-10 09:25

    DSP處理結果如何通過SCI發送出去

    在工程實際應用中需要將DSP處理結果通過SCI發送出去,但是所要傳輸的數據是浮點float型,無法通過SCI發送,該如何處理?謝謝~
    發表于 07-23 06:27

    為什么文章無法提交 發送出去

    為什么文章無法提交 發送出去
    發表于 07-22 14:23

    一個浮點型的數通過串口發送出去 精選資料分享

    可能大家對發送字符串,整數,數組等待的沒有問題,也想的明白,可是對于浮點型的數,或許有些不知所措(大佬繞過,小白我是這樣)今天搞懂了,就記錄下!其實發送原理還是通過字符串的形式發送出去的。只不過
    發表于 08-18 07:14

    如何一個浮點型的數通過串口發送出去

    如何一個浮點型的數通過串口發送出去
    發表于 11-22 06:16

    如何printf()函數的數據用STM32的串口發送出去

    如何去使用C語言中的printf()函數呢?如何printf()函數的數據用STM32的串口發送出去呢?
    發表于 12-01 07:58

    智能家居設備可能會將數據通過網絡發送出去 數據安全受到威脅

    你可能覺得你的智能家居設備只會與你進行溝通,然而事實并非如此,你的設備可能會將數據通過網絡發送出去,以便與服務器進行通信,甚至可能會發送到你不希望擁有這些數據的人手中。現在,普林斯頓的
    發表于 04-19 08:48 ?670次閱讀

    簡述Linux系統收發網絡數據包的過程

    Linux 服務器收到網絡數據包,需要經過哪些處理,一步步數據傳給應用進程的呢?應用進程發送數據包
    的頭像 發表于 05-05 10:04 ?641次閱讀
    簡述<b class='flag-5'>Linux</b>系統收發網絡<b class='flag-5'>數據包</b>的過程

    stm32 HAL庫spi接收的同時為什么有數據發送出去

    stm32 HAL庫spi接收的同時為什么有數據發送出去? 在STM32 HAL庫中,SPI接口的數據收發是通過DMA傳輸完成的。因此,通過SPI接收數據時,同時也會有
    的頭像 發表于 10-26 17:42 ?1921次閱讀
    主站蜘蛛池模板: 国产亚洲欧美ai在线看片| 特级淫片大乳女子高清视频| 美国69xxxx59| 人妻夜夜爽天天爽三区麻豆AV网站| 四虎视频最新视频在线观看| 亚洲欧美无码2017在线| 99精品免费久久久久久久久蜜桃| 成人免费看片45分钟| 国产伊人久久| 美美哒高清在线播放8| 少妇第一次交换| 一本道久久综合久久88| av在线观看网站免费| 国产精品一区二区在线观看| 久欠热视频精品首页| 色欲AV色欲AV久久麻豆| 在线亚洲色拍偷拍在线视频| 成年人视频免费在线观看| 国自精品三七区| 欧美四虎精品二区免费| 亚洲精品卡2卡3卡4卡5卡区 | 免费无遮挡又黄又爽网站 | 麻豆出品国产AV在线观看| 日日碰狠狠躁久久躁综合网| 一本色道久久综合亚洲AV蜜桃 | 野花韩国高清完整版在线观看5| caoporn 免费视频| yw193龙物免费官网在线| 好男人好资源视频高清| 欧美一区二区三区播放| 亚洲色欲色欲WWW在线成人网| FREEHDXXXX学生妹| 黑人猛挺进小莹的体内视频| 欧美日韩一二区旡码高清在线| 涩里番app黄版网站| 猪蜜蜜网站在线观看电视剧| 国产精品麻豆a啊在线观看| 男女一边摸一边做羞羞的事情免费| 校园高h肉耽文| 亚洲另类国产综合在线| 伊人久久大香线蕉资源|