付曉強(qiáng), 方旭明, 祝建建
(西南交通大學(xué) 信息編碼與傳輸省重點(diǎn)實(shí)驗(yàn)室,四川 成都 610031)
IP網(wǎng)絡(luò)的發(fā)展使通過信令網(wǎng)關(guān)在IP網(wǎng)絡(luò)中組建IP信令網(wǎng)成為可能,七號(hào)信令系統(tǒng)仍將繼續(xù)在IP信令網(wǎng)中發(fā)揮重要作用。IETF的信令傳輸工作組(SIGTRAN)為了在IP網(wǎng)絡(luò)上傳輸 NO.7信令而制定了流控制傳輸協(xié)議(SCTP: RFC 4960[1]),用于IP網(wǎng)絡(luò)中承載PSTN信令。
SCTP最突出的特點(diǎn)就是多宿主特性,它具有單個(gè)SCTP站點(diǎn)支持多個(gè)IP地址的能力。多宿主性的優(yōu)點(diǎn)就是當(dāng)發(fā)生網(wǎng)絡(luò)故障時(shí),連接的可靠性能夠得到更大的保障[2]。在異構(gòu)移動(dòng)網(wǎng)絡(luò)融合的應(yīng)用中,SCTP也可以利用其支持的多宿主性來提供傳輸層的解決方案。除此之外,SCTP還具有多流并發(fā),4次握手建立連接,平滑關(guān)閉等特性。
在進(jìn)一步推廣應(yīng)用SCTP的過程中,現(xiàn)有的IP網(wǎng)絡(luò)中普遍存在的網(wǎng)絡(luò)地址轉(zhuǎn)換[3]設(shè)備無法兼容SCTP報(bào)文的轉(zhuǎn)發(fā),使得一些可以應(yīng)用SCTP協(xié)議各類特性的場景不得不與其失之交臂,限制了SCTP協(xié)議的推廣。現(xiàn)有的IPv4網(wǎng)絡(luò)在今后很長一段時(shí)間內(nèi)仍將是主流的組網(wǎng)形式,占據(jù)大多數(shù)的網(wǎng)絡(luò)應(yīng)用場景,現(xiàn)有商用的 NAT設(shè)備也將大規(guī)模存在,這都將滯后SCTP協(xié)議在網(wǎng)絡(luò)通信領(lǐng)域的發(fā)展應(yīng)用。
針對NAT對SCTP產(chǎn)生限制的兩個(gè)具體問題,分別提出了新的解決方案。
在同一個(gè)私有局域網(wǎng)中,收發(fā)端應(yīng)用層程序使用SCTP作為傳輸層協(xié)議進(jìn)行通信時(shí)能夠成功傳輸,然而,當(dāng)客戶端和服務(wù)端分布在不同層級(jí)的兩個(gè)網(wǎng)絡(luò)中,并且它們的通信需要穿越NAT設(shè)備時(shí),客戶端無法建立起到服務(wù)器端的連接。通過抓包分析,發(fā)現(xiàn)服務(wù)器端無法收到客戶端的發(fā)送請求(INIT報(bào)文)。
根據(jù)以上現(xiàn)象描述,分析得知報(bào)文在穿越NAT設(shè)備時(shí)丟失。NAT設(shè)備為了完成完整的內(nèi)網(wǎng)和外網(wǎng)地址轉(zhuǎn)換功能,必須對傳輸層協(xié)議的端口號(hào)進(jìn)行轉(zhuǎn)換。而現(xiàn)有IPv4網(wǎng)絡(luò)中的大多數(shù) NAT設(shè)備對傳輸層協(xié)議的支持僅限于傳輸控制協(xié)議(TCP)和用戶數(shù)據(jù)報(bào)協(xié)議(UDP),不支持流控制傳輸協(xié)議SCTP。這導(dǎo)致現(xiàn)有商用的NAT設(shè)備收到SCTP報(bào)文后無法對其進(jìn)行內(nèi)網(wǎng)與外網(wǎng)地址間的映射,而直接丟棄,造成了SCTP無法在含有NAT設(shè)備的現(xiàn)有IP網(wǎng)絡(luò)中使用。
利用 NAT對用戶數(shù)據(jù)報(bào)協(xié)議報(bào)文的既有支持,將需要發(fā)送的SCTP報(bào)文偽裝成UDP報(bào)文,騙過NAT設(shè)備繼續(xù)向前傳遞,直至到達(dá)接收端,對報(bào)文進(jìn)行還原后再進(jìn)入 SCTP報(bào)文處理流程。該方法具體實(shí)施過程如下。
在使用SCTP協(xié)議的終端的網(wǎng)絡(luò)協(xié)議棧中部署UDP封裝/解封裝層。該層位于SCTP協(xié)議層和網(wǎng)際協(xié)議IP層之間,主要工作是在 SCTP報(bào)文前包裹一層UDP隧道頭,偽裝成UDP包,利用NAT對UDP報(bào)文原生的支持來克服NAT對SCTP協(xié)議的不兼容性。UDP隧道頭的主要包含:一個(gè)標(biāo)準(zhǔn)的UDP頭,以及一個(gè)UDP隧道頭的標(biāo)識(shí)符號(hào),用以標(biāo)明此報(bào)文為包含著 SCTP內(nèi)容的UDP隧道報(bào)文,用以與標(biāo)準(zhǔn)的UDP報(bào)文相區(qū)分。
該流程包括了發(fā)送端和接收端對報(bào)文進(jìn)行UDP隧道頭的處理的流程。
該流程包括如下步驟:
①發(fā)送端的UDP封裝層收到傳輸層發(fā)來的SCTP報(bào)文后,在SCTP報(bào)文頭前插入U(xiǎn)DP隧道頭,它的目標(biāo)端口域和本地端口域取自于原SCTP報(bào)文中的目標(biāo)端口域和本地端口域;
②發(fā)送端的 IP層將此報(bào)文看作標(biāo)準(zhǔn)的 UDP報(bào)文進(jìn)行處理;
③接收端收到NAT發(fā)送過來的UDP報(bào)文后,根據(jù)UDP隧道頭的標(biāo)識(shí)符號(hào)判斷此報(bào)文是標(biāo)準(zhǔn) UDP報(bào)文還是包裹著UDP隧道頭的SCTP報(bào)文;
④若是UDP隧道報(bào)文,則將報(bào)文送入U(xiǎn)DP解封裝層,該層提取UDP隧道頭中的目的端口域和本地端口域的信息,分別填充到標(biāo)準(zhǔn)SCTP頭中的對應(yīng)域中,UDP隧道頭將會(huì)被刪掉,還原成標(biāo)準(zhǔn)的SCTP報(bào)文。若是標(biāo)準(zhǔn)的UDP報(bào)文,則送入標(biāo)準(zhǔn)的 UDP協(xié)議棧進(jìn)行處理。提出的內(nèi)容不影響標(biāo)準(zhǔn)TCP/IP協(xié)議棧的工作流程。
實(shí)驗(yàn)環(huán)境采用Ubuntu 9.10 Linux系統(tǒng),內(nèi)核版本是2.6.30,內(nèi)核中應(yīng)用了LKSCTP工作組的SCTP模塊。這里所做的改進(jìn)都是基于LKSCTP開源代碼以及內(nèi)核中TCP/IP協(xié)議棧的。
通過Wireshark軟件對網(wǎng)絡(luò)中的流量進(jìn)行抓包分析,UDP封裝層修改后的連接初始化(INIT)報(bào)文從一個(gè)私有地址發(fā)出,經(jīng) NAT轉(zhuǎn)換后到達(dá)外網(wǎng),并可以在內(nèi)網(wǎng)中正常地接收到回復(fù)(INIT_ACK),表明經(jīng)修改的報(bào)文可以成功穿越NAT。另外,在多層次 NAT級(jí)聯(lián)的網(wǎng)絡(luò)環(huán)境進(jìn)行的實(shí)驗(yàn)中,成功驗(yàn)證本方案可以實(shí)現(xiàn)多層NAT的連續(xù)穿越。
在絕大多數(shù)多路徑場景中,通信的兩端之間的各路徑上都會(huì)分別遇到各自的NAT網(wǎng)關(guān),此時(shí)不同NAT網(wǎng)關(guān)內(nèi)的地址將分別被映射到不同的端口,而對于同一個(gè)關(guān)聯(lián),對端只認(rèn)同一個(gè)端口號(hào),這就造成另一條路徑會(huì)被放棄,如圖1所示。
主機(jī)1與主機(jī)2之間先通過路徑1建立連接,NAT網(wǎng)關(guān)1完成了192.168.150.136:5687與12.10.12.100:10372之間的地址轉(zhuǎn)換映射。在另一路徑中,同一個(gè)端口號(hào)5687在NAT網(wǎng)關(guān)2的轉(zhuǎn)換后就映射成了不同的端口21983。而在現(xiàn)有的NAT網(wǎng)絡(luò)中,主機(jī)1所無法左右自己內(nèi)網(wǎng)的端口號(hào)將被路徑上的NAT映射成什么端口號(hào),這導(dǎo)致了主機(jī)2將拋棄來自它所不認(rèn)識(shí)的端口號(hào)的報(bào)文。此例中,主機(jī)1和主機(jī)2只能通過先建立的路徑1通信,之后來自路徑2的報(bào)文將被視為不可識(shí)別的報(bào)文而被丟棄。

