成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux與FreeBSD中TCP協(xié)議棧實(shí)現(xiàn)之比較

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
作為兩個(gè)最有名的開(kāi)源操作系統(tǒng),Linux和FreeBSD是網(wǎng)管們的首選。Linux以開(kāi)放性和眾多的驅(qū)動(dòng)支持著稱,而FreeBSD有著優(yōu)良的UNIX傳統(tǒng),是公認(rèn)的最穩(wěn)定的操作系統(tǒng),那么下面我們給大家介紹一下有關(guān)Linux與FreeBSD中TCP協(xié)議棧實(shí)現(xiàn)之比較。

作為兩個(gè)最有名的開(kāi)源操作系統(tǒng),Linux和FreeBSD是網(wǎng)管們的***。Linux以開(kāi)放性和眾多的驅(qū)動(dòng)支持著稱,而FreeBSD有著優(yōu)良的UNIX傳統(tǒng),是公認(rèn)的最穩(wěn)定的操作系統(tǒng)。那么,在這兩個(gè)操作系統(tǒng)間,該如何選擇呢?幸好,我們有源碼,可以從協(xié)議棧的實(shí)現(xiàn)中尋找答案。

TCP/IP協(xié)議棧是網(wǎng)絡(luò)中廣泛使用的事實(shí)網(wǎng)絡(luò)通信標(biāo)準(zhǔn)。最初的TCP實(shí)現(xiàn)源自4.4BSDlite,在Linux興起后,也不可避免得支持它。但Linux的實(shí)現(xiàn)自成體系,僅與傳統(tǒng)實(shí)現(xiàn)保持接口上的兼容,下面我們將針對(duì)源碼級(jí)的實(shí)現(xiàn),來(lái)分析一下兩者的異同。但是,對(duì)于Linux和FreeBSD這樣優(yōu)秀的系統(tǒng)來(lái)說(shuō),已經(jīng)無(wú)所謂何優(yōu)何劣,有的僅僅是實(shí)現(xiàn)策略與側(cè)重點(diǎn)上的不同而已。

從進(jìn)程的角度上講,可以調(diào)用send,sendto,sendmsg來(lái)發(fā)送一段數(shù)據(jù),來(lái)可以使用文件系統(tǒng)中的write和writev來(lái)發(fā)送數(shù)據(jù)。同理,接收數(shù)據(jù)可以使用相應(yīng)的recv,recvmsg,recvfrom,也可以使用文件系統(tǒng)提供的read,readv來(lái)接收一段數(shù)據(jù)。對(duì)于接收來(lái)說(shuō),這是異步進(jìn)行的,也就是說(shuō),這是中斷驅(qū)動(dòng)的,在以后的分析中,我們要注意這點(diǎn)。為簡(jiǎn)單起見(jiàn),同時(shí)不失一般性,我們將分析TCP協(xié)議的輸入輸出全過(guò)程,并以已對(duì)LINUX及FreeBSD的實(shí)現(xiàn)作一對(duì)比。

首先我們來(lái)看FreeBSD上的協(xié)議實(shí)現(xiàn),這也是最正統(tǒng)的實(shí)現(xiàn)。下面是完整的輸入輸出路徑。

首先來(lái)看左邊的輸出,不管應(yīng)用程序調(diào)用哪個(gè)輸出函數(shù),最終都要調(diào)用sosend來(lái)完成輸出。Sosend將從用戶空間把數(shù)據(jù)復(fù)制進(jìn)內(nèi)核管理的m_buf數(shù)據(jù)結(jié)構(gòu),m_buf是FreeBSD的TCP實(shí)現(xiàn)使用的數(shù)據(jù)緩沖結(jié)構(gòu)。在sosend完成數(shù)據(jù)復(fù)制后,將調(diào)用TCP的輸出函數(shù),tcp_output要做的事情是分配一個(gè)新的m_buf來(lái)保存tcp頭,并計(jì)算相應(yīng)的數(shù)據(jù)校驗(yàn)碼,在下一步的ip_output中,同樣也要進(jìn)行數(shù)據(jù)校驗(yàn)工作,并進(jìn)行數(shù)據(jù)路由選擇。最終ether_output將通過(guò)if_start來(lái)調(diào)用具體的硬件驅(qū)動(dòng)程序來(lái)完成數(shù)據(jù)發(fā)送。在某個(gè)網(wǎng)卡的驅(qū)動(dòng)中,ex_start將負(fù)責(zé)將數(shù)據(jù)從內(nèi)核的m_buf緩沖復(fù)制進(jìn)硬件自己的緩沖區(qū),以完成數(shù)據(jù)發(fā)送工作。在這整個(gè)過(guò)程中,數(shù)據(jù)被復(fù)制兩次,并且也被遍歷兩次(計(jì)算校驗(yàn)碼),這也是主要的影響效率的地方。

