單片機以太網(wǎng)控制芯片W7100A數(shù)據(jù)手冊(四)
- 建立連接 : 接收過程
在這個過程中,它處理內(nèi)部RX存儲器接收的數(shù)據(jù)。在TCP模式下,如果接收的數(shù)據(jù)的字節(jié)長度超過端口當前RX存儲器的剩余空間,W7100A不能接收數(shù)據(jù)。如果發(fā)生這種情況,W7100A將保持連接(暫停),并等待RX的剩余空間大于需要接收的數(shù)據(jù)字節(jié)長度。
在W7100A驅(qū)動程序中wiznetmemcpy.c文件中定義的wizmemecpy函數(shù),使用Receive/Send過程來進行存儲器數(shù)據(jù)的快速復(fù)制。更多詳細信息請參考第13章,參考’W7100A性能提升’以了解其性能表現(xiàn),參考’W7100A驅(qū)動指南’以了解其使用方法。如果用戶不想使用wizmemcpy函數(shù),那么使用普通的存儲器復(fù)制函數(shù)即可。
由于W7100A內(nèi)部同時具有數(shù)據(jù)存儲器和TCPIP內(nèi)核內(nèi)部存儲器,用戶應(yīng)該根據(jù)地址進行分類。所以用戶必須在TCPIP內(nèi)核內(nèi)部存儲器的最高級地址前加上’0xFE’,或者在從TCPIP內(nèi)核存儲器到數(shù)據(jù)存儲器進行復(fù)制操作時,將DPX0寄存器設(shè)置為’0xFE’。關(guān)于wizmemcpy的更多詳細信息請參考’W7100A驅(qū)動指南’。
- 建立連接 : 檢查發(fā)送數(shù)據(jù)/發(fā)送過程
發(fā)送數(shù)據(jù)的字節(jié)長度不能超過SOCKET n TX存儲器的大小。如果要傳輸?shù)臄?shù)據(jù)長度大于設(shè)置的MSS,它將按照MSS分段傳輸。
為了下一次數(shù)據(jù)的傳輸,用戶必須檢查上一次的SEND命令是否執(zhí)行完成。如果上一次的SEND命令還沒有執(zhí)行完成又開始下一次的SEND命令,將會產(chǎn)生錯誤。數(shù)據(jù)越多,執(zhí)行SEND命令所花費的時間越長。因此用戶可以適當?shù)貙?shù)據(jù)分段發(fā)送。
在發(fā)送過程中,用戶必須將’0xFE’加到地址的最高地址,以指向TCPIP內(nèi)核的存儲器。
- 建立連接 : 超時
超時可能會發(fā)生在連接請求(SYN數(shù)據(jù)包)或其響應(yīng)(SYN/ACK數(shù)據(jù)包)、數(shù)據(jù)通信或其響應(yīng)(DATA/ACK數(shù)據(jù)包)、斷開連接請求(FIN數(shù)據(jù)包)或其響應(yīng)(FIN/ACK數(shù)據(jù)包),以及所有其它TCP數(shù)據(jù)包的傳輸。如果不能在RTR定義的時間和RCR定義的重發(fā)次數(shù)范圍內(nèi)完成上述數(shù)據(jù)包的傳輸,都將產(chǎn)生TCP的超時,Sn_SR的狀態(tài)變?yōu)镾OCK_CLOSED。確定TCP超時的方法如下:
9.2.1.2
除了”CONNECT”狀態(tài)外,與TCP服務(wù)器完全一樣。用戶可參考9.2.1.1”TCP服務(wù)器”。
圖9.4 “TCP客戶端”操作流程
- 連接
發(fā)送連接請求(SYN數(shù)據(jù)包)到”TCP服務(wù)器”。當制造 “連接端口”到服務(wù)器時,可能會發(fā)生像ARPTO、TCPTO這樣的超時現(xiàn)象。
9.2.2
UDP是無連接的協(xié)議,它的通信是不需要SOCKET建立連接。TCP是一種面向連接的、可以保證可靠性的通信協(xié)議,但UDP采用數(shù)據(jù)報文的通信方式,數(shù)據(jù)傳輸?shù)目煽啃詻]有保障。但是,因為UDP不使用連接的SOCKET,因此它可以與多個已知IP地址的多個端口進行數(shù)據(jù)交換。這是它的優(yōu)勢。使用一個端口與其它端口通信也會帶來很多問題,比如丟失傳輸?shù)臄?shù)據(jù)、或接收到其它端口來的不需要的數(shù)據(jù)等。在UDP模式下,為了避免出現(xiàn)這些問題,保證數(shù)據(jù)通信的可靠性,主機需要重發(fā)被損壞的數(shù)據(jù)或丟掉那些不需要的數(shù)據(jù)。UDP協(xié)議支持單播、廣播和多播等通信方式。它遵循以下通信流程。
二進制
11011110.01100010.10101101.01111011
00000000.00000000.00000000.11111111
-
11011110.01100010.10101101.11111111
圖9.5 UDP操作流程
9.2.2.1
單播是UDP的一種通信方式。它一次只能將數(shù)據(jù)傳輸給一個目的站點。而廣播通信則使用廣播地址(255.255.255.255),將數(shù)據(jù)發(fā)送給所有的可接收的目的站點。例如,假設(shè)用戶將數(shù)據(jù)傳輸給目的站點A、B和C。單播是每一次將數(shù)據(jù)單獨傳輸給A、B或C。在這種情況下,在獲得目的站點A、B或C的物理地址時可能產(chǎn)生ARP超時。在產(chǎn)生ARP超時的時候是不能夠?qū)?shù)據(jù)傳輸?shù)侥康牡氐摹?p>廣播則使用廣播地址(255.255.255.255),可以一次同時將數(shù)據(jù)發(fā)送到目的站點A、B和C。這時不需要得到目的站點A、B或C的物理地址,因此不會產(chǎn)生ARP超時。
- 怎樣建立廣播IP?
廣播IP地址可以通過子網(wǎng)掩碼按位補碼和主機IP地址的按位的邏輯或運算得到。
例:本機IP:222.98.173.123,子網(wǎng)掩碼:255.255.255.0,則廣播IP地址則為:222.98.173.255
- SOCKET初始化
對要實現(xiàn)UDP通信,SOCKET必須進行初始化設(shè)置。打開SOCKET的操作過程如下:首先在W7100A的8個SOCKET中選擇一個SOCKET為UDP的工作,并設(shè)置為UDP模式(Sn_MR(P3:P0)),然后設(shè)置本機端口號(Sn_PORT0),最后運行OPEN命令。執(zhí)行OPEN命令后,如果Sn_SR狀態(tài)改變?yōu)镾OCK_UDP,則完成了端口的初始化設(shè)置。
圖9.6 接收UDP數(shù)據(jù)的格式
接收的UDP數(shù)據(jù)包含8個字節(jié)的數(shù)據(jù)包信息和有效數(shù)據(jù)。數(shù)據(jù)包信息包括兩個部分:發(fā)送者的信息(IP地址和端口號)和數(shù)據(jù)包的長度。UDP可以接收其它的很多UDP數(shù)據(jù),用戶可以通過發(fā)送者的信息區(qū)分UDP數(shù)據(jù)來源。它也接收以”255.255.255.255”的廣播地址發(fā)送的信息。因此主機可以通過分析發(fā)送者的信息,丟掉那些不需要的數(shù)據(jù)。
如果要接收的數(shù)據(jù)長度大于SOCKET的RX存儲器的剩余空間,用戶將無法接收到數(shù)據(jù),也不能夠接收分段的數(shù)據(jù)。
- 檢查發(fā)送數(shù)據(jù)/發(fā)送過程
用戶想發(fā)送的數(shù)據(jù)的大小不能超過內(nèi)部TX緩沖器能容納的范圍。如果比MTU大的話,會自動以MTU為單位進行劃分然后發(fā)送。當用戶想用廣播方式時,Sn_DIPR0應(yīng)被設(shè)置成”255.255.255.255”
- 檢查發(fā)送完畢/超時
在繼續(xù)發(fā)送數(shù)據(jù)之前,用戶必須檢查先前的SEND命令是不是已經(jīng)完成了。發(fā)送的數(shù)據(jù)越多,發(fā)送需要的時間就越長。因此用戶必須合理地將其要發(fā)送的數(shù)據(jù)進行劃分。當用戶發(fā)送UDP數(shù)據(jù)時可能發(fā)生ARP超時。如果ARP超時發(fā)生了,傳輸UDP數(shù)據(jù)失敗。
9.2.2.2
廣播是與所有的、不確定的目的站點進行通信。但多播是與多個、但在多播組注冊的目的站點進行通信。假如A、B和C是在一個特定的多播組里注冊的站點。如果用戶將數(shù)據(jù)傳送到多播組(包含站點A),站點B和C也能夠從站點A得到數(shù)據(jù)。為了使用多播通信,使用IGMP協(xié)議將目的站點列表注冊到多播組。多播組包括:分組硬件地址、分組IP地址和分組端口號。用戶不能夠更改”分組硬件地址”和”分組IP地址”。但用戶可以更改”分組端口號”。
分組硬件地址的選擇范圍在”01:00:5e:00:00:00”到”01:00:5e:7f:ff:ff”之間,而分組IP地址則使用D類地址, 范圍從“224.0.0.0”到“239.255.255.255”。詳細內(nèi)容請參考官方網(wǎng)站:
http://www.iana.org/assignments/multicast-addresses.
在選擇時,6個字節(jié)的”分組硬件地址”的高23位硬件地址和4個字節(jié)的”分組IP地址”必須相同。例如,如果用戶選擇的分組IP地址為”244.1.1.11”,那么分組硬件地址為”01:00:5e:01:01:0b”。詳細信息請參考RFC1112:http://www.ietf.org/rfc.html
在W7100A內(nèi)部,IGMP處理多播注冊是由內(nèi)部(自動)完成的。當用戶以多播的模式打開端口時,”Join”信息將在內(nèi)部自動傳送。如果用戶關(guān)閉端口,”Leave”信息將在內(nèi)部自動傳送。端口打開以后,”Report”信息將在數(shù)據(jù)傳輸過程中每隔一定的時間傳送。
W7100A支持IGMP v1和v2版本。如果用戶想使用一個升級的版本,主機可以使用IPRAW模式直接處理IGMP。
- SOCKET初始化
從W7100A的8個端口中選擇一個以進行多播。將”多播分組MAC地址”設(shè)為Sn_DHAR0,將”多播分組IP地址”設(shè)為Sn_DIPR0。然后將”多播分組端口號”設(shè)為Sn_PORT0和Sn_DPORT0。設(shè)置Sn_MR(P3:P0)成為UDP模式,將Sn_MR(MULT1)設(shè)置為1。最后執(zhí)行OPEN(打開)命令。如果Sn_SR的狀態(tài)在OPEN命令之后被改為SOCK_UDP,端口初始化就完成了。
- 檢查接收到的數(shù)據(jù)
請參考9.2.2.1”單播方式和廣播方式”
- 接收過程
請參考9.2.2.1”單播方式和廣播方式”
- 檢查發(fā)送數(shù)據(jù)/發(fā)送過程
因為用戶在端口初始化中設(shè)置了多播分組的信息,因此用戶不必再設(shè)置目的設(shè)備的IP地址和端口號。因此,復(fù)制要傳送的數(shù)據(jù)到內(nèi)部TX緩沖區(qū),執(zhí)行SEND命令就可以了。
l
參考9.2.2.1”單播&廣播”
評論