久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5671|回復: 0
打印 上一主題 下一主題
收起左側

嵌入式TCP/IP協議棧框架之我見

[復制鏈接]
跳轉到指定樓層
樓主
ID:82781 發表于 2015-6-13 00:51 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

最近在移植新網卡驅動的時候學習了下TCP/IP的協議棧的框架模型做一個總結
1、硬件相關:硬件使用Emac+DMA
2、軟件相關:任意一款RTOS/內核+IPC+TCPIP協議棧

測試環境搭建:使用一臺PCIP地址為192.168.1.5,板子IP地址搞成192.168.1.60,路由器為192.168.1.1在一個子網下進行通信。使用wireshark 抓包,PC ide JATG接口進行 DEBUG。追蹤一個UDP報文的輸入,以此窺見整體的軟件框架架構。

構造數據發送接收流程:PC->網卡到路由器->路由器轉發之->板子接收。
數據如下:



首先是中斷,以太網最最底層的物理層中斷,提示以太網接收到數據包,這時候數據報文是最完整的一幀如下:

所上面所謂的Frame就是這一層接收到的,從上面可見TCP/IP是嚴格的分層處理的, 下面也會從代碼上看出來,確實是分層的。這一層接收到的數據是RAW數據,這完全取決于驅動層是否穩定可靠,有很多人在這里就栽跟頭,最后搞的什么PING 不通啦,死機啦等等我也栽跟頭了,最近的就是ARP廣播的問題。所以驅動層是整個協議棧的的基石。最好建議使用大神寫的代碼或者固件庫來弄,自己那兩下子,就別比比了。OK只要你能正確的接收網絡上的包這一層就OK,
下面是流程:

一、網絡接口層的處理

start A :
{
1、以太網中斷,證明有數據包到來,這時候第一件事是讀取數據包,由于有操作系統支撐,那好建立一個RX線程來處理這個事件。

以太網的中斷處理
{
ETH_IRQHandler
1、post a RXmbox to RX thread
}

接收線程
{
1、掛起到 RXmbox 上(if 沒有郵箱到來--死等)
2、調用物理層讀取報文到pbuf中,這里注意pbuf是從內存中動態開辟出來的。還有一點就是收發是倆線程記得加互斥鎖哦。返回指針P
這個指針P承載著所有的收進來的數據,完全copy到內存中了,長度就是數據包的長度。也就是系統給分配內存了。這個數據包開始在系統中生存。這很重要,標志這這就是一頭豬要殺掉吃肉了。光有指針不夠,必須有個結構來記錄,所以就是pbuf來記錄進來的包。
3、交給TCPIP協議棧的物理層進行處理。物理層其實做的活很簡單:



}
物理層就是判斷是什么類型的包,是ARP的話交給ARP處理,是IP的話交給IP層處理,什么也不是就釋放掉Pbuf記錄的包,UDP數據是IP的類型,所以執行


:更新ARP表的。
這個是去除MAC地址的,也就是
這一層里面描述的,其實也不是去掉,只是指針向后移動了避開了這些字段,也就是所謂的指針。修改了長度字段等,這樣上層就可以只處理上面的了。
這個才是最終的數據包去向哦!!!那么他去哪里了呢?繼續

顯然他來到了一個邊界,線程的邊界,可以看出他分配了一個類型的消息,然后用加載了PBUF的所有數據(哪有數據啊,其實就是指向那個BUF的指針而已,說白了他傳遞的就僅僅是是指針而已,通過指針的索引可以找到所有的數據)最后用投遞了出去。

這就是接收線程的最后了,他做完這些就又回到原來的郵箱等待了。等待下一個數據的到來,然后做重復的動作,就是這樣。
他承擔了底層數據的讀取,和簡單的封裝分揀,然后投遞到郵箱中通知TCPIP的主線程準備工作。
}
end A

二:TCPIP線程的處理
start B:
是時候進入TCPIP主線程了,所有的調度都在這里進行。他的工作室這樣的
首先是掛起到這里,因為A段說到已經post了一個郵箱,所以這里立馬激活運行,鄉下
這個類型一定是所以
執行到這里

從上面可見TCPIP線程取出來了先前加入的原始數據報文的指針P和網絡接口的記錄。這個netif不用理會,想想為網卡的一種抽象即可.關鍵是P指針。
輸入進,最后釋放掉了這則消息。因為已經用完了,這里中斷是進入了網絡層了。也就是IP層
就是這一層哦。
這里面各種檢測判斷,各種的檢查啊,主要是第一檢測這個IP報文的IP地址是不是給我們,是就傳給山層,不是就轉發,還有一些校驗和的判斷也在這里進行。還有一點在這里執行的是釋放了一部分pbuf,節省了內存,這個不是和上次單純移動指針,而是真的去除用不到的buf,只保留IP和以上層的數據。
這個里面處理多了去了,DHCP.ICMP,IGMP,RAW,一堆的最終歸宿一定是這個輸入的是個UDP包。所以就是繼續向下
哎呀我去,這個里面又來了,各種的判斷,各種的異常處理,各種的檢測,不過簡而言之就是一句話只要不是我的我不要,是我的當然我還要看看校驗和對不對,對那好,又會來了一個最終的歸宿這里
這個是什么?顯然像個函數,實際上是個指針函數,他指向哪里了?。。。。。 旺旺~~~冒金星了。不知道他指向哪里了,
實際上這些指針也好結構也罷,你要知道他去哪里就要找到他的源頭,他的源頭句柄是PCB,那么PCB在哪里?PCB和SOCKET有什么聯系肯定有聯系,然后轉而去找pcb的建立,從socket開始找最后找到一個這個玩意

然后在向里面就是這下找到啦
最終

這個函數就是上面的下一步哦,goon ....
在這里面又會分配
這個玩意出來,

對他進行了這些操作,
啊,原來他是來描述接收到的這個UDP數據包的呀。看下面傳遞上來的指針P又被賦給了他,莊戶人拉呱:倒三把了。
在向下就是這一端的終點了哦

這個就是TCPIP和應用層的交互郵箱,著名的郵箱了,據說很多大神對此都很有研究。我這菜比也見了見,不錯不錯。
這只是見了見,你知道他在哪里?于是乎還得找,他在這里


這個郵箱實在conn初始化的時候被創建了,圍繞著這個郵箱的size,我認為郵箱尺寸要盡量的大一點才好呢。


end B
三、應用層處理
start C
至于應用線程,直接說他是掛起在這個郵箱上的,他會做自動的數據COPY,把UDP描述記錄中的內容自動復制你提供的內存中,然后結束PBUF的使命,殺掉他。釋放內存,然后你從你指定的那塊緩存中取出數據就可以完成一個UDP數據包的接收,就這么簡單,這就是事實,事實就是這樣!


接收到32字節的數據,處理吧!!!!!!!!!!!!!!!!!!!!!!#¥!@#%¥%¥……
end C



發送是主動的會簡單一些,和接收互逆,只是添加構建一些頭,主要還是接收這一塊,通過分析可見,TCPIP協議棧對接收到的數據報文進行層層的剝皮,檢查,就像剝一個雞蛋一樣,一層層的去掉,最后取出蛋黃放在口里。那個recv就是回調。其他的mbox和recvbox是承上啟下的。
TCP的要復雜一些,不過根本框架是一樣的哦。
ICMP報文,到不了這里到IP層就會被自動轉發出去了,
ARP層直接到不了IP層在早就轉發走了。

TCPIP協議棧傳遞的就是一個pbuf指針,直到應用程序copy完畢數據,當然其他的異常什么的除外了。
對TCPIP協議的我們可以用到其他的一些通信中,主要是學習他的這種框架,和機制。是程序就有BUG,只能說是水太深,我太菜,沒有什么了!
最后向作者致敬,不禁感嘆:大神!

老王
日照比特



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩久久久久 | 亚洲视频免费一区 | 国产欧美精品一区二区三区 | 亚洲码欧美码一区二区三区 | 午夜极品 | 久久99久久99精品免视看婷婷 | 国产精品高清一区二区 | 久久亚洲国产精品 | 黄色激情毛片 | 成人永久免费 | 毛片com | 亚洲国产成人在线视频 | 蜜臀网 | 国产亚洲精品综合一区 | 二区在线视频 | 国产一区欧美 | 国际精品鲁一鲁一区二区小说 | 自拍 亚洲 欧美 老师 丝袜 | 精品欧美激情精品一区 | 一区二区三区国产精品 | 国产精品国产 | 午夜激情网 | 亚洲视频三区 | 中文字幕91 | 国产一区在线免费 | 久久国产精品-久久精品 | av在线视| www.中文字幕.com | 欧美一级黑人aaaaaaa做受 | 国产在线观看一区 | 夜夜夜夜夜夜曰天天天 | 色爱综合网 | 久久久久亚洲av毛片大全 | 国产精品毛片一区二区在线看 | 欧美色成人| 天天操天天干天天爽 | 一区二区三区四区电影视频在线观看 | 午夜黄色 | 日韩 欧美 综合 | 国产精品区一区二区三 | 欧美日韩精品一区 |