圖1 多路徑場景下網(wǎng)絡(luò)地址轉(zhuǎn)換穿越
端口號(hào)的本意是唯一地標(biāo)識(shí)某網(wǎng)絡(luò)地址上某應(yīng)用。但是自從有了 NAT網(wǎng)關(guān)的出現(xiàn),端口號(hào)不僅僅表達(dá)著應(yīng)用服務(wù)的標(biāo)識(shí),而且可以作為從外網(wǎng)到達(dá) NAT設(shè)備的報(bào)文將被投遞哪個(gè)主機(jī)的路由依據(jù),如上例中,當(dāng)主機(jī) 2發(fā)送報(bào)文到NAT1網(wǎng)關(guān)的10372端口時(shí),NAT1查找緩沖區(qū)內(nèi)的端口映射表:主機(jī)192.168.3.100的5687端口<->12.10.12.98的10372端口,然后將此報(bào)文投遞到主機(jī)192.168.3.100的5687端口上去。“應(yīng)用標(biāo)識(shí)”和“投遞依據(jù)”這兩個(gè)功能缺一不可。
根據(jù)以上分析,為每個(gè)數(shù)據(jù)報(bào)文保持兩個(gè)邏輯上的端口號(hào),“NAT投遞端口”和“應(yīng)用標(biāo)識(shí)端口”。“NAT投遞端口”就是標(biāo)準(zhǔn)報(bào)文中所應(yīng)用到的端口號(hào),它在報(bào)文的頭中,并且可能隨著路徑不同而映射成不一樣的結(jié)果。最終呈現(xiàn)在接收端的源網(wǎng)絡(luò)地址與發(fā)送端的網(wǎng)絡(luò)地址存在唯一的映射。發(fā)送端應(yīng)該將這個(gè)“投遞端口”與源 IP地址共同記錄下來作為這個(gè)報(bào)文的源地址。這樣才能保證接收者的地址列表里存放可達(dá)的對端地址。
“應(yīng)用標(biāo)識(shí)端口”是為了標(biāo)識(shí)當(dāng)前應(yīng)用層關(guān)聯(lián)的,所以與“投遞端口”不同,它不隨著路徑的改變而變化。在報(bào)文接收函數(shù)的端口驗(yàn)證功能中,為檢驗(yàn)出一個(gè)正確的關(guān)聯(lián),應(yīng)該對“應(yīng)用標(biāo)識(shí)端口”進(jìn)行驗(yàn)證,而不是標(biāo)準(zhǔn)報(bào)文頭中的端口字段。由于原有的SCTP協(xié)議中沒有這個(gè)“標(biāo)識(shí)端口”的概念,所以在報(bào)文的頭部要存放“標(biāo)識(shí)端口”只能借助其他的字段。
通過在Linux下的代碼實(shí)現(xiàn),可以克服這個(gè)NAT的阻斷限制,在多路徑都存在NAT的場景下,實(shí)現(xiàn)SCTP連接建立和路徑切換。
從收發(fā)端的抓包分析可以看出數(shù)據(jù)流的收發(fā),路徑添加以及主路徑變換的流程。兩條路徑中的 NAT都對報(bào)文分別進(jìn)行了地址映射,并且接收端可以先后接受兩條路徑上的數(shù)據(jù),不會(huì)因端口不同而丟棄新路徑上的數(shù)據(jù),克服了3.1節(jié)描述的多路徑NAT映射不一致的問題。
關(guān)注于解決 SCTP在當(dāng)前的 IPv4網(wǎng)絡(luò)實(shí)施中所遇到的NAT阻斷問題。從修改收發(fā)端的SCTP協(xié)議的部分功能出發(fā),針對NAT對SCTP報(bào)文阻斷的兩個(gè)問題提出了解決方案。這兩個(gè)方案不需要對IPv4網(wǎng)絡(luò)中的NAT設(shè)備做任何修改就可以實(shí)現(xiàn)SCTP報(bào)文的NAT穿越,能夠幫助SCTP更快地實(shí)現(xiàn)在當(dāng)前網(wǎng)絡(luò)中的應(yīng)用。這里所提到的解決方案,在未來具備SCTP兼容性的NAT設(shè)備中同樣可以適用。
[1] STEWART R. Stream Control Transmission Protocol[S]. New York:IETF,2007.
[2] 沈伊,夏靖波,周漢勛. SCTP協(xié)議在雷達(dá)情報(bào)傳輸中的應(yīng)用研究[J].通信技術(shù),2008,41(03):5-7
[3] EGEVANG K. The IP Network Address Translator (NAT)[S]. New York:IETF, 1994.