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