再來(lái)討論右邊的輸入,當(dāng)網(wǎng)卡收到數(shù)據(jù)時(shí),中斷處理程序ex_intr將被調(diào)用。驅(qū)動(dòng)通過(guò)ex_rx_intr將數(shù)據(jù)從硬件緩沖復(fù)制進(jìn)m_buf數(shù)據(jù)結(jié)構(gòu)中,并調(diào)用ether_input來(lái)進(jìn)一步處理。ether_input通過(guò)ether_demux進(jìn)行分用。如果是一個(gè)Ip包,將通過(guò)軟中斷調(diào)用ip_fastforward進(jìn)行數(shù)據(jù)校驗(yàn),并判斷是否要轉(zhuǎn)發(fā),如果失敗,將進(jìn)行ip_input進(jìn)行完整的處理。在in_input中,同樣要判斷是否要進(jìn)行轉(zhuǎn)發(fā),如果不用,調(diào)用tcp_input進(jìn)行進(jìn)一步處理。在tcp_input中,進(jìn)行數(shù)據(jù)校驗(yàn)和驗(yàn)證后,有一個(gè)叫做首部預(yù)測(cè)算法的優(yōu)化,可以加快數(shù)據(jù)處理速度。進(jìn)行完所有的操作后,如果是用戶數(shù)據(jù),將喚醒用戶進(jìn)程進(jìn)行處理。同理,用戶可以使用多個(gè)函數(shù)進(jìn)行數(shù)據(jù)接收,而soreceive將負(fù)責(zé)將數(shù)據(jù)從m_buf轉(zhuǎn)移至用戶進(jìn)程緩沖。

可以看出,在FreeBSD中,發(fā)送和接收數(shù)據(jù),所進(jìn)行的操作差不多,都要進(jìn)行兩次數(shù)據(jù)復(fù)制和兩次數(shù)據(jù)遍歷,這也是***的影響效率的地方。兩次數(shù)據(jù)復(fù)制似乎無(wú)可避免,下面我們來(lái)看看Linux是怎么做的。

可以看到,在LINUX上的實(shí)現(xiàn)稍顯復(fù)雜。讓我們首先從發(fā)送開(kāi)始分析。在LINUX上,socket被實(shí)現(xiàn)為一個(gè)文件系統(tǒng),這樣可以通過(guò)vfs的write來(lái)調(diào)用,也可以直接使用send來(lái)調(diào)用,它們最終都是調(diào)用sock_sendmsg。Sock_sendmsg通過(guò)它的內(nèi)核版本__sock_sendmsg直接調(diào)用tcp_sendmsg來(lái)發(fā)送數(shù)據(jù)。在tcp_sendmsg中,同時(shí)完成數(shù)據(jù)復(fù)雜和數(shù)據(jù)校驗(yàn),這樣節(jié)省了一次遍歷操作,這也是和FreeBSD不同的地方。Linux使用skb結(jié)構(gòu)來(lái)管理數(shù)據(jù)緩沖,這和FreeBSD的m_buf大同小異。當(dāng)復(fù)制完數(shù)據(jù)后,使用tcp_push來(lái)進(jìn)行下一步發(fā)送。Tcp_push通過(guò)__tcp_push_pending_frames來(lái)調(diào)用tcp_write_xmit將數(shù)據(jù)填入tcp的發(fā)送緩沖區(qū)。這里的填充僅是指針引用而已。下一步,tcp_transmit_skb將數(shù)據(jù)放入IP的發(fā)送隊(duì)列。Ip_queue_xmit函數(shù)完成IP包頭的設(shè)置以及數(shù)據(jù)效驗(yàn),并調(diào)用ip_output進(jìn)入下一步發(fā)送。如果不用分片,將使用ip_finish_output繼續(xù)發(fā)送。在這里,填充數(shù)據(jù)的以太網(wǎng)包頭后調(diào)用dev_queue_xmit函數(shù)來(lái)進(jìn)一步處理。Dev_queue_xmit函數(shù)將數(shù)據(jù)轉(zhuǎn)移至網(wǎng)絡(luò)核心層的待發(fā)送隊(duì)列,調(diào)用具體的驅(qū)動(dòng)程序cp_start_xmit來(lái)完成數(shù)據(jù)的最終發(fā)送。***的cp_start_xmit做的事情和freebsd的相應(yīng)函數(shù)差不多,檢查數(shù)據(jù),并復(fù)制進(jìn)硬件緩沖。

