本發(fā)明涉及通信領(lǐng)域,具體涉及一種udp數(shù)據(jù)包的分割方法和發(fā)送方法。
背景技術(shù):
當(dāng)前存在多種請求協(xié)議(rfc),如rfc43017(ip協(xié)議安全協(xié)議),rfc42916(ipv6地址框架),rfc48613(ipv6鄰居發(fā)現(xiàn)協(xié)議),rfc48624(ipv6無狀態(tài)地址自動配置),rfc24602(ipv6協(xié)議)和rfc44435(internet控制消息協(xié)議),共同實(shí)現(xiàn)ipv6協(xié)議的核心規(guī)范。眾所周知,從ipv4到ipv6的過渡將持續(xù)很長時間,為保證平穩(wěn)過渡,需要特別關(guān)注ipv4和ipv6節(jié)點(diǎn)過渡期間的共存問題。
tunneling(封裝)機(jī)制允許ipv6孤島或單節(jié)點(diǎn)通過ipv4網(wǎng)絡(luò)進(jìn)行通信,其支持兩類通道:配置(人工)通道(rfc4213,2893)和自動通道。目前已有幾種實(shí)現(xiàn)自動通道的方法,如:ipv4compatibleipv6toipv4(rfc3056),ipv6overipv4(rfc2529),isatap,通道代理人(rfc3053)和teredo。
但當(dāng)輸入負(fù)載變大時(大于rfc4213中3.2.1節(jié)規(guī)定的長度為128字節(jié)mtu)所有現(xiàn)有tunneling機(jī)制將出現(xiàn)如下問題;當(dāng)發(fā)送端數(shù)據(jù)過載時,數(shù)據(jù)包會被返還而不能進(jìn)入傳輸通道,造成數(shù)據(jù)包無法發(fā)送,所以必須尋找新的發(fā)送機(jī)制。
此外,由于中國的cernet2是當(dāng)前世界上最大的采用ipv4overipv6(ietf)技術(shù)的ipv6本土骨干網(wǎng),采用了真實(shí)ipv6地址(ietf)且有多個自治系統(tǒng)(as),因此向具有指定mac地址通過rawsocket發(fā)送“cooked”ipv6udppacket也是具有挑戰(zhàn)性的工作。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明旨在至少解決上述技術(shù)問題之一。
為此,本發(fā)明的一個目的在于提出一種在超長數(shù)據(jù)負(fù)載條件下的udp數(shù)據(jù)包分割方法。
為了實(shí)現(xiàn)上述目的,本發(fā)明的實(shí)施例公開了一種在超長數(shù)據(jù)負(fù)載條件下的udp數(shù)據(jù)包分割方法,包括以下步驟:s1:編寫ipproto_fragment函數(shù),根據(jù)發(fā)送的數(shù)據(jù)協(xié)議類型、長度和最大數(shù)據(jù)包長度確定所需以太網(wǎng)幀數(shù)量;s2:編寫ioctl請求,獲取硬件地址;s3:定義數(shù)據(jù)傳輸常量;s4:用ioctl函數(shù)查找接口名,獲取接口mac地址;通過接口名查找接口索引,并存儲在結(jié)構(gòu)體中;s5:指定ipv4源地址、ipv6源地址、目標(biāo)ipv4地址,并獲取目的url或者ipv6地址;s6:將ipv6數(shù)據(jù)包分段并增加分段擴(kuò)展報頭,并在每段放置ipv4報頭;s7:設(shè)置不分段頭標(biāo)和分段頭標(biāo);s8:在緩沖陣列中構(gòu)建分段內(nèi)容;s9:填充分段擴(kuò)展報頭和相應(yīng)數(shù)據(jù)段,并復(fù)制到以太網(wǎng)幀;s10:發(fā)送以太網(wǎng)幀到套接字;s11:接收端從套接字接收,計(jì)算以太網(wǎng)校驗(yàn)和;s12:建立ipv6udp偽包頭,調(diào)用校驗(yàn)函數(shù)進(jìn)行校驗(yàn);s13:對接收數(shù)據(jù)按照分段包頭進(jìn)行組裝。
進(jìn)一步地,使用siocgifhwaddr函數(shù)獲取所述硬件地址。
進(jìn)一步地,所述數(shù)據(jù)傳輸常量包括以太網(wǎng)幀頭長度、ipv4報頭長度、ipv6報頭長度、udp報頭長度、ipv6分段長度和最大分段數(shù)。
進(jìn)一步地,調(diào)用getaddrinfo函數(shù)獲取所述目的url或者ipv6地址。
進(jìn)一步地,pv6數(shù)據(jù)包分段長度為1280字節(jié)。
根據(jù)本發(fā)明實(shí)施例的在超長數(shù)據(jù)負(fù)載條件下的udp數(shù)據(jù)包分割方法,用于鏈路層超長ipv6udp數(shù)據(jù)包(大于1280字節(jié),rfc4213中3.2.1節(jié)規(guī)定的最大傳輸單元),使用雙向算法映射和計(jì)算互聯(lián)網(wǎng)校驗(yàn)(rfc1071),但并不排除沖突。
為此,本發(fā)明的另一個目的在于提出一種向特定mac地址發(fā)送“cooked”udp數(shù)據(jù)包的方法。
為了實(shí)現(xiàn)上述目的,本發(fā)明的實(shí)施例公開了一種向特定mac地址發(fā)送“cooked”udp數(shù)據(jù)包的方法,
進(jìn)一步地,包括以下步驟:a:定義ip_maxpacket,發(fā)起ioctl請求;b:定義ipv6報頭長度和udp報頭長度;c:為不同陣列分配存儲空間;d:獲得發(fā)送包接口,并為套接字描述接口發(fā)送查找請求;e:用ioctl函數(shù)查找接口名,獲得mac地址;f:通過接口名查找接口索引,并存儲在結(jié)構(gòu)體中;g:指定所述接收方的mac地址和ipv6源地址,并獲取所述接收方的url或ipv6地址;h:填充sockaddr_ll.udp數(shù)據(jù);i:將所述sockaddr_ll.udp數(shù)據(jù)發(fā)送到套接字;j:所述接收方從套接字接收,并計(jì)算接口檢驗(yàn)和;k:相鄰兩字節(jié)重復(fù)求和,直到?jīng)]有或僅剩1個字節(jié)為止;l:建立ipv6udp偽包頭,調(diào)用校驗(yàn)函數(shù)進(jìn)行校驗(yàn)。
進(jìn)一步地,調(diào)用getaddrinfo函數(shù)獲取所述接收方的url或ipv6地址。
進(jìn)一步地,所述sockaddr_ll.udp數(shù)據(jù)包括ipv6版本號,流量等級和流標(biāo)簽。
根據(jù)本發(fā)明實(shí)施例的向特定mac地址發(fā)送“cooked”udp數(shù)據(jù)包的方法,通過構(gòu)建ipv6udp偽包頭實(shí)現(xiàn)網(wǎng)絡(luò)協(xié)議兼容,并調(diào)用校驗(yàn)和函數(shù)(rfc2460的8.1節(jié))進(jìn)行校驗(yàn)。
本發(fā)明的附加方面和優(yōu)點(diǎn)將在下面的描述中部分給出,部分將從下面的描述中變得明顯,或通過本發(fā)明的實(shí)踐了解到。
附圖說明
本發(fā)明的上述和/或附加的方面和優(yōu)點(diǎn)從結(jié)合下面附圖對實(shí)施例的描述中將變得明顯和容易理解,其中:
圖1是本發(fā)明實(shí)施例的在超長數(shù)據(jù)負(fù)載條件下的udp數(shù)據(jù)包分割方法的流程圖;
圖2是本發(fā)明實(shí)施例的向特定mac地址發(fā)送cooked的udp數(shù)據(jù)包的方法的流程圖。
具體實(shí)施方式
下面詳細(xì)描述本發(fā)明的實(shí)施例,所述實(shí)施例的示例在附圖中示出,其中自始至終相同或類似的標(biāo)號表示相同或類似的元件或具有相同或類似功能的元件。下面通過參考附圖描述的實(shí)施例是示例性的,僅用于解釋本發(fā)明,而不能理解為對本發(fā)明的限制。
參照下面的描述和附圖,將清楚本發(fā)明的實(shí)施例的這些和其他方面。在這些描述和附圖中,具體公開了本發(fā)明的實(shí)施例中的一些特定實(shí)施方式,來表示實(shí)施本發(fā)明的實(shí)施例的原理的一些方式,但是應(yīng)當(dāng)理解,本發(fā)明的實(shí)施例的范圍不受此限制。相反,本發(fā)明的實(shí)施例包括落入所附加權(quán)利要求書的精神和內(nèi)涵范圍內(nèi)的所有變化、修改和等同物。
以下結(jié)合附圖描述本發(fā)明。
圖1是本發(fā)明實(shí)施例的在超長數(shù)據(jù)負(fù)載條件下的udp數(shù)據(jù)包分割方法的流程圖。如圖1所示,根據(jù)本發(fā)明實(shí)施例的在超長數(shù)據(jù)負(fù)載條件下的udp數(shù)據(jù)包分割方法,包括以下步驟:
s1:編寫ipproto_fragment函數(shù),根據(jù)發(fā)送的數(shù)據(jù)協(xié)議類型、長度和最大數(shù)據(jù)包長度確定所需以太網(wǎng)幀數(shù)量。
其中,inet_addrstrlen//ipv4協(xié)議數(shù)據(jù)
inet6_addrstrlen//ipv6協(xié)議數(shù)據(jù)
ip_maxpacket//最大數(shù)據(jù)包長度,設(shè)為65535字節(jié)
s2:編寫ioctl請求,獲取硬件地址。
在本發(fā)明的一個實(shí)施例中,使用siocgifhwaddr函數(shù)獲取硬件地址。
s3:定義數(shù)據(jù)傳輸常量。
在本發(fā)明的一個實(shí)施例中,數(shù)據(jù)傳輸常量包括:
自定義函數(shù)聲明。
s4:用ioctl函數(shù)查找接口名,獲取接口mac地址;通過接口名查找接口索引,并存儲在結(jié)構(gòu)體中。
s5:指定ipv4源地址、ipv6源地址、目標(biāo)ipv4地址(作為6to4的任意播(anycast)地址,該地址不改變),并獲取目的url或者ipv6地址。在本發(fā)明的一個實(shí)施例中,調(diào)用getaddrinfo函數(shù)獲取目的url或者ipv6地址。
s6:將ipv6數(shù)據(jù)包分段并增加分段擴(kuò)展報頭,并在每段放置ipv4報頭(按照6to4配置合理設(shè)置),此時數(shù)據(jù)負(fù)載長度為1280-ip4_hdrlen-ip6_hdrlen-frg_hdrlen。
s7:設(shè)置不分段頭標(biāo)和分段頭標(biāo)。其中,設(shè)置下一個頭標(biāo)(8bits):不分段為17(udp在ip報文的協(xié)議號是17);分段為44,否則icmp校驗(yàn)和會出錯。
s8:在緩沖陣列中構(gòu)建分段內(nèi)容。
s9:填充分段擴(kuò)展報頭和相應(yīng)數(shù)據(jù)段,并復(fù)制到以太網(wǎng)幀,此時以太網(wǎng)幀長度=幀頭(mac+mac+以太網(wǎng)類型)+數(shù)據(jù)(ipv4報頭+ipv6報頭+分段報頭+分段數(shù)據(jù))。
s10:發(fā)送以太網(wǎng)幀到套接字。
s11:接收端從套接字接收,計(jì)算以太網(wǎng)校驗(yàn)和(參見rfc1071),不排除沖突。
s12:建立ipv6udp偽包頭,調(diào)用校驗(yàn)函數(shù)進(jìn)行校驗(yàn)參見rfc2460第8.1節(jié));
s13:對接收數(shù)據(jù)按照分段包頭進(jìn)行組裝。
根據(jù)本發(fā)明實(shí)施例的在超長數(shù)據(jù)負(fù)載條件下的udp數(shù)據(jù)包分割方法,用于鏈路層超長ipv6udp數(shù)據(jù)包(大于1280字節(jié),rfc4213中3.2.1節(jié)規(guī)定的最大傳輸單元),使用雙向算法映射和計(jì)算互聯(lián)網(wǎng)校驗(yàn)(rfc1071),但并不排除沖突。
圖2是本發(fā)明實(shí)施例的向特定mac地址發(fā)送cooked的udp數(shù)據(jù)包的方法的流程圖。如圖2所示,根據(jù)本發(fā)明實(shí)施例的向特定mac地址發(fā)送“cooked”udp數(shù)據(jù)包的方法,包括以下步驟:
a:定義ip_maxpacket(為65535),發(fā)起ioctl請求(使用siocgifhwaddr獲取mac地址)。
b:定義ipv6報頭長度和udp報頭長度。其中,
#defineip6_hdrlen40//ipv6報頭長度
#defineudp_hdrlen8//udp報頭長度,不包括數(shù)據(jù)。
自定義函數(shù)聲明。
c:為不同陣列分配存儲空間。
d:獲得發(fā)送包接口,并為套接字描述接口發(fā)送查找請求。
e:用ioctl函數(shù)查找接口名,獲得mac地址;
f:通過接口名查找接口索引,并存儲在結(jié)構(gòu)體中;
g:指定接收方的mac地址和ipv6源地址,并獲取接收方的url或ipv6地址。在本發(fā)明的一個實(shí)施例中,調(diào)用getaddrinfo函數(shù)獲取接收方的url或ipv6地址。
h:填充sockaddr_ll.udp數(shù)據(jù)。在本發(fā)明的一個實(shí)施例中,sockaddr_ll.udp數(shù)據(jù)包括ipv6版本號(4位),流量等級(8位)和流標(biāo)簽(20位)。
i:將sockaddr_ll.udp數(shù)據(jù)發(fā)送到套接字。
j:接收方從套接字接收,并計(jì)算接口檢驗(yàn)和(參考rfc1071),此處的校驗(yàn)并不能排除沖突。
k:相鄰兩字節(jié)重復(fù)求和,直到?jīng)]有或僅剩1個字節(jié)為止;
l:建立ipv6udp偽包頭,調(diào)用校驗(yàn)函數(shù)進(jìn)行校驗(yàn)(參考rfc2460第8.1節(jié))。
本發(fā)明實(shí)施例的向特定mac地址發(fā)送“cooked”udp數(shù)據(jù)包的方法,通過構(gòu)建ipv6udp偽包頭實(shí)現(xiàn)網(wǎng)絡(luò)協(xié)議兼容,并調(diào)用校驗(yàn)和函數(shù)(rfc2460的8.1節(jié))進(jìn)行校驗(yàn)。
經(jīng)過測試,本發(fā)明實(shí)施例的在超長數(shù)據(jù)負(fù)載條件下的udp數(shù)據(jù)包分割方法和向特定mac地址發(fā)送“cooked”udp數(shù)據(jù)包的方法,均可與基于ipv6的物聯(lián)網(wǎng),內(nèi)容中心網(wǎng)絡(luò)(ccn),以及信息中心網(wǎng)絡(luò)(icn)很好地兼容。
另外,本發(fā)明實(shí)施例的udp數(shù)據(jù)包的分割方法和發(fā)送方法的其它構(gòu)成以及作用對于本領(lǐng)域的技術(shù)人員而言都是已知的,為了減少冗余,不做贅述。
在本說明書的描述中,參考術(shù)語“一個實(shí)施例”、“一些實(shí)施例”、“示例”、“具體示例”、或“一些示例”等的描述意指結(jié)合該實(shí)施例或示例描述的具體特征、結(jié)構(gòu)、材料或者特點(diǎn)包含于本發(fā)明的至少一個實(shí)施例或示例中。在本說明書中,對上述術(shù)語的示意性表述不一定指的是相同的實(shí)施例或示例。而且,描述的具體特征、結(jié)構(gòu)、材料或者特點(diǎn)可以在任何的一個或多個實(shí)施例或示例中以合適的方式結(jié)合。
盡管已經(jīng)示出和描述了本發(fā)明的實(shí)施例,本領(lǐng)域的普通技術(shù)人員可以理解:在不脫離本發(fā)明的原理和宗旨的情況下可以對這些實(shí)施例進(jìn)行多種變化、修改、替換和變型,本發(fā)明的范圍由權(quán)利要求及其等同限定。