• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            2012年7月23日


            共享內(nèi)存優(yōu)點(diǎn):1.在進(jìn)程之間不通過(guò)內(nèi)核傳遞數(shù)據(jù),即不通過(guò)系統(tǒng)調(diào)用拷貝數(shù)據(jù),達(dá)到快速,高效的數(shù)據(jù)傳輸。
                                2.隨內(nèi)核持續(xù)
            *nix的共享內(nèi)存有兩套API:Posix和System V

            兩者的主要差別是共享內(nèi)存的大小
            1.Posix共享內(nèi)存大小可通過(guò)函數(shù)ftruncate隨時(shí)修改
            2.System V共享內(nèi)存大小在創(chuàng)建時(shí)就已經(jīng)確定,而且最大值根據(jù)系統(tǒng)有所不同

             Posix共享內(nèi)存 
                #include <sys/mman.h>  (mmap,munmap,msync,shm_open,shm_unlink)

            最主要的函數(shù)  -- mmap
                 void* mmap(void* addr,size_t len,int prot,int flags,int fd,off_t offset)
                 函數(shù)將一個(gè)句柄映射到內(nèi)存中,這個(gè)句柄可以是open的文件句柄,也可以是shm_open的共享內(nèi)存區(qū)對(duì)象。當(dāng)fd=-1時(shí)為匿名共享內(nèi)存。
                 *nix一切皆文件的觀點(diǎn),shm_open也是在/dev/shm目錄下創(chuàng)建一個(gè)文件對(duì)象,返回對(duì)象的描述符。
                 mmap將句柄作為共享內(nèi)存的底層支撐對(duì)象,映射到內(nèi)存中,這樣可以不通過(guò)read、write在進(jìn)程之間共享內(nèi)存。由此推測(cè)一下,在*nix的進(jìn)程間傳遞數(shù)據(jù)更加原始的方法是進(jìn)程間讀寫一個(gè)文件。但是頻繁的open、read、write、lseek系統(tǒng)調(diào)用會(huì)消耗過(guò)多的計(jì)算資源。所以想到了將這個(gè)文件句柄映射到內(nèi)存中,這樣就提高了進(jìn)程間傳遞數(shù)據(jù)的效率。

            需要注意的函數(shù) -- msync
                  當(dāng)修改了內(nèi)存映射區(qū)的內(nèi)存后,內(nèi)核會(huì)在某個(gè)時(shí)刻將文件的內(nèi)容更新。為了確信文件被更新,調(diào)用函數(shù)msync。文件的更新可以是同步(MS_SYNC)也可以是異步(MS_ASYNC)。(估計(jì)這里也是調(diào)用了函數(shù)write更新文件)

            System V共享內(nèi)存
                #include <sys/shm.h>  (shmget,shmat,shmdt,shmctl)
            由于System V的共享內(nèi)存有大小的限制,所以可考慮,使用共享內(nèi)存數(shù)組來(lái)解決這個(gè)問(wèn)。雖然數(shù)組的大小即一個(gè)進(jìn)程可以獲取共享內(nèi)存的數(shù)量也是有限制,但是可以緩解System V單個(gè)共享內(nèi)存過(guò)小的問(wèn)題。
            posted @ 2012-07-23 00:08 Range 閱讀(1440) | 評(píng)論 (0)編輯 收藏

            2012年7月1日

            receive works as follows:
            1. When we enter a receive statement, we start a timer (but only if an after section is present in the expression).
            2. Take the first message in the mailbox and try to match it against Pattern1, Pattern2, and so on. If the match succeeds, the message is removed from the mailbox, and the expressions following the pattern are evaluated.
            3. If none of the patterns in the receive statement matches the first message in the mailbox, then the first message is removed from the mailbox and put into a “save queue.” The second message in the mailbox is then tried. This procedure is repeated until a matching message is found or until all the messages in the mailbox have been examined.
            4. If none of the messages in the mailbox matches, then the process is suspended and will be rescheduled for execution the next time a new message is put in the mailbox. Note that when a new message arrives, the messages in the save queue are not rematched; only the new message is matched.
            5. As soon as a message has been matched, then all messages that have been put into the save queue are reentered into the mailbox in the order in which they arrived at the process. If a timer was set, it is cleared.
            6. If the timer elapses when we are waiting for a message, then evaluate the expressions ExpressionsTimeout and put any saved messages back into the mailbox in the order in which they arrived at the process.
            posted @ 2012-07-01 17:17 Range 閱讀(701) | 評(píng)論 (0)編輯 收藏

            2011年10月9日


                   #define _GNU_SOURCE

                   #include <string.h>

                   char *strcasestr(const char *haystack, const char *needle);

                    用于在c串haystack中查找c串needle,忽略大小寫。如果找到則返回needle串在haystack串中第一次出現(xiàn)的位置的char指針

                    在實(shí)際的應(yīng)用中如果只加上頭文件,當(dāng)編譯時(shí)會(huì)出現(xiàn)  warning: assignment makes pointer from integer without a cast

                   這是因?yàn)楹瘮?shù)的聲明在調(diào)用之后。未經(jīng)聲明的函數(shù)默認(rèn)返回int型。
             
                   因此要在#include所有頭文件之前加  
            #define _GNU_SOURCE  ,以此解決此問(wèn)題。
            posted @ 2011-10-09 19:12 Range 閱讀(20870) | 評(píng)論 (0)編輯 收藏

            2011年8月26日

            Linux IO系統(tǒng)的架構(gòu)圖


             

            一.設(shè)備-------- 影響磁盤性能的因素

            硬盤的轉(zhuǎn)速影響硬盤的整體性能。一般情況下轉(zhuǎn)速越大,性能會(huì)越好。

            硬盤的性能因素主要包括兩個(gè):1.平均訪問(wèn)時(shí)間2傳輸速率。

             

            平均訪問(wèn)時(shí)間包括兩方面因素:

            平均尋道時(shí)間(Average Seek Time)是指硬盤的磁頭移動(dòng)到盤面指定磁道所需的時(shí)間。一般在3ms至15ms之間。

            平均旋轉(zhuǎn)等待時(shí)間(Latency)是指磁頭已處于要訪問(wèn)的磁道,等待所要訪問(wèn)的扇區(qū)旋轉(zhuǎn)至磁頭下方的時(shí)間。一般在2ms至6ms之間。

             

            傳輸速率(Data Transfer Rate) 硬盤的數(shù)據(jù)傳輸率是指硬盤讀寫數(shù)據(jù)的速度,單位為兆字節(jié)每秒(MB/s)。磁盤每秒能傳輸80M~320M字節(jié)。

             

            傳輸速率包括內(nèi)部傳輸速率和外部傳輸速率。

            內(nèi)部傳輸率(Internal Transfer Rate) 也稱為持續(xù)傳輸率(Sustained Transfer Rate),它反映了硬盤緩沖區(qū)未用時(shí)的性能。內(nèi)部傳輸率主要依賴于硬盤的旋轉(zhuǎn)速度。

            外部傳輸率(External Transfer Rate)也稱為突發(fā)數(shù)據(jù)傳輸率Burst Data Transfer Rate)或接口傳輸率,它標(biāo)稱的是系統(tǒng)總線與硬盤緩沖區(qū)之間的數(shù)據(jù)傳輸率,外部數(shù)據(jù)傳輸率與硬盤接口類型硬盤緩存的大小有關(guān)。STAT2 的傳輸速率在300MB/s級(jí)別。

             

            因此在硬件級(jí)上,提高磁盤性能的關(guān)鍵主要是降低平均訪問(wèn)時(shí)間。

            二.設(shè)備驅(qū)動(dòng)

            內(nèi)存到硬盤的傳輸方式:poll,中斷,DMA

             

            DMA:當(dāng) CPU 初始化這個(gè)傳輸動(dòng)作,傳輸動(dòng)作本身是由 DMA 控制器 來(lái)實(shí)行和完成。

            DMA控制器獲得總線控制權(quán)后,CPU即刻掛起或只執(zhí)行內(nèi)部操作,由DMA控制器輸出讀寫命令,直接控制RAM與I/O接口進(jìn)行DMA傳輸。DMA每次傳送的是磁盤上相鄰的扇區(qū)。Scatter-gather DMA允許傳送不相鄰的扇區(qū)。

             

            CPU性能與硬盤與內(nèi)存的數(shù)據(jù)傳輸速率關(guān)系不大。

             

            設(shè)備驅(qū)動(dòng)內(nèi)有一個(gè)結(jié)構(gòu)管理著IO的請(qǐng)求隊(duì)列

            structrequest_queue(include/linux/Blkdev.h

            這里不僅僅有讀寫請(qǐng)求的數(shù)據(jù)塊,還有用于IO調(diào)度的回調(diào)函數(shù)結(jié)構(gòu)。每次需要傳輸?shù)臅r(shí)候,就從隊(duì)列中選出一個(gè)數(shù)據(jù)塊交給DMA進(jìn)行傳輸。

             

            所以IO調(diào)度的回調(diào)函數(shù)這是降低平均訪問(wèn)的時(shí)間的關(guān)鍵。

             

            三.OS

            IO調(diào)度器

            Linux kernel提供了四個(gè)調(diào)度器供用戶選擇。他們是noop,cfq,deadline,as。可以在系統(tǒng)啟動(dòng)時(shí)設(shè)置內(nèi)核參數(shù)elevator=<name>來(lái)指定默認(rèn)的調(diào)度器。也可以在運(yùn)行時(shí)為某個(gè)塊設(shè)備設(shè)置IO調(diào)度程序。

             

            下面來(lái)簡(jiǎn)要介紹這四個(gè)調(diào)度器的電梯調(diào)度算法。

            Noop:最簡(jiǎn)單的調(diào)度算法。新的請(qǐng)求總是被添加到隊(duì)頭或者隊(duì)尾,然后總是從隊(duì)頭中選出將要被處理的請(qǐng)求。

             

            CFQ:(Complete FarinessQueueing)它的目標(biāo)是在所有請(qǐng)求的進(jìn)程中平均分配IO的帶寬。因此,它會(huì)根據(jù)進(jìn)程創(chuàng)建自己的請(qǐng)求隊(duì)列,然后將IO請(qǐng)求放入相應(yīng)的隊(duì)列中。在使用輪轉(zhuǎn)法從每個(gè)非空的隊(duì)列中取出IO請(qǐng)求。

             

            Deadline:使用了四個(gè)隊(duì)列,兩個(gè)以磁盤塊序號(hào)排序的讀寫隊(duì)列,兩個(gè)以最后期限時(shí)間排序的讀寫隊(duì)列。算法首先確定下一個(gè)讀寫的方向,讀的優(yōu)先級(jí)高于寫。然后檢查被選方向的最后期限隊(duì)列:如果最后期限時(shí)間的隊(duì)列中有超時(shí)的請(qǐng)求,則將剛才的請(qǐng)求移動(dòng)至隊(duì)尾,然后在磁盤號(hào)排序隊(duì)列中從超時(shí)請(qǐng)求開(kāi)始處理。當(dāng)處理完一個(gè)方向的請(qǐng)求后,在處理另一個(gè)方向的請(qǐng)求。(讀請(qǐng)求的超時(shí)時(shí)間是500ms,寫請(qǐng)求的超時(shí)時(shí)間是5s

             

            Anticipatory:它是最復(fù)雜的IO調(diào)度算法。和deadline算法一樣有四個(gè)隊(duì)列。還附帶了一些啟發(fā)式策略。它會(huì)從當(dāng)前的磁頭位置后的磁盤號(hào)中選擇請(qǐng)求。在調(diào)度了一個(gè)由P進(jìn)程的IO請(qǐng)求后,會(huì)檢查下一個(gè)請(qǐng)求,如果還是P進(jìn)程的請(qǐng)求,則立即調(diào)度,如果不是,同時(shí)預(yù)測(cè)P進(jìn)程很快會(huì)發(fā)出請(qǐng)求,則還延長(zhǎng)大約7ms的時(shí)間等待P進(jìn)程的IO請(qǐng)求。

             

             

             

            Write/Read函數(shù)

            以ext3的write為例:

            系統(tǒng)調(diào)用write()的作用就是修改頁(yè)高速緩存內(nèi)的一些頁(yè)的內(nèi)容,如果頁(yè)高速緩存內(nèi)沒(méi)有所要的頁(yè)則分配并追加這些頁(yè)。

            當(dāng)臟頁(yè)達(dá)到一定數(shù)量或者超時(shí)后,將臟頁(yè)刷回硬盤。也可以執(zhí)行相關(guān)系統(tǒng)調(diào)用。

             

            為什么要達(dá)到一定數(shù)量,是因?yàn)檠舆t寫能在一定層度上提高系統(tǒng)的性能,這也使得塊設(shè)備的平均讀請(qǐng)求會(huì)多于寫請(qǐng)求。

             

            在程序中調(diào)用write函數(shù),將進(jìn)入系統(tǒng)調(diào)用f_op->write。這個(gè)函數(shù)將調(diào)用ext3的do_sync_write。這個(gè)函數(shù)將參數(shù)封裝后調(diào)用generic_file_aio_write。由參數(shù)名可以看出同步寫變成了異步寫。如果沒(méi)有標(biāo)記O_DIRECT,將調(diào)用函數(shù)generic_file_buffered_write將寫的內(nèi)容寫進(jìn)kernel的高速頁(yè)緩存中。Buffer是以page為單位即4k。之后當(dāng)調(diào)用cond_resched()進(jìn)行進(jìn)程的調(diào)度,DMA會(huì)將buffer中的內(nèi)容寫進(jìn)硬盤。

            所以當(dāng)每次以4k為單位寫入硬盤時(shí)效率會(huì)達(dá)到最高。下面是UNIX環(huán)境高級(jí)編程的實(shí)驗(yàn)結(jié)果:


            下圖是linux 的塊設(shè)備的數(shù)據(jù)操作層次:

            Sector扇區(qū):是設(shè)備驅(qū)動(dòng)和IO調(diào)度程序處理數(shù)據(jù)粒度。

            Block塊:是VFS和文件系統(tǒng)處理數(shù)據(jù)的粒度。其大小不唯一,可以是512,1024,2048,4096字節(jié)。內(nèi)核操作的塊大小是4096字節(jié)。

            Segment段:是DMA傳送的單位。每一個(gè)段包含了相鄰的扇區(qū),它能使DMA傳送不相鄰的扇區(qū)。


             

            四.用戶程序

            根據(jù)以上的分析,我們的write buffer一般設(shè)置為4K的倍數(shù)。

             

            在程序中有意識(shí)的延遲寫。這個(gè)是os的策略,當(dāng)然也可以應(yīng)用到程序的設(shè)計(jì)中。當(dāng)然也會(huì)有缺點(diǎn):1.如果硬件錯(cuò)誤或掉電,則會(huì)丟失內(nèi)容(做額外的備份)2.需要額外的內(nèi)存空間。(犧牲內(nèi)存來(lái)提高IO的效率)

             

            我們還需根據(jù)系統(tǒng)的IO調(diào)度器的調(diào)度策略,設(shè)計(jì)出不同的IO策略。盡量降低磁盤的平均訪問(wèn)時(shí)間,降低請(qǐng)求隊(duì)列,提高數(shù)據(jù)傳輸?shù)乃俾省?/span>

             

             

             

            五.監(jiān)控硬盤的工具和指標(biāo)

            Iostat–x –k 1

             -x顯示更多的消息 -k數(shù)據(jù)以KB為單位 1每秒顯示一次

            輸出顯示的信息

            Iowait:cpu等待未完成的IO請(qǐng)求而空閑的時(shí)間的比例。

            Idle:cpu空閑且無(wú)IO請(qǐng)求的比例。

            rrqm/s:每秒這個(gè)設(shè)備相關(guān)的讀取請(qǐng)求有多少被Merge了。

            wrqm/s:每秒這個(gè)設(shè)備相關(guān)的寫入請(qǐng)求有多少被Merge了。

            rsec/s:每秒讀取的扇區(qū)數(shù);

            wsec/:每秒寫入的扇區(qū)數(shù)。

            r/s:每秒完成的讀 I/O 設(shè)備次數(shù)。即 delta(rio)/s

            w/s:每秒完成的寫 I/O 設(shè)備次數(shù)。即 delta(wio)/s

            await:每一個(gè)IO請(qǐng)求的處理的平均時(shí)間(單位是毫秒)。包括加入請(qǐng)求隊(duì)列和服務(wù)的時(shí)間。

            svctm:   平均每次設(shè)備I/O操作的服務(wù)時(shí)間。

            avgrq-sz: 平均每次設(shè)備I/O操作的數(shù)據(jù)大小 (扇區(qū))。即 delta(rsect+wsect)/delta(rio+wio)
            avgqu-sz:
            平均I/O隊(duì)列長(zhǎng)度。即 delta(aveq)/s/1000 (因?yàn)閍veq的單位為毫秒)

            %util:在統(tǒng)計(jì)時(shí)間內(nèi)所有處理IO時(shí)間,除以總共統(tǒng)計(jì)時(shí)間。例如,如果統(tǒng)計(jì)間隔1秒,該設(shè)備有0.8秒在處理IO,而0.2秒閑置,那么該設(shè)備的%util = 0.8/1 = 80%,所以該參數(shù)暗示了設(shè)備的繁忙程度。一般地,如果該參數(shù)是100%表示設(shè)備已經(jīng)接近滿負(fù)荷運(yùn)行了(當(dāng)然如果是多磁盤,即使%util是100%,因?yàn)榇疟P的并發(fā)能力,所以磁盤使用未必就到了瓶頸)。

             

            下面我們做一個(gè)實(shí)驗(yàn)來(lái)分析一下

            我們使用命令

            time dd if=/dev/zero of=/home/zhouyuan/mytest bs=1M count=3000

            向mytest寫入數(shù)據(jù),寫入3G

            截取部分的狀態(tài)監(jiān)控:




             

            如圖2,當(dāng)兩條數(shù)據(jù) iowait 達(dá)到了 99% 以上,寫入的數(shù)據(jù)是0,這是因?yàn)镈MA將內(nèi)存的中的數(shù)據(jù)傳輸給設(shè)備。結(jié)合圖1的前兩條數(shù)據(jù),利用率達(dá)到了99%+卻沒(méi)有寫入的磁盤塊。

            如圖3,iowait下降,說(shuō)明cpu開(kāi)始執(zhí)行相關(guān)程序,而此時(shí)塊設(shè)備開(kāi)始寫入的數(shù)據(jù)。這兩個(gè)操作是異步進(jìn)行的。

             

            Vmstat–k –n 1

            Swap

              si: 從磁盤交換到內(nèi)存的交換頁(yè)數(shù)量,單位:KB/

              so: 從內(nèi)存交換到磁盤的交換頁(yè)數(shù)量,單位:KB/

            IO

              bi: 從塊設(shè)備接受的塊數(shù),單位:塊/

              bo: 發(fā)送到塊設(shè)備的塊數(shù),單位:塊/



            從圖中我們可以看出系統(tǒng)的延遲寫。

            posted @ 2011-08-26 20:04 Range 閱讀(17174) | 評(píng)論 (2)編輯 收藏

            2011年7月15日

                  最近調(diào)試網(wǎng)絡(luò)的服務(wù)端程序,自己寫了一個(gè)小客戶端程序來(lái)測(cè)試,發(fā)現(xiàn)服務(wù)程序解包錯(cuò)誤。經(jīng)調(diào)試發(fā)現(xiàn)客戶端的協(xié)議頭大小和服務(wù)器端的協(xié)議頭大小不一致。原因是服務(wù)器端加了#pragma pack(1),而客戶端沒(méi)加。

                之前沒(méi)接觸過(guò)這個(gè)編譯宏,現(xiàn)在來(lái)認(rèn)真學(xué)習(xí)之。

                首先google~~

                原來(lái)#pragma pack有幾種形式,我所接觸到的是#pragma pack(n),即變量以n字節(jié)對(duì)齊。

                變量對(duì)齊在每個(gè)系統(tǒng)中是不一樣的,默認(rèn)的對(duì)齊方式能有效的提高cpu取指取數(shù)的速度,但是可能會(huì)浪費(fèi)一定的空間。在網(wǎng)絡(luò)程序中采用#pragma pack(1),即變量緊縮,不但可以減少網(wǎng)絡(luò)流量,還可以兼容各種系統(tǒng),不會(huì)因?yàn)橄到y(tǒng)對(duì)齊方式不同而導(dǎo)致解包錯(cuò)誤。

                了解了概念和優(yōu)點(diǎn),現(xiàn)在我們就來(lái)測(cè)試之~

             

                平臺(tái):CPU—Pentium E5700 內(nèi)存—2G

                 1.操作系統(tǒng):ubuntu 11.04 32bit   編譯器:G++ 4.5.2

                 2.操作系統(tǒng):windows xp              編譯器:VS2010

             

                先看第一個(gè)測(cè)試。

                結(jié)構(gòu)體在正常情況和緊縮情況在以上不同環(huán)境下占用的內(nèi)存大小。

            1 struct pack {
            2   int i;
            3   short s;
            4   double d;
            5   char c;
            6   short f;
            7 }

              
               測(cè)試結(jié)果為:

                1
               

             

                2
                
              
                測(cè)試結(jié)果分析:

             

             

                可以看出緊縮后結(jié)構(gòu)體的大小為15,是結(jié)構(gòu)體內(nèi)置類型大小的和。但是在默認(rèn)情況下,結(jié)構(gòu)體的大小都是對(duì)齊字節(jié)數(shù)的倍數(shù)。ubuntupack只需要20個(gè)字節(jié),而windows24個(gè)字節(jié)。這是因?yàn)?/span>ubuntu是以4字節(jié)對(duì)齊,而windows則是以最大的內(nèi)置類型的字節(jié)數(shù)對(duì)齊,在結(jié)構(gòu)體內(nèi)最大的內(nèi)置類型為double,其大小為8個(gè)字節(jié)。他們?cè)趦?nèi)存中的對(duì)齊方式如下圖:

                1

                

                2

                

               還需注意的是,在對(duì)齊類型的內(nèi)部都是以2字節(jié)對(duì)齊的。

               結(jié)論:在默認(rèn)情況下,linux操作系統(tǒng)是以4字節(jié)對(duì)齊,windows操作系統(tǒng)則是以最大的內(nèi)置類型對(duì)齊。

             

               第二個(gè)測(cè)試

               一個(gè)結(jié)構(gòu)體內(nèi)包含另外一個(gè)結(jié)構(gòu)體,其大小的情況。

               內(nèi)部的結(jié)構(gòu)體為

            1 struct pack {
            2   short s;
            3   double d;
            4 }

               外部的結(jié)構(gòu)體為

               1 struct complex _pack{

            2   char c;
            3   struct pack s;
            4   double d;
            5 };

                我們有四種情況:

                 1.      pack緊縮,complex _pack緊縮

                 2.      pack緊縮,complex _pack默認(rèn)

                 3.      pack默認(rèn),complex _pack緊縮

                 4.      pack默認(rèn),complex _pack默認(rèn)

                以下的排列均按此順序。

                 測(cè)試的結(jié)果

                  1

                  

                 2

                  

                測(cè)試結(jié)果分析:

                在兩個(gè)操作系統(tǒng)下,除了第一種情況----內(nèi)結(jié)構(gòu)體和外結(jié)構(gòu)體都緊縮----相同之外,其他三種情況都不相同。我們可以根據(jù)偏移畫出結(jié)構(gòu)體在內(nèi)存中的情況。第一種情況省略。

                 1

                 

                 2

                 

                結(jié)論:#pragma pack只影響當(dāng)前結(jié)構(gòu)體的變量的對(duì)齊情況,并不會(huì)影響結(jié)構(gòu)體內(nèi)部的結(jié)構(gòu)體變量的排列情況。或者說(shuō)#pragma pack的作用域只是一層。我們由第三種情況,內(nèi)部結(jié)構(gòu)體正常,外部結(jié)構(gòu)體緊縮,可以得出結(jié)構(gòu)體的對(duì)齊是按偏移計(jì)算的。

                這里還有一個(gè)問(wèn)題沒(méi)解決,為什么第二種情況內(nèi)部結(jié)構(gòu)體的偏移都是1?不是4或者8?

             

            posted @ 2011-07-15 20:36 Range 閱讀(6214) | 評(píng)論 (6)編輯 收藏

                  The IP Network Address TranslatorIP網(wǎng)絡(luò)地址轉(zhuǎn)換是人們說(shuō)的NAT,或者說(shuō)NA(P)TNAT是為了解決IPv4地址不足而提出來(lái)得一種替代方案,可以對(duì)外界屏蔽內(nèi)部的網(wǎng)絡(luò)拓?fù)洹kS著網(wǎng)絡(luò)的發(fā)展,NAT阻礙了構(gòu)建在覆蓋網(wǎng)絡(luò)的P2P程序的發(fā)展。因?yàn)楦采w網(wǎng)絡(luò)是構(gòu)建在應(yīng)用層,屏蔽了傳輸層以下的網(wǎng)絡(luò)拓?fù)洌W(wǎng)絡(luò)中的每一個(gè)節(jié)點(diǎn)或某些節(jié)點(diǎn)有此網(wǎng)絡(luò)的路由表,由這些路由表構(gòu)建出這個(gè)覆蓋網(wǎng)絡(luò),但是NAT阻礙的覆蓋網(wǎng)絡(luò)中節(jié)點(diǎn)的連接。
                
                
               
                
            上圖顯示了NAT的原理。NAT將內(nèi)網(wǎng)的IP替換為公網(wǎng)IP,將端口映射為公網(wǎng)的端口。公網(wǎng)IP替換內(nèi)網(wǎng)IP是固定的,NAT的不足之處在于端口的替換。因?yàn)?/span>NAT還沒(méi)有形成標(biāo)準(zhǔn),替換策略有幾種,這也是NAT行為的關(guān)鍵。

                 在《Behavior and Classification of NAT Devices and Implications for NAT Traversal》一文中就把端口映射的行為分成四種,其中包括保留端口,不保留端口,端口重載,端口復(fù)用。這四種分類最終區(qū)分了NAT的四種類型即Full cone NATSymmetric NATPort-Restrictes cone NAT Address-Restriced cone NAT

                 為了使覆蓋網(wǎng)絡(luò)中的節(jié)點(diǎn)相互通信,我們需要進(jìn)行NAT穿越。在《A NAT Traversal Mechanism for Peer-To-Peer Networks》一文種介紹了根據(jù)兩端不同的NAT類型對(duì)應(yīng)的四種NAT穿越方案。如下圖
                 
                 

                這些解決方案都需要STUNSimple Traversal of User Datagram Protocol through Network Address Translators (NATs)NATUDP簡(jiǎn)單穿越)協(xié)議幫助。STUN協(xié)議要求一臺(tái)具有公網(wǎng)IP的主機(jī)幫助一臺(tái)主機(jī)進(jìn)行NAT類型的判斷。
                

                  上圖是STUN協(xié)議的流程,其主要的思想是通過(guò)STUN的回射來(lái)判斷主機(jī)的NAT類型。

                 除了直接連接,反向連接、打洞和依賴都需要第三臺(tái)主機(jī)的幫助。

                 在《Characterization and Measurement of TCP Traversal through NATs and Firewalls》一文中介紹了TCP穿越的方法。在STUNT#2方法中,第三臺(tái)主機(jī)和兩臺(tái)需要連接的主機(jī)都有長(zhǎng)連接,當(dāng)一方需要發(fā)起來(lái)連接時(shí),向第三臺(tái)主機(jī)發(fā)請(qǐng)求,第三臺(tái)主機(jī)向被請(qǐng)求的主機(jī)發(fā)送邀請(qǐng),此時(shí)需要連接的主機(jī)都向?qū)Ψ桨l(fā)送SYN包,此時(shí)雙方的防火墻都有了洞,只要有一方的SYN包到達(dá)對(duì)方主機(jī),連接就會(huì)被建立。Relay方法需要耗費(fèi)的代價(jià)太大,在P2P應(yīng)用中一般會(huì)消極的處理雙方都是對(duì)稱NAT的情況。






             

            posted @ 2011-07-15 20:35 Range 閱讀(1824) | 評(píng)論 (2)編輯 收藏
                 Hello World!
            posted @ 2011-07-15 20:31 Range 閱讀(412) | 評(píng)論 (0)編輯 收藏
            僅列出標(biāo)題  

            統(tǒng)計(jì)

            久久精品免费大片国产大片| 婷婷久久综合| 久久精品国产亚洲av麻豆蜜芽| 久久无码国产| 久久天堂AV综合合色蜜桃网| 久久精品国产男包| 国产亚洲婷婷香蕉久久精品| 久久久久女教师免费一区| 久久人人爽人人爽人人片AV不| 久久不见久久见免费视频7| 久久精品视屏| 国内精品久久久久影院一蜜桃 | 久久久久国色AV免费看图片| 久久天天躁狠狠躁夜夜躁2014| 成人免费网站久久久| 中文字幕精品久久| 色综合久久天天综合| 99久久精品免费看国产一区二区三区| 青青草国产精品久久| 久久精品国产亚洲AV无码娇色 | 亚洲欧美精品伊人久久| 亚洲成色www久久网站夜月| 久久人人爽人人澡人人高潮AV| 99国产欧美精品久久久蜜芽 | 亚洲国产精品无码久久98| 久久人妻少妇嫩草AV无码蜜桃| 东京热TOKYO综合久久精品| 国色天香久久久久久久小说| 久久免费香蕉视频| 久久精品国产亚洲Aⅴ蜜臀色欲| 国产精品久久久久久福利69堂| 亚洲国产精品久久久天堂| 思思久久99热免费精品6| 免费一级欧美大片久久网| 久久精品成人欧美大片| 品成人欧美大片久久国产欧美... 品成人欧美大片久久国产欧美 | 国産精品久久久久久久| A级毛片无码久久精品免费| 久久99国产精品久久| 亚洲国产精品久久66| 久久国产成人午夜AV影院|