日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

三張圖告訴你Linux TCP/IP協(xié)議棧原理

 我愛你文摘 2019-06-30

可以毫不夸張的說現(xiàn)如今的互聯(lián)網(wǎng)是基于TCP/IP構(gòu)建起來的網(wǎng)絡(luò)。弄懂協(xié)議棧的原理,無論對(duì)調(diào)試網(wǎng)絡(luò)IO性能還是解決網(wǎng)絡(luò)問題都是有很大幫助的。本片文章就帶領(lǐng)大家來看看內(nèi)核是如何控制網(wǎng)絡(luò)數(shù)據(jù)流的。

TCP特點(diǎn)

我們都非常清楚TCP協(xié)議設(shè)計(jì)的初衷,就是保證數(shù)據(jù)傳輸?shù)目焖?,有序,無誤。所以特點(diǎn)總結(jié)如下:

  1. 面向連接,可以用五元組來表示一條連接(遠(yuǎn)程ip,遠(yuǎn)程端口,本地ip,本地端口,傳輸層協(xié)議)。
  2. 數(shù)據(jù)是全雙工的
  3. 數(shù)據(jù)是有序的,也就是接受的數(shù)據(jù)一定是按照發(fā)送時(shí)的順序的。
  4. 流量控制,發(fā)送方可以通過接收方滑動(dòng)窗口大小來動(dòng)態(tài)調(diào)整發(fā)送數(shù)據(jù)的大小。
  5. 擁塞控制,發(fā)送方通過ACK的狀態(tài)結(jié)合擁塞算法綜合計(jì)算給出窗口大小。

了解完TCP特點(diǎn)字后,我們就來真正的看看數(shù)據(jù)發(fā)送到底是怎樣的過程?

數(shù)據(jù)發(fā)送

我們首先來看張圖:

三張圖告訴你Linux TCP/IP協(xié)議棧原理

上圖展示的是數(shù)據(jù)流動(dòng)的在硬件中的過程,下圖展示的是數(shù)據(jù)在協(xié)議棧的過程:

三張圖告訴你Linux TCP/IP協(xié)議棧原理

整個(gè)過程分為三個(gè)大區(qū)域:用戶區(qū),內(nèi)核區(qū),設(shè)備。這里所說的設(shè)備就是網(wǎng)卡。流程如下:

  1. 用戶應(yīng)用程序調(diào)用write系統(tǒng)調(diào)用
  2. 確認(rèn)文件描述符
  3. 拷貝數(shù)據(jù)到socket buffer中
  4. 創(chuàng)建tcp片段,計(jì)算checksum
  5. 添加IP頭,執(zhí)行ip路由,計(jì)算checksum
  6. 添加以太網(wǎng)協(xié)議頭部,執(zhí)行ARP
  7. 告訴網(wǎng)卡芯片要發(fā)送數(shù)據(jù)了
  8. 網(wǎng)卡從內(nèi)存中獲取數(shù)據(jù)發(fā)送,發(fā)送完成中斷告訴CPU

數(shù)據(jù)接收

直接看硬件數(shù)據(jù)流圖:

三張圖告訴你Linux TCP/IP協(xié)議棧原理

首先網(wǎng)卡把接收到的數(shù)據(jù)包寫入到它的內(nèi)存之中。然后對(duì)其進(jìn)行校驗(yàn),通過后發(fā)送到主機(jī)的主存之中。主存中的buffer是驅(qū)動(dòng)分配好的,驅(qū)動(dòng)會(huì)把分配好的buffer描述告訴網(wǎng)卡,如果沒有足夠的buffer接受網(wǎng)卡的數(shù)據(jù)包,網(wǎng)卡會(huì)將數(shù)據(jù)包丟棄。一旦數(shù)據(jù)包拷貝到主存完成,網(wǎng)卡會(huì)通過中斷告知主機(jī)OS。

之后驅(qū)動(dòng)會(huì)檢查它是否能處理這個(gè)新的包。如果能處理,驅(qū)動(dòng)會(huì)把數(shù)據(jù)包包裝成OS認(rèn)識(shí)的結(jié)構(gòu)(linux sk_buffer)并推送到上層。 鏈路層接收到幀后檢查通過的話會(huì)按照協(xié)議解幀并推送至IP層。

IP層會(huì)在解包之后根據(jù)包中包含的IP信息決定推送至上層還是轉(zhuǎn)發(fā)到其他IP。如果判斷需要推送至上層,則會(huì)解掉IP包頭并推送至TCP層。

TCP在解報(bào)之后會(huì)根據(jù)其四元組找到對(duì)應(yīng)的TCB,之后通過TCP協(xié)議處理這個(gè)報(bào)文。在接收到報(bào)文后,會(huì)把報(bào)文加到接受報(bào)文,之后根據(jù)TCP的狀態(tài)發(fā)送一個(gè)ACK給對(duì)端。

當(dāng)然上述過程會(huì)受到NAT等等Netfilter的作用,這里不談了,也沒深研究過。當(dāng)然為了性能,大牛們方方面面也做了很多努力,比如大到RDMA、DPDK等大的軟硬件技術(shù),小到zero-copy、checksum offload等;

總結(jié)

現(xiàn)代的軟硬件TCP/IP協(xié)議棧單鏈接發(fā)送速率到1~2GiB/s完全沒有任何問題(經(jīng)過實(shí)測(cè))。如果你想探索更優(yōu)秀的性能,你可以嘗試RMDA等技術(shù),他們通過繞過內(nèi)核以減少拷貝等方式優(yōu)化了性能,當(dāng)然可能依賴硬件。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多