CSDN lidp http://blog.csdn.net/perfectpdl
當(dāng)一個(gè)數(shù)據(jù)報(bào)到達(dá)時(shí)網(wǎng)絡(luò)驅(qū)動(dòng)程序把數(shù)據(jù)報(bào)放到一個(gè)隊(duì)列中,同時(shí)發(fā)送一個(gè)消息給ip進(jìn)程,這里ip進(jìn)程是一個(gè)獨(dú)立的程序,專(zhuān)門(mén)處理ip數(shù)據(jù)報(bào),tcp/ip協(xié)議棧中,根據(jù)協(xié)議的功能及復(fù)雜程度,一般通過(guò)進(jìn)程方式實(shí)現(xiàn),而協(xié)議間的數(shù)據(jù)傳遞則借助于操作系統(tǒng)提供的進(jìn)程間通訊機(jī)制,當(dāng)ip進(jìn)程接受了一個(gè)傳入的數(shù)據(jù)報(bào),他必須決定將其發(fā)往何處作進(jìn)一步處理,如果數(shù)據(jù)報(bào)中的內(nèi)容是一個(gè)報(bào)文段,則必須將其交付給TCP模塊,如果他攜帶的是用戶(hù)數(shù)據(jù)報(bào)(UDP),則必須將其交付給udp模塊,以此類(lèi)推。
由于TCP比較復(fù)雜,因而在許多設(shè)計(jì)方案中,有一個(gè)獨(dú)立的進(jìn)程來(lái)處理傳入的TCP報(bào)文段,由于IP和TCP有各自獨(dú)立的進(jìn)程執(zhí)行,因而IP和TCP必須借助進(jìn)程間的通信機(jī)制來(lái)通信。
一旦tcp模塊收到ip進(jìn)程傳送過(guò)來(lái)的報(bào)文段,就利用tcp協(xié)議端口號(hào)來(lái)尋找該報(bào)文段所屬的連接,如果報(bào)文段中含有數(shù)據(jù),TCP將把數(shù)據(jù)添加到與該連接相關(guān)的一個(gè)緩沖區(qū)中,并給發(fā)送方返回一個(gè)確認(rèn),如果輸入的報(bào)文段中含有對(duì)放送出去的數(shù)據(jù)的確認(rèn),tcp輸入進(jìn)程還必須與tcp定時(shí)器管理進(jìn)程通信,取消超時(shí)重發(fā)事件。
而處理udp數(shù)據(jù)報(bào)的進(jìn)程結(jié)構(gòu)與處理tcp進(jìn)程采用的結(jié)構(gòu)不同,由于udp比tcp要簡(jiǎn)單,udp模塊不作為獨(dú)立進(jìn)程存在,事實(shí)上,它是由一些常規(guī)過(guò)程組成。ip進(jìn)程通過(guò)調(diào)用來(lái)處理傳入的udp數(shù)據(jù)報(bào),這些過(guò)程檢查udp目的站的協(xié)議端口號(hào),根據(jù)端口號(hào)為udp數(shù)據(jù)報(bào)選擇一個(gè)操作系統(tǒng)隊(duì)列,ip進(jìn)程把udp數(shù)據(jù)報(bào)放在響應(yīng)的端口中,是應(yīng)用程序可從這些端口中提取數(shù)據(jù)報(bào)。
TCP/UDP數(shù)據(jù)輸入流程圖
TCP數(shù)據(jù)報(bào)輸出過(guò)程
與輸入一樣,tcp的輸出也是很復(fù)雜的,必須先建立連接,所傳送的數(shù)據(jù)必須放到報(bào)文段中,在對(duì)方發(fā)來(lái)確認(rèn)之前,報(bào)文段必須不斷重發(fā),tcp把報(bào)文交給ip,由ip來(lái)處理選路和傳送,系統(tǒng)協(xié)議棧利用兩個(gè)tcp進(jìn)程來(lái)處理這一復(fù)雜過(guò)程,一個(gè)為tcpout,由他來(lái)處理報(bào)文段和數(shù)據(jù)傳輸細(xì)節(jié),另一個(gè)進(jìn)程是tcptimer,他管理一個(gè)定時(shí)器,為超時(shí)重發(fā)事件定時(shí),通知tcpout進(jìn)程重發(fā)。下圖為tcp, udp數(shù)據(jù)輸出結(jié)構(gòu)圖。

總結(jié):tcp/ip協(xié)議棧是計(jì)算機(jī)操作系統(tǒng)中的一部分,它使用進(jìn)程這一抽象概念使各個(gè)協(xié)議軟件互相獨(dú)立,每一個(gè)進(jìn)程獨(dú)立執(zhí)行,并提供明確的并行機(jī)制,這種系統(tǒng)中有ip進(jìn)程,tcp輸入進(jìn)程,tcp輸出進(jìn)程和tcp定時(shí)器管理進(jìn)程,同時(shí)每個(gè)應(yīng)用程序還各有一個(gè)進(jìn)程。
上層應(yīng)用程序作為獨(dú)立進(jìn)程通過(guò)系統(tǒng)調(diào)用向tcp傳遞數(shù)據(jù)流或者想udp數(shù)據(jù)報(bào),對(duì)于udp輸出處理,運(yùn)行某個(gè)應(yīng)用程序的進(jìn)程調(diào)用一個(gè)系統(tǒng)調(diào)用,執(zhí)行一段udp過(guò)程,申請(qǐng)一個(gè)ip數(shù)據(jù)報(bào),填寫(xiě)相應(yīng)的目的地址,將udp數(shù)據(jù)封裝在Ip數(shù)據(jù)報(bào)中,然后將ip數(shù)據(jù)報(bào)傳遞給ip進(jìn)程,由ip進(jìn)程發(fā)送出去。
對(duì)于tcp輸出,運(yùn)行應(yīng)用程序的進(jìn)程調(diào)用一個(gè)系統(tǒng)調(diào)用(socket,send..),將數(shù)據(jù)傳入操作系統(tǒng)中,并保存在一個(gè)緩沖區(qū)內(nèi),應(yīng)用進(jìn)程隨后通知tcp輸出進(jìn)程,有新的數(shù)據(jù)等待發(fā)送,當(dāng)tcp輸出進(jìn)程執(zhí)行時(shí),他將數(shù)據(jù)流劃分成報(bào)文段,然后將這些數(shù)據(jù)封裝在ip數(shù)據(jù)報(bào)中,最后,tcp輸出進(jìn)程將ip數(shù)據(jù)報(bào)放入某一端口中,ip進(jìn)程將從該端口中提取并發(fā)送這些數(shù)據(jù)報(bào)。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