當(dāng)接收到一個(gè)數(shù)據(jù)包的時(shí)候,網(wǎng)卡會(huì)產(chǎn)生中斷,這樣網(wǎng)卡驅(qū)動(dòng)的cp_interrupt會(huì)被調(diào)用。cp_interrupt做的事情很少,只進(jìn)行必要的檢查后就返回了,更多的事情通過(guò)cp_rx_poll來(lái)完成,cp_rx_poll在軟中斷中被調(diào)用,這樣做是為了提高驅(qū)動(dòng)的處理效率。Cp_rx_poll做的事情主要就是把申請(qǐng)并將數(shù)據(jù)復(fù)制進(jìn)一個(gè)skb緩沖中。netif_rx函數(shù)將數(shù)據(jù)從這個(gè)隊(duì)列中轉(zhuǎn)移至網(wǎng)絡(luò)核心層隊(duì)列中,netif_receive_skb從這里接收數(shù)據(jù),調(diào)用ip_rcv來(lái)處理。Ip_rc和ip_rcv_finish一起檢查數(shù)據(jù),得到包的路由,并調(diào)用相應(yīng)的input函數(shù)來(lái)完成路由,在這里就是ip_local_deliver,ip_local_deliver完成IP包的重組后,使用ip_local_deliver_finish來(lái)進(jìn)入tcp的處理流程,tcp_v4_rcv完成數(shù)據(jù)校驗(yàn)以及一些簡(jiǎn)單的檢查,主要的工作在tcp_v4_do_rcv中完成。tcp_v4_do_rcv先判斷是否正常的用戶數(shù)據(jù),如果是則用tcp_rcv_established處理,否則用tcp_rcv_state_process來(lái)更新連接的狀態(tài)機(jī)。tcp_rcv_established中同樣有首部預(yù)測(cè)。如果一切順便,將喚醒等待在tcp_recvmsg中的用戶進(jìn)程。后者將數(shù)據(jù)從skb緩沖中復(fù)制進(jìn)用戶進(jìn)程緩沖。并進(jìn)行逐級(jí)返回。

通過(guò)以上分析不難看出,Linux的代碼比較混亂,可讀性沒(méi)有FreeBSD的好,比如說(shuō),Linux省略了以太網(wǎng)層,而且在接收數(shù)據(jù)中有多次異步操作,也許這將會(huì)影響內(nèi)核的穩(wěn)定性,F(xiàn)reeBSD的代碼就比較清晰,程序處理一目了然,可讀性也高,最穩(wěn)定的操作系統(tǒng)名不虛傳。這也可以從兩個(gè)操作系統(tǒng)的起源得到解釋。Linux起源于互聯(lián)網(wǎng)時(shí)代,由眾多愛(ài)好者一起完成,并沒(méi)有一個(gè)完整的規(guī)劃,代碼也多次經(jīng)過(guò)變動(dòng),而作者水平也參次不齊,造成現(xiàn)在的樣子。而FreeBSD系出名門,一直由一個(gè)獨(dú)立的小組進(jìn)行維護(hù),多年來(lái)更新不大,只有少許優(yōu)化,所以代碼的可讀性非常高。但從另一方面講,不斷更新的Linux在代碼方面比較激進(jìn),比如Linux使用skb緩沖效率要較FreeBSD使用的m_buf為高,這里限于篇幅,就不再具體分析了。而且linux發(fā)送數(shù)據(jù)時(shí),在復(fù)制數(shù)據(jù)的同時(shí)完成的tcp的效驗(yàn),這樣就節(jié)省了一次數(shù)據(jù)的遍歷操作。也提高了效率。

