|
可以毫不夸張的說現(xiàn)如今的互聯(lián)網(wǎng)是基于TCP/IP構(gòu)建起來的網(wǎng)絡(luò)。弄懂協(xié)議棧的原理,無論對調(diào)試網(wǎng)絡(luò)IO性能還是解決網(wǎng)絡(luò)問題都是有很大幫助的。本片文章就帶領(lǐng)大家來看看內(nèi)核是如何控制網(wǎng)絡(luò)數(shù)據(jù)流的。 TCP特點我們都非常清楚TCP協(xié)議設(shè)計的初衷,就是保證數(shù)據(jù)傳輸?shù)目焖伲行?,無誤。所以特點總結(jié)如下:
了解完TCP特點字后,我們就來真正的看看數(shù)據(jù)發(fā)送到底是怎樣的過程? 數(shù)據(jù)發(fā)送我們首先來看張圖: 上圖展示的是數(shù)據(jù)流動的在硬件中的過程,下圖展示的是數(shù)據(jù)在協(xié)議棧的過程: 整個過程分為三個大區(qū)域:用戶區(qū),內(nèi)核區(qū),設(shè)備。這里所說的設(shè)備就是網(wǎng)卡。流程如下:
數(shù)據(jù)接收直接看硬件數(shù)據(jù)流圖: 首先網(wǎng)卡把接收到的數(shù)據(jù)包寫入到它的內(nèi)存之中。然后對其進(jìn)行校驗,通過后發(fā)送到主機的主存之中。主存中的buffer是驅(qū)動分配好的,驅(qū)動會把分配好的buffer描述告訴網(wǎng)卡,如果沒有足夠的buffer接受網(wǎng)卡的數(shù)據(jù)包,網(wǎng)卡會將數(shù)據(jù)包丟棄。一旦數(shù)據(jù)包拷貝到主存完成,網(wǎng)卡會通過中斷告知主機OS。 之后驅(qū)動會檢查它是否能處理這個新的包。如果能處理,驅(qū)動會把數(shù)據(jù)包包裝成OS認(rèn)識的結(jié)構(gòu)(linux sk_buffer)并推送到上層。 鏈路層接收到幀后檢查通過的話會按照協(xié)議解幀并推送至IP層。 IP層會在解包之后根據(jù)包中包含的IP信息決定推送至上層還是轉(zhuǎn)發(fā)到其他IP。如果判斷需要推送至上層,則會解掉IP包頭并推送至TCP層。 TCP在解報之后會根據(jù)其四元組找到對應(yīng)的TCB,之后通過TCP協(xié)議處理這個報文。在接收到報文后,會把報文加到接受報文,之后根據(jù)TCP的狀態(tài)發(fā)送一個ACK給對端。 當(dāng)然上述過程會受到NAT等等Netfilter的作用,這里不談了,也沒深研究過。當(dāng)然為了性能,大牛們方方面面也做了很多努力,比如大到RDMA、DPDK等大的軟硬件技術(shù),小到zero-copy、checksum offload等; 總結(jié)現(xiàn)代的軟硬件TCP/IP協(xié)議棧單鏈接發(fā)送速率到1~2GiB/s完全沒有任何問題(經(jīng)過實測)。如果你想探索更優(yōu)秀的性能,你可以嘗試RMDA等技術(shù),他們通過繞過內(nèi)核以減少拷貝等方式優(yōu)化了性能,當(dāng)然可能依賴硬件。 |
|
|