成人免费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)支持著稱(chē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)支持著稱(chē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將從用戶(hù)空間把數(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)行完所有的操作后,如果是用戶(hù)數(shù)據(jù),將喚醒用戶(hù)進(jìn)程進(jìn)行處理。同理,用戶(hù)可以使用多個(gè)函數(shù)進(jìn)行數(shù)據(jù)接收,而soreceive將負(fù)責(zé)將數(shù)據(jù)從m_buf轉(zhuǎn)移至用戶(hù)進(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先判斷是否正常的用戶(hù)數(shù)據(jù),如果是則用tcp_rcv_established處理,否則用tcp_rcv_state_process來(lái)更新連接的狀態(tài)機(jī)。tcp_rcv_established中同樣有首部預(yù)測(cè)。如果一切順便,將喚醒等待在tcp_recvmsg中的用戶(hù)進(jìn)程。后者將數(shù)據(jù)從skb緩沖中復(fù)制進(jìn)用戶(hù)進(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系出名門(mén),一直由一個(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 13:32:36

TCP IP協(xié)議棧

2010-06-19 14:10:35

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è)

2010-06-13 13:39:46

TCP IP協(xié)議棧

2021-07-06 21:29:16

TCPIP協(xié)議棧

2009-12-04 19:28:25

FreeBSD 8.0Ubuntu 9.10性能比較

2019-10-22 08:41:09

TCPIPLinux
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 九九热久久免费视频 | 日韩中文一区二区三区 | chengrenzaixian | 国家一级黄色片 | 妖精视频一区二区三区 | 精品国产乱码久久久久久果冻传媒 | 免费观看毛片 | 久久国产精品无码网站 | 成人免费视频观看视频 | 免费网站在线 | 久久里面有精品 | 黄色小视频入口 | 青青草华人在线视频 | 91高清视频在线 | 91免费在线视频 | www.国产精 | 午夜99| 日韩福利 | 蜜臀久久99精品久久久久久宅男 | 久久久毛片| 在线观看免费国产 | 久久久久1| 中文字幕1区 | 久久久久黄色 | 粉嫩高清一区二区三区 | 一级毛片在线播放 | 成人小视频在线观看 | 亚洲国产一区二区三区在线观看 | 天天操天天干天天曰 | 国产高清视频一区二区 | 国产精品视频网站 | 亚洲精品一区二区三区四区高清 | 久久www免费视频 | 国产精品久久久久久中文字 | 人人射人人插 | 91在线观看视频 | 国产精品久久久久久久久久久久久久 | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 亚洲视频中文字幕 | 亚洲精品在 | 成人国产精品久久 |