通過(guò)以上比較我們不難得出結(jié)論,如果效率為先,則Linux當(dāng)為首推,如果穩(wěn)定至上,F(xiàn)reeBSD應(yīng)該為不二之選。不過(guò),這兩個(gè)操作系統(tǒng)都是非常優(yōu)秀并久經(jīng)考驗(yàn),之間的差別也僅存于字面分析上。無(wú)論選擇哪個(gè),都不會(huì)讓您后悔,不是嗎?

【編輯推薦】

  1. 一步步教你用linux做路由器限速
  2. TCP/IP網(wǎng)絡(luò)中的顯式擁塞通告解析
  3. TCP調(diào)整和部署要根據(jù)實(shí)際情況
  4. 深入解析使用Linux+Zebra構(gòu)建軟路由系統(tǒng)
責(zé)任編輯:于爽 來(lái)源: blog.sina.com.cn
相關(guān)推薦

2013-08-01 10:01:02

網(wǎng)絡(luò)協(xié)議TCP協(xié)議UDP協(xié)議

2010-06-13 14:54:40

TCP IP協(xié)議棧linux

2019-09-30 09:28:26

LinuxTCPIP

2010-09-08 15:34:27

TCP IP協(xié)議棧

2021-07-09 08:55:23

LinuxTCPIP

2010-09-08 15:11:36

TCP IP協(xié)議棧

2009-08-12 17:33:25

繼承與擴(kuò)展方法

2010-06-19 14:10:35

TCP IP協(xié)議棧

2010-06-19 13:32:36

TCP IP協(xié)議棧

2016-08-21 14:19:05

數(shù)據(jù)工具DataXSqoop

2010-09-08 15:24:28

TCP IP協(xié)議棧

2014-10-15 09:14:24

IP

2010-09-08 15:15:12

TCP IP協(xié)議棧

2010-09-27 13:25:58

TCP IP協(xié)議棧

2011-01-14 15:30:44

2009-02-11 13:38:00

軟件工程師程序員職業(yè)

2019-10-22 08:41:09

TCPIPLinux

2009-12-04 19:28:25

FreeBSD 8.0Ubuntu 9.10性能比較

2010-06-13 13:39:46

TCP IP協(xié)議棧

2021-07-06 21:29:16

TCPIP協(xié)議棧
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 成人高潮片免费视频欧美 | 男女羞羞视频在线看 | 久久久入口 | 欧美福利| 欧美性大战久久久久久久蜜臀 | 少妇一区在线观看 | 欧美亚洲视频 | 国产精品自在线 | 一级欧美| 操一草 | 粉嫩一区二区三区性色av | 不卡一区二区三区四区 | 久久久亚洲 | 国产 欧美 日韩 一区 | 亚州激情 | 91国自视频 | 亚洲欧美中文日韩在线v日本 | 国产成人av一区二区三区 | 精品国产一区二区三区久久久四川 | wwwxxx国产 | 国产精品日产欧美久久久久 | 亚洲国产一区二区视频 | 日韩精品久久久久 | www97影院 | 色婷婷久久久亚洲一区二区三区 | 亚洲精品久久国产高清情趣图文 | 中文字幕不卡视频在线观看 | 黄视频网址 | 中文字幕不卡一区 | www国产亚洲精品 | 在线观看免费毛片 | 亚洲一区亚洲二区 | 国产精品一区在线 | www.欧美 | 一区二区在线看 | 欧美一区二区在线观看 | 久久久91精品国产一区二区精品 | 欧美国产日韩精品 | 亚洲精品在线免费播放 | 国内自拍偷拍视频 | 久久久久久91香蕉国产 |