91715部隊 楊成理湛江705廠 歐獻輝91715部隊 楊水清
?
某型干擾系統網絡故障的分析與解決方法
91715部隊 楊成理
湛江705廠 歐獻輝
91715部隊 楊水清
【摘要】本文介紹了VxWorks系統下TCP/IP協議的實現方式,通過對Socket屬性的分析,解決了網絡連接判斷的不準確性和由此導致的網絡任務阻塞。
【關鍵詞】網絡故障;VxWorks;TCP/IP協議;Socket
某型干擾系統體系龐大、配套復雜,各組件之間的協同主要依賴通信控制器進行集中組織。在實際使用過程中,偶爾出現通信控制器顯示與其他組件之間的通信連接狀態正常但卻無法進行數據傳輸的故障,甚至在某組件關機后的很長一段時間內在通信控制器上顯示其通信連接狀態正常。該通信控制器的網絡控制軟件基于VxWorks操作系統開發,使用TCP/IP協議進行網絡數據交換。本文通過剖析TCP/IP協議重要接口Socket套接字在VxWorks操作系統中的具體配置方法,來解決該干擾系統無法及時更新TCP連接狀態以及因網絡非正常中斷等原因導致網絡任務阻塞而引起的故障。
1.1TCP/IP協議簡介
TCP/IP協議最早由麻省理工大學和一些商業組織為美國國防部開發,并在Internet的前身即ARPANET上得到初次實現。TCP/IP協議是由一組在不同層次上實現的多個協議形成的組合,通常分為鏈路層、網絡層、傳輸層和應用層等層次,在TCP/IP網絡協議得以具體實現的各個環節上發揮著不同的作用。雖然犧牲了網絡傳輸的速度和效率,但因TCP/IP協議同時滿足可擴展性強、可靠性高及分布式實現等突出特點,已成為實際上的“全球互聯”基礎性協議。作為頂層協議,TCP/IP協議并沒有具體規定應用程序和協議軟件的接口細節[1],而采用與操作系統無關的Socket套接字來具體實現,后者在VxWorks操作系統中被廣泛使用。
1.2VxWorks操作系統
VxWorks 操作系統是美國風河公司(WindRiver)在1983年開發的一種嵌入式實時操作系統,因其可靠性高和實時性強等突出特點被廣泛地應用在通信、軍事、航空、航天等高精尖技術及對實時性要求極高的領域中,如衛星通訊、彈道制導、飛機導航等。VxWorks操作系統提供了完善的配套機制來實現對TCP/IP協議的”透明”訪問,包括Socket套接字、遠程過程調用(RPC)、簡單網絡管理協議(SNMP)、網絡文件系統(NFS)、遠程Shell執行(RSH)、文件傳輸協議(FTP或TFTP)、引導程序協議(BOOTP) 和動態主機配置協議(DHCP)等。無論是松耦合的串行線路、緊耦合的利用共享內存的背板總線或標準的廣域網連接,VxWorks操作系統的網絡機制都遵循標準的Internet 協議。
1.3Socket套接字
隨著網絡技術的發展,TCP/IP協議被集成到操作系統內核中,并用Socket套接字來提供一個標準的通信端口。通過這個端口,一臺計算機能與任何一臺具有Socket端口的計算機進行通信。Socket套接字記錄了通信雙方進行交互必需的所有信息,其建立在TCP和UDP協議之上,一旦創建了Socket實例,該套接字就會一直存在,直到該TCP連接被關閉。
作為常用的通信方式,在客戶端和服務器端通信時,應用程序均會使用一個預先規定的事件序列來完成整個通信過程。首先,客戶端和服務器端均要創建一個Socket套接字。接著,服務器端調用bind()函數給Socket套接字分配一個預先約定的端口,客戶端和服務器端均能使用sendto()和recvfrom()函數來發送和接收數據包直至完成傳遞。最后,客戶端和服務器端均調用closesocket()函數來關閉套接字,從而完成整個通信流程。
上述函數的原型描述如下:
(1)創建套接字
SOCKET PASCAL FAR socket(int af, int type, int protocol);
參數:af指定通信發生的區域;type描述套接字類型;protocol說明套接字使用的協議。
(2)綁定本地地址
INT PASCAL FAR bind(SOCKET s, const struct sockaddr FAR * name, int len);
參數:s是由socket()函數創建且未進行連接的套接字句柄;name指套接字s的本地名稱;len為name的長度。
(3)建立連接
建立套接字連接需要使用connect()和accept()函數,前者用于建立連接,但此時并無實際的數據包交換;后者用于等待某客戶進程的實際連接。上述四個函數可以完成一個完全五元通信(協議、本機地址和端口號、目的地址和端口號)相關的設置。
(4)數據傳輸
當一個基于TCP/IP協議的連接建立之后,可以使用send()和recv()函數發送與接收數據。
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);
參數:s表示Socket套接字實例;buf1表示發送緩沖區,buf2表示接收緩沖區;len表示緩沖區長度;flags1指定傳輸控制方式如是否發送帶外數據,flags2用于指定傳輸控制方式如是否接收帶外數據。
1.4設置Socket套接字選項
通過上述程序設置的Socket套接字無法定義用于控制Socket套接字及TCP協議的具體細節。VxWorks操作系統提供setsockopt()函數來進行設置,其定義如下[2]:
STATUS setsockopt( int s, int protocol, int optionname, char * optionval, int optionlen );
參數:s表示Socket套接字實例;protocol表示協議標準,可選IPPROTO_TCP,IPPROTO_IP或SOL_SOCKET;optionval表示需設置選項值的地址;optionlen表示需設置選項值的長度;
optionname表示需設置的選項,常用的選項如下表所示:

TCP連接建立后,若連接的任何一方因某種原因導致連接中斷,TCP必須能夠自動檢測到網絡中斷并釋放該連接。如果連接已建立,該定時器在無數據傳輸時間達到TCPTV_KEEP_IDLE時啟動,TCP將發送一個數據長度為0的連接狀態詢問報文,若連接正常,則系統能收到應答信號,否則TCP將每隔TCPTV_KEEPINTVL時間間隔且最多發送TCPTV_KEEPCNT次連接狀態詢問報文,若仍沒接收到應答信號,TCP將自動釋放該連接,與該連接相關的所有資源都將被釋放,所有阻塞在該連接上的讀寫任務都將立即被解除[3]。
通過對VxWorks操作系統下TCP協議的分析,引發該干擾系統網絡故障的主要原因可能是當TCP連接的某一方離線時,其連接狀態無法及時得到更新并廣播給網絡內與其相連的其他終端設備,后續的TCP數據包不斷堆積造成在TCP連接建立時所申請的緩沖區溢出,導致控制軟件無法響應其他周邊設備的TCP連接請求而形成網絡任務阻塞。
分析某型干擾系統控制軟件的源代碼,在
tcp_keepidle = 120*60;
tcp_keepintvl = 75;
tcp_maxidle = 8;
由上述代碼可見,TCP連接建立后,控制軟件在無數據傳輸時間達到120*60秒即2小時后TCP將發送一個數據長度為0的連接狀態詢問報文,若連接正常,則系統能收到應答信號,否則TCP將每隔75秒且最多發送8次連接狀態詢問報文,若仍沒接收到應答信號,TCP將自動釋放該連接,在釋放之前均默認為TCP連接正常,控制軟件不斷發送數據至發送緩沖區,導致緩沖區數據不斷增加直到緩沖區溢出,其他網絡任務被阻塞而導致該干擾系統出現網絡故障。
通過上述分析,建立TCP連接時所需tcp_keepidle、tcp_keepintvl、tcp_maxidle等參數與后續連接過程中連接狀態的及時更新息息相關,能有效預防緩沖區溢出、網絡任務阻塞等故障的出現,可通過setsockopt()函數或者在Socket套接字的其他初始化函數中對上述參數進行更改。
針對某型干擾系統網絡故障出現的部位,在VxWorks操作系統下修改控制軟件的源代碼,在初始化Socket套接字時增加對如下代碼:


重新編譯后通電測試,在網絡非正常中斷大約100s后,系統檢測到該網絡中斷并實時更新網絡狀態為連接斷開,系統與其余網絡的通信在網絡阻塞了大約60s左右后恢復正常,該干擾系統的網絡故障排除。
該文通過在VxWorks操作系統中修改Socket套接字的相關選項,解決了某型干擾系統在實際應用中無法及時更新TCP連接狀態以及因網絡非正常中斷等導致網絡任務阻塞的故障,極大地提高了系統的可靠性。
參考文獻
[1]Ed Taylor編著,王虎,鄧宏濤,劉志剛等譯.TCP/IP使用詳解[M].機械工業出版社,1999.
[2]李方敏編著.VxWorks高級程序設計[M].清華大學出版社,2004.
[3]高飛,高平編著.計算機網絡和網絡安全基礎[M].北京理工大學出版社,2002.