天天看點

lwip可以用于發udp_關于LWIP---UDP(轉)

lwip是一個輕量級的TCP/IP協定棧(Lightweight TCP/IP Stack)實作,最初是瑞士計算機科學學院Adam Dunkels編寫的一個應用于無作業系統的嵌入式系統中的TCP/IP協定棧,後來作為一個開源(open source)項目,由一個全球性的團隊進行開發和維護。

已實作的部分有:

1. 标準的TCP/IP協定棧實作,包括TCP、UDP、ICMP、IP、ARP、DHCP;

ICMP(Internet control message protocol):網絡維護和調試。

UDP(User datagram protocol)

DHCP(Dynamic host configuration protocol)

ARP(Address resolution protocol)

2.非标準Socket接口,lwip提供了一套Socket API,這套API的标準與正常作業系統下的Socket API的形式不是很一緻,我們先前已經在這套API上實作了Web Server,已測試在沒有Mobile IP環境下工作正常。

下面我們就一個lwip典型的UDP協定工作過程作為對lwip的簡單介紹。

UDP發送過程:

1.應用層:綁定UDP套接字

我們必須先建立一個UDP套接字,通過調用udp_new()進行申請,然後調用udp_bind()綁定在

UDP端口上,在這個調用過程中,我們必須編寫一個用于處理這個UDP套接字接收到的資料封包的函數,并把這個函數作為udp_bind()的參數,以後

當套接字接收到資料封包時會自動調用這個函數,我們将在後面介紹這個函數怎麼調用的。綁定結束之後,必須調用udp_connect()将資料封包的目的

位址綁定在UDP的資料結構中,最後就是調用udp_send()把資料封包發送出去。

udp_bind()的處理流程圖

lwip可以用于發udp_關于LWIP---UDP(轉)

2.傳輸層的處理

做好應用層的處理之後,資料封包被送出到UDP層,udp_send()函數中首先給資料封包加入UDP頭部,然後調用ip_route()選擇一個合适的網絡接口進行發送,最後調用ip_output()把資料封包傳入IP層。

3.IP層的處理

ip_route()函數比較各個網絡接口的IP位址是否與目的IP位址在同一子網中,如果有,就把它當成發送的網絡接口傳回,如果沒有就傳回一個預設的網絡接口。

ip_output()函數中,先給資料封包加上IP頭部,然後比較目的IP位址與網絡接口的IP位址是否在同一網段,如果不是,就必須先把資料封包發送

到網關,于是使用網關的IP位址作為目的主機,如果目的IP位址與網絡接口的IP位址在同一網段,則把目的IP位址作為目的主機。接着調用

arp_lookup()在ARP緩存中查找目的主機的MAC位址,找到了調用ethernet_output()把資料封包傳入到資料鍊路層發送,如果

找不到,就調用arp_query()發送ARP請求解析目的主機的MAC位址。

4.ARP協定的處理

arp_lookup()實作在本地ARP緩存中查找目的主機的MAC位址,找到了傳回該MAC位址,找不到傳回NULL。

arp_query()函數中構造一個ARP請求封包,然後調用ethernet_output()把該封包送到資料鍊路層發送。

5. 資料鍊路層的處理

資料鍊路層的處理就是給資料封包添上相對的以太網頭部,然後調用lowlever_output()直接把封包傳送出去。

UDP接收過程:

接收過程與發送過程剛好相反,資料封包首先調用ethernet_input()函數到達資料鍊路層,去掉以太網頭部之後如果是ARP封包傳給調用

arp_input()交給ARP協定處理,如果是IP封包就調用ip_input()進入IP層處理,ip_input()函數中比較資料封包的目的

IP位址,如果與某個網絡接口的IP位址相同,則接收這個封包,依照IP頭部的協定字段,調用各自協定的輸入處理函數,本例中将調用

udp_input(),在udp_input()中提取資料封包的端口号,然後在已登記的套接字中查找與該端口号符合的UDP接收函數,如果沒有找到相

應的套接字,調用icmp_output()發送一個ICMP不可達封包,如果找到了,就調用該函數(這個函數就是我們在udp_bind()時傳入的其

中一個參數)。

udp_input處理流程圖:

lwip可以用于發udp_關于LWIP---UDP(轉)