91715部隊 楊成理湛江705廠 歐獻輝91715部隊 楊水清
?
某型干擾系統(tǒng)網(wǎng)絡(luò)故障的分析與解決方法
91715部隊 楊成理
湛江705廠 歐獻輝
91715部隊 楊水清
【摘要】本文介紹了VxWorks系統(tǒng)下TCP/IP協(xié)議的實現(xiàn)方式,通過對Socket屬性的分析,解決了網(wǎng)絡(luò)連接判斷的不準(zhǔn)確性和由此導(dǎo)致的網(wǎng)絡(luò)任務(wù)阻塞。
【關(guān)鍵詞】網(wǎng)絡(luò)故障;VxWorks;TCP/IP協(xié)議;Socket
某型干擾系統(tǒng)體系龐大、配套復(fù)雜,各組件之間的協(xié)同主要依賴通信控制器進行集中組織。在實際使用過程中,偶爾出現(xiàn)通信控制器顯示與其他組件之間的通信連接狀態(tài)正常但卻無法進行數(shù)據(jù)傳輸?shù)墓收?,甚至在某組件關(guān)機后的很長一段時間內(nèi)在通信控制器上顯示其通信連接狀態(tài)正常。該通信控制器的網(wǎng)絡(luò)控制軟件基于VxWorks操作系統(tǒng)開發(fā),使用TCP/IP協(xié)議進行網(wǎng)絡(luò)數(shù)據(jù)交換。本文通過剖析TCP/IP協(xié)議重要接口Socket套接字在VxWorks操作系統(tǒng)中的具體配置方法,來解決該干擾系統(tǒng)無法及時更新TCP連接狀態(tài)以及因網(wǎng)絡(luò)非正常中斷等原因?qū)е戮W(wǎng)絡(luò)任務(wù)阻塞而引起的故障。
1.1TCP/IP協(xié)議簡介
TCP/IP協(xié)議最早由麻省理工大學(xué)和一些商業(yè)組織為美國國防部開發(fā),并在Internet的前身即ARPANET上得到初次實現(xiàn)。TCP/IP協(xié)議是由一組在不同層次上實現(xiàn)的多個協(xié)議形成的組合,通常分為鏈路層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層等層次,在TCP/IP網(wǎng)絡(luò)協(xié)議得以具體實現(xiàn)的各個環(huán)節(jié)上發(fā)揮著不同的作用。雖然犧牲了網(wǎng)絡(luò)傳輸?shù)乃俣群托?,但因TCP/IP協(xié)議同時滿足可擴展性強、可靠性高及分布式實現(xiàn)等突出特點,已成為實際上的“全球互聯(lián)”基礎(chǔ)性協(xié)議。作為頂層協(xié)議,TCP/IP協(xié)議并沒有具體規(guī)定應(yīng)用程序和協(xié)議軟件的接口細(xì)節(jié)[1],而采用與操作系統(tǒng)無關(guān)的Socket套接字來具體實現(xiàn),后者在VxWorks操作系統(tǒng)中被廣泛使用。
1.2VxWorks操作系統(tǒng)
VxWorks 操作系統(tǒng)是美國風(fēng)河公司(WindRiver)在1983年開發(fā)的一種嵌入式實時操作系統(tǒng),因其可靠性高和實時性強等突出特點被廣泛地應(yīng)用在通信、軍事、航空、航天等高精尖技術(shù)及對實時性要求極高的領(lǐng)域中,如衛(wèi)星通訊、彈道制導(dǎo)、飛機導(dǎo)航等。VxWorks操作系統(tǒng)提供了完善的配套機制來實現(xiàn)對TCP/IP協(xié)議的”透明”訪問,包括Socket套接字、遠(yuǎn)程過程調(diào)用(RPC)、簡單網(wǎng)絡(luò)管理協(xié)議(SNMP)、網(wǎng)絡(luò)文件系統(tǒng)(NFS)、遠(yuǎn)程Shell執(zhí)行(RSH)、文件傳輸協(xié)議(FTP或TFTP)、引導(dǎo)程序協(xié)議(BOOTP) 和動態(tài)主機配置協(xié)議(DHCP)等。無論是松耦合的串行線路、緊耦合的利用共享內(nèi)存的背板總線或標(biāo)準(zhǔn)的廣域網(wǎng)連接,VxWorks操作系統(tǒng)的網(wǎng)絡(luò)機制都遵循標(biāo)準(zhǔn)的Internet 協(xié)議。
1.3Socket套接字
隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,TCP/IP協(xié)議被集成到操作系統(tǒng)內(nèi)核中,并用Socket套接字來提供一個標(biāo)準(zhǔn)的通信端口。通過這個端口,一臺計算機能與任何一臺具有Socket端口的計算機進行通信。Socket套接字記錄了通信雙方進行交互必需的所有信息,其建立在TCP和UDP協(xié)議之上,一旦創(chuàng)建了Socket實例,該套接字就會一直存在,直到該TCP連接被關(guān)閉。
作為常用的通信方式,在客戶端和服務(wù)器端通信時,應(yīng)用程序均會使用一個預(yù)先規(guī)定的事件序列來完成整個通信過程。首先,客戶端和服務(wù)器端均要創(chuàng)建一個Socket套接字。接著,服務(wù)器端調(diào)用bind()函數(shù)給Socket套接字分配一個預(yù)先約定的端口,客戶端和服務(wù)器端均能使用sendto()和recvfrom()函數(shù)來發(fā)送和接收數(shù)據(jù)包直至完成傳遞。最后,客戶端和服務(wù)器端均調(diào)用closesocket()函數(shù)來關(guān)閉套接字,從而完成整個通信流程。
上述函數(shù)的原型描述如下:
(1)創(chuàng)建套接字
SOCKET PASCAL FAR socket(int af, int type, int protocol);
參數(shù):af指定通信發(fā)生的區(qū)域;type描述套接字類型;protocol說明套接字使用的協(xié)議。
(2)綁定本地地址
INT PASCAL FAR bind(SOCKET s, const struct sockaddr FAR * name, int len);
參數(shù):s是由socket()函數(shù)創(chuàng)建且未進行連接的套接字句柄;name指套接字s的本地名稱;len為name的長度。
(3)建立連接
建立套接字連接需要使用connect()和accept()函數(shù),前者用于建立連接,但此時并無實際的數(shù)據(jù)包交換;后者用于等待某客戶進程的實際連接。上述四個函數(shù)可以完成一個完全五元通信(協(xié)議、本機地址和端口號、目的地址和端口號)相關(guān)的設(shè)置。
(4)數(shù)據(jù)傳輸
當(dāng)一個基于TCP/IP協(xié)議的連接建立之后,可以使用send()和recv()函數(shù)發(fā)送與接收數(shù)據(jù)。
INT PASCAL FAR send(SOCKET s, const char FAR *buf1, int len, int flags1);
INT PASCAL FAR recv(SOCKET s, const char FAR *buf2, int len, int flags2);
參數(shù):s表示Socket套接字實例;buf1表示發(fā)送緩沖區(qū),buf2表示接收緩沖區(qū);len表示緩沖區(qū)長度;flags1指定傳輸控制方式如是否發(fā)送帶外數(shù)據(jù),flags2用于指定傳輸控制方式如是否接收帶外數(shù)據(jù)。
1.4設(shè)置Socket套接字選項
通過上述程序設(shè)置的Socket套接字無法定義用于控制Socket套接字及TCP協(xié)議的具體細(xì)節(jié)。VxWorks操作系統(tǒng)提供setsockopt()函數(shù)來進行設(shè)置,其定義如下[2]:
STATUS setsockopt( int s, int protocol, int optionname, char * optionval, int optionlen );
參數(shù):s表示Socket套接字實例;protocol表示協(xié)議標(biāo)準(zhǔn),可選IPPROTO_TCP,IPPROTO_IP或SOL_SOCKET;optionval表示需設(shè)置選項值的地址;optionlen表示需設(shè)置選項值的長度;
optionname表示需設(shè)置的選項,常用的選項如下表所示:
TCP連接建立后,若連接的任何一方因某種原因?qū)е逻B接中斷,TCP必須能夠自動檢測到網(wǎng)絡(luò)中斷并釋放該連接。如果連接已建立,該定時器在無數(shù)據(jù)傳輸時間達(dá)到TCPTV_KEEP_IDLE時啟動,TCP將發(fā)送一個數(shù)據(jù)長度為0的連接狀態(tài)詢問報文,若連接正常,則系統(tǒng)能收到應(yīng)答信號,否則TCP將每隔TCPTV_KEEPINTVL時間間隔且最多發(fā)送TCPTV_KEEPCNT次連接狀態(tài)詢問報文,若仍沒接收到應(yīng)答信號,TCP將自動釋放該連接,與該連接相關(guān)的所有資源都將被釋放,所有阻塞在該連接上的讀寫任務(wù)都將立即被解除[3]。
通過對VxWorks操作系統(tǒng)下TCP協(xié)議的分析,引發(fā)該干擾系統(tǒng)網(wǎng)絡(luò)故障的主要原因可能是當(dāng)TCP連接的某一方離線時,其連接狀態(tài)無法及時得到更新并廣播給網(wǎng)絡(luò)內(nèi)與其相連的其他終端設(shè)備,后續(xù)的TCP數(shù)據(jù)包不斷堆積造成在TCP連接建立時所申請的緩沖區(qū)溢出,導(dǎo)致控制軟件無法響應(yīng)其他周邊設(shè)備的TCP連接請求而形成網(wǎng)絡(luò)任務(wù)阻塞。
分析某型干擾系統(tǒng)控制軟件的源代碼,在
tcp_keepidle = 120*60;
tcp_keepintvl = 75;
tcp_maxidle = 8;
由上述代碼可見,TCP連接建立后,控制軟件在無數(shù)據(jù)傳輸時間達(dá)到120*60秒即2小時后TCP將發(fā)送一個數(shù)據(jù)長度為0的連接狀態(tài)詢問報文,若連接正常,則系統(tǒng)能收到應(yīng)答信號,否則TCP將每隔75秒且最多發(fā)送8次連接狀態(tài)詢問報文,若仍沒接收到應(yīng)答信號,TCP將自動釋放該連接,在釋放之前均默認(rèn)為TCP連接正常,控制軟件不斷發(fā)送數(shù)據(jù)至發(fā)送緩沖區(qū),導(dǎo)致緩沖區(qū)數(shù)據(jù)不斷增加直到緩沖區(qū)溢出,其他網(wǎng)絡(luò)任務(wù)被阻塞而導(dǎo)致該干擾系統(tǒng)出現(xiàn)網(wǎng)絡(luò)故障。
通過上述分析,建立TCP連接時所需tcp_keepidle、tcp_keepintvl、tcp_maxidle等參數(shù)與后續(xù)連接過程中連接狀態(tài)的及時更新息息相關(guān),能有效預(yù)防緩沖區(qū)溢出、網(wǎng)絡(luò)任務(wù)阻塞等故障的出現(xiàn),可通過setsockopt()函數(shù)或者在Socket套接字的其他初始化函數(shù)中對上述參數(shù)進行更改。
針對某型干擾系統(tǒng)網(wǎng)絡(luò)故障出現(xiàn)的部位,在VxWorks操作系統(tǒng)下修改控制軟件的源代碼,在初始化Socket套接字時增加對如下代碼:
重新編譯后通電測試,在網(wǎng)絡(luò)非正常中斷大約100s后,系統(tǒng)檢測到該網(wǎng)絡(luò)中斷并實時更新網(wǎng)絡(luò)狀態(tài)為連接斷開,系統(tǒng)與其余網(wǎng)絡(luò)的通信在網(wǎng)絡(luò)阻塞了大約60s左右后恢復(fù)正常,該干擾系統(tǒng)的網(wǎng)絡(luò)故障排除。
該文通過在VxWorks操作系統(tǒng)中修改Socket套接字的相關(guān)選項,解決了某型干擾系統(tǒng)在實際應(yīng)用中無法及時更新TCP連接狀態(tài)以及因網(wǎng)絡(luò)非正常中斷等導(dǎo)致網(wǎng)絡(luò)任務(wù)阻塞的故障,極大地提高了系統(tǒng)的可靠性。
參考文獻
[1]Ed Taylor編著,王虎,鄧宏濤,劉志剛等譯.TCP/IP使用詳解[M].機械工業(yè)出版社,1999.
[2]李方敏編著.VxWorks高級程序設(shè)計[M].清華大學(xué)出版社,2004.
[3]高飛,高平編著.計算機網(wǎng)絡(luò)和網(wǎng)絡(luò)安全基礎(chǔ)[M].北京理工大學(xué)出版社,2002.