UDP數(shù)據(jù)報與TCP傳輸應(yīng)用系統(tǒng)的層間接口設(shè)計
?。?)應(yīng)用層和rap層的接口
如果是作為客戶端,則包含:
·bind:使用bind綁定本地端口;
·cONnect:需要使用connect進行連接,當(dāng)應(yīng)用層調(diào)用connect函數(shù)時,TCP層負責(zé)建立連接,返回值指 示是否連接成功;
·send:使用send發(fā)送一個應(yīng)用層的數(shù)據(jù);
·recelve:當(dāng)rap層有數(shù)據(jù)到達時,rap層將觸發(fā)OnReceive函數(shù),用戶可以在OnReceive函數(shù)中做接收 處理;
·close:需要使用close函數(shù)主動和對方斷開連接,連接斷開以后返回真,如果斷開操作超時,則返回假。
圖1 TCP/IP層間接口
如果是作為服務(wù)器,則包含:
·bind綁定;
·listen:在綁定的本地端口監(jiān)聽;
·對方發(fā)來連接;
·send發(fā)送;
·recelve接收;
·close斷開連接。
總的來說,rap層要提供給應(yīng)用層以上的一些函數(shù)。
?。?)協(xié)議和網(wǎng)卡驅(qū)動的接口
發(fā)送時,網(wǎng)卡提供send函數(shù),當(dāng)協(xié)議調(diào)用send函數(shù)時,網(wǎng)卡驅(qū)動負責(zé)發(fā)送這個包。
接收時,當(dāng)網(wǎng)卡接收到一個數(shù)據(jù)包以后,產(chǎn)生一個中斷,系統(tǒng)提供一個中斷處理函數(shù),在這個中斷函 數(shù)中將這個包提交給TCP/IP層。
?。?)TCP/IP內(nèi)部的層間接口
發(fā)送流程如下:應(yīng)用層調(diào)用send,要求rap層發(fā)送,TOP層填寫好TCP頭部信息以后,要求IP層發(fā)送,IP 層檢查是否能在ARP緩存中找到IP對應(yīng)的物理地址,如果沒有則要ARP協(xié)議發(fā)送一個ARP請求,如果有則填 寫IP頭。再設(shè)置一個網(wǎng)絡(luò)接口層,這一層負責(zé)填寫MAC層頭部,這一層的另外一個功能是將接收網(wǎng)絡(luò)數(shù)據(jù) 流分流(也就是對IP包和ARP交給不同的函數(shù)處理)。
對網(wǎng)卡的接收和TCP/IP協(xié)議的接口來說,直接在驅(qū)動程序的接收中斷處理函數(shù)中處理P頭、TCP頭,然 后把數(shù)據(jù)送給應(yīng)用層。
?。?)實現(xiàn)隊列層間接口
·中斷處理函數(shù)過大,可能會帶來問題;
·各個層的界面不清晰;
·越向底層所要發(fā)送的包數(shù)目越多。如果發(fā)送時也是從應(yīng)用層一直運行到網(wǎng)卡驅(qū)動,
那么就比較難解決底層的多佘數(shù)據(jù)包發(fā)送的問題。
所以將在層次之間設(shè)一個隊列,程序循環(huán)檢測各個層間隊列中是否有元素,如果有元素則提取后處理 。構(gòu)建的一個隊列結(jié)構(gòu)體如下。
這個隊列提供隊列的初始化、隊列的寫入、隊列的讀出等函數(shù),以及完成隊列的操作。但是隊列多也 會占用資源和查詢時間,所以在沒有必要設(shè)置隊列的地方將苴接采用函數(shù)調(diào)用的方法。
?。?)模塊和模塊之間的接口
各個模塊之中有三種類型的子模塊:一般函數(shù)、中斷函數(shù)和進程。
·一般函數(shù)只有在被進程調(diào)用時才運行。
·中斷函數(shù)一般由中斷觸發(fā)而運行,這里主要有網(wǎng)卡驅(qū)動的接收處理函數(shù)和定時器模
塊中的定時器。
由于這里采用隊列的方式作為模塊或?qū)娱g的接口,所以必須反復(fù)查詢各個模塊的輸入隊列,所有含有 輸入隊列的模塊都必須有一個反復(fù)被調(diào)用的函數(shù),稱之為進程。在主進程maln函數(shù)中反復(fù)地調(diào)用這些進程。
tcp/ip相關(guān)文章:tcp/ip是什么
評論