freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

lwip協(xié)議棧架構(gòu)與設(shè)計(jì)解析-資料下載頁

2024-11-08 16:08本頁面

【導(dǎo)讀】首先說明一下,這篇文檔的主要目的是提取網(wǎng)絡(luò)發(fā)送和接收數(shù)據(jù)的函數(shù)接口。們自己的驅(qū)動網(wǎng)卡的接口函數(shù)替代程序中的接口??梢蕴^第一、二、三章,直接閱讀第四章,使用我們的接口代替第四章的接口就行了。傳統(tǒng)的,或者說是典型的TCP/IP協(xié)議族的設(shè)計(jì)都是按照分層的思想來設(shè)計(jì)的。樣設(shè)計(jì)有個好處,就是每層相對于其他層獨(dú)立,代碼方便理解。缺點(diǎn)就是,每層之間進(jìn)行數(shù)。據(jù)交互的時候必須要進(jìn)行復(fù)制,而數(shù)據(jù)的復(fù)制是很耗時的,這就降低了實(shí)時性。LWIP各層之間沒有明顯的界限,各層之間都??梢栽L問到共享在內(nèi)存中的數(shù)據(jù)。產(chǎn)生的性能損失。而這些模塊就共同組成了LWIP整體。下面一章將分析LWIP. 的源碼,結(jié)合源碼介紹這些模塊。TCP協(xié)議在LWIP協(xié)議棧中占得比例最大,有將近一半的代碼是。專門用來實(shí)現(xiàn)TCP協(xié)議的。并且無線音頻項(xiàng)目采用的也是TCP. 應(yīng)用層主要是使用LWIP協(xié)議棧開發(fā)相應(yīng)的網(wǎng)絡(luò)通信程序。三種接口分別為RAWAPI,NetconnAPI和BSDSocketAP。應(yīng)用程序與LWIP協(xié)議棧處在同一個進(jìn)程中。

  

【正文】 用 etharp_send_ip(組裝目標(biāo) mac和源 mac)接口, etharp_send_ip調(diào)用 if結(jié)構(gòu)中的設(shè)備驅(qū)動注冊的 linkoutput鉤子函數(shù)發(fā)送最終報文。如果是單播包, etharp_output 接口就調(diào)用 etharp_query 進(jìn)行 ip 地址和 MAC 地址的映射,來獲取到目標(biāo)機(jī)的 MAC 地址。并在 etharp_query中調(diào)用 etharp_send_ip來發(fā)送最終組合報文。 【 6】 ip 模塊 ip 模塊實(shí)現(xiàn)了協(xié)議的 ip 層處理,主要文件為 ipv4/。其主要入口函數(shù)為: err_t ip_input(struct pbuf *p, struct if *inp) 該接口通過判斷輸入報文的協(xié)議類型,將其輸入到相應(yīng)的上層協(xié)議模塊中去。比如,將udp 報文送到 udp_input。 該模塊另外一個接口是輸入函數(shù),原型如下: err_t ip_output(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t ttl, u8_t tos, u8_t proto) 該接口通過路由表或者傳輸 ip 后,調(diào)用 if 的 output 函數(shù)指針指向的函數(shù) 發(fā)送報文。 第 16 頁 共 18 頁 【 7】 udp 模塊 不是我們所關(guān)心的,這里就不做介紹 【 8】 icmp 模塊 用的不多,不必關(guān)心 【 9】 igmp 模塊 用的不多,不必關(guān)心 【 10】 dhcp 模塊 可能會用到 。 dhcp 模塊用于獲取設(shè)備 ip 地址的相關(guān)信息。其處理入口主要有這么幾個: dpch的啟動、dpch 的接收報文處理以及定時器模塊的處理。 主要的接口原型如下: err_t dhcp_start(struct if *if) 該接口用于設(shè)備啟動 dhcp 模塊,主要是客戶端的功能。該模塊實(shí)現(xiàn)設(shè)備 dhcp描述結(jié)構(gòu)生成,并 將 dhcp的端口綁定到 udp協(xié)議中,以及將本 dhcp 模塊跟遠(yuǎn)端服務(wù)器端口進(jìn)行綁定。最后啟動 dhcp 申請。 static void dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port) 該接口為一個注冊接口,用于 dhcp 報文接收。在 start dhcp 時,該接口通過 dhcp 的 udp pcb 注冊到 udp 協(xié)議層。 Udp 進(jìn)行報文處理后,根據(jù)端口調(diào)用該注冊接口。該接口中,實(shí)現(xiàn)dhcp 報文的 協(xié)議處理。 Void dhcp_fine_tmr() Void dhcp_coarse_tmr() 這兩個函數(shù)接口實(shí)現(xiàn)了 dhcp 的相關(guān)超時處理監(jiān)控。上面一個用于請求應(yīng)答超時處理。下面一個用于地址租用情況的到期處理。 從源碼分析看,上述的接口在應(yīng)用 lwip 的協(xié)議棧時,需要重點(diǎn)關(guān)注。對于小內(nèi)存應(yīng)用的場合,該協(xié)議棧的內(nèi)存管理以及 pbuf 應(yīng)用部分需要自行改寫 第 17 頁 共 18 頁 三、 LWIP 協(xié)議棧處理數(shù)據(jù)流程 協(xié)議棧處理數(shù)據(jù)的流程主要是處理 TCP數(shù)據(jù)包。關(guān)于 UDP 數(shù)據(jù)報的處理流程暫且不做討論。 LWIP 對 TCP 數(shù)據(jù) 包的處理流程如下圖 所示。 圖 協(xié)議棧數(shù)據(jù)處理流程 如上圖所示, lwip 協(xié)議棧對 TCP 數(shù)據(jù)包的處理經(jīng)過四層的處理。分別為應(yīng)用層,傳輸層,網(wǎng)絡(luò)層和網(wǎng)絡(luò)接口層。圖中左半邊部分是數(shù)據(jù)發(fā)送的處理部分,右半部分是數(shù)據(jù)接收的處理部分。 【 1】 數(shù)據(jù)的發(fā)送 整個過程的發(fā)起者是應(yīng)用層。應(yīng)用層調(diào)用 ip_write()函數(shù),接著 tcp_write() 函數(shù)再將控制權(quán)交給 tcp_enqueue() 函數(shù),這個函數(shù)會在必要時將數(shù)據(jù)分割為適當(dāng)大小的 TCP 段,然后再把這些 TCP 段放到所屬連接的 傳輸隊(duì)列中。這時, tcp_output() 函數(shù)會檢查現(xiàn)在是不是能夠發(fā)送數(shù)據(jù),也就是判斷接收器窗口是否擁有足夠大的空間,阻塞窗口是否也足夠大,如果條 第 18 頁 共 18 頁 件滿足,就使用 ip_route()及 ip_output_if() 函數(shù)發(fā)送數(shù)據(jù)。 【 2】 數(shù)據(jù)的接收 過程的發(fā)起者是網(wǎng)絡(luò)接口層,這里不做描述。網(wǎng)絡(luò)接口層將數(shù)據(jù)包傳遞給 ip_input()函數(shù),該函數(shù)驗(yàn)證 IP 頭后移交 TCP 段給 tcp_input() 函數(shù)。 tcp_input() 函數(shù)完成兩項(xiàng)工作:其一,初始完整性檢查(也就是校驗(yàn)和驗(yàn)證與 TCP 選項(xiàng)解析);其二,判定這 個 TCP 段屬于哪個TCP 連接。接著,這個 TCP 段到達(dá) tcp_process() 函數(shù),這個函數(shù)實(shí)現(xiàn)了 TCP 狀態(tài)機(jī),任何必要的狀態(tài)轉(zhuǎn)換在這里實(shí)現(xiàn)。當(dāng)該 TCP 所屬的連接正處于接受網(wǎng)絡(luò)數(shù)據(jù)的狀態(tài),tcp_receive()函數(shù)將被調(diào)用。最終, tcp_receive()函數(shù)將數(shù)據(jù)傳給上層的應(yīng)用程序,完成接收過程。如果這個 TCP 段由一個不被承認(rèn)的 ACK應(yīng)答數(shù)據(jù)構(gòu)成,數(shù)據(jù)將會從緩沖區(qū)移走,它所占用的存儲區(qū)被收回。同樣,如果收到一個 ACK 應(yīng)答確認(rèn)數(shù)據(jù),接收器同意接收更多的數(shù)據(jù),如圖 所示, tcp_output() 函數(shù)將會被調(diào)用 。 四、 接口提取 看完第三章的協(xié)議棧處理數(shù)據(jù)的流程,就知道與網(wǎng)絡(luò)底層驅(qū)動的接口部分主要是在網(wǎng)絡(luò)接口層。主要是在 if 結(jié)構(gòu)體里提到的 input 和 output 函數(shù)指針?biāo)赶虻暮瘮?shù)。具體提取出來的接口有: static void low_level_init(struct if *if) static err_t low_level_output(struct if *if, struct pbuf *p) static struct pbuf * low_level_input(struct if *if) err_t etherif_input(struct if *if) err_t etherif_init(struct if *if) 重寫以上這些接口,并用重寫的接口替換 里的接口。所要做的工作就是這些。
點(diǎn)擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計(jì)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1