VxWorks中以太網(wǎng)通信報文的粘連問(wèn)題
VxWorks是美國Wind River公司推出的一款專(zhuān)門(mén)為實(shí)時(shí)系統設計開(kāi)發(fā)的操作系統內核,為程序員提供了高效的實(shí)時(shí)多任務(wù)調度、中斷管理,實(shí)時(shí)的系統資源以及實(shí)時(shí)的任務(wù)間通信。它是一種功能強大而且比較復雜的操作系統,包括進(jìn)程管理、存儲管理、設備管理、文件系統管理、網(wǎng)絡(luò )協(xié)議及系統應用等部分。目前VxWorks應用已經(jīng)十分廣泛,從數碼相機、路由器到B2隱形轟炸機、火星探路者,都有它的身影。在863某交通重大專(zhuān)項計劃控制系統國產(chǎn)化研究項目中,分區控制計算機(DCC)和電機控制單元(MCU)也都采用了VxWorks操作系統。在現場(chǎng)測試過(guò)程中,我們發(fā)現基于TCP/IP網(wǎng)絡(luò )協(xié)議傳輸的數據有時(shí)會(huì )出現粘包現象(即發(fā)送方發(fā)送的若干包數據傳輸到接收方時(shí)粘成一包)。針對這種情況,我們進(jìn)行了專(zhuān)題研究與實(shí)驗。本文重點(diǎn)分析了TCP/IP協(xié)議的粘包問(wèn)題,并結合實(shí)驗結果提出了解決該問(wèn)題的對策和方法。
本文引用地址:http://dyxdggzs.com/article/84902.htm1 報文粘連問(wèn)題的現象及分析
1.1 報文粘連問(wèn)題的現象
TCP/IP報文粘連是指發(fā)送方發(fā)送的若干包數據,在接收方接收到時(shí)粘成一包,即后一包數據的頭緊接著(zhù)前一包數據的尾。由于報文長(cháng)度與接收緩沖區長(cháng)度有可能不成整倍數關(guān)系,所以粘連在一起的報文中有不完整的包。VxWorks操作系統會(huì )先將由網(wǎng)絡(luò )傳輸來(lái)的數據放入系統接收緩沖區中,以備用戶(hù)進(jìn)程從中調用數據。此處假設接收方緩沖區長(cháng)為L(cháng)字節,L應有一定的長(cháng)度,以保證至少可以存儲一包數據。由于DCC和MCU之間需要傳輸不同種類(lèi)的報文來(lái)進(jìn)行數據交互,所以用戶(hù)在程序中應為不同的報文分別設置不同的接收緩沖區來(lái)存放不同的報文數據。此處假設只有應答報文和狀態(tài)報文兩種,分別以用戶(hù)緩沖區1和2來(lái)存儲;長(cháng)度應與用戶(hù)層對應報文的長(cháng)度相等,假設分別為m和n。粘包情況如圖1所示。
圖1 粘包情況示意圖
1.2 報文粘連問(wèn)題的分析
報文粘連既可能由發(fā)送方產(chǎn)生,也可能由接收方產(chǎn)生,還可能由進(jìn)行數據傳輸的交換機產(chǎn)生。
(1) 發(fā)送方引起的報文粘連
由發(fā)送方引起的報文粘連是源于TCP協(xié)議本身。因為T(mén)CP協(xié)議為提高傳輸效率采用了Nagle算法(詳見(jiàn)RFC896),發(fā)送方要等收集到1460字節的數據才會(huì )發(fā)送一包數據,或是等到發(fā)送緩沖區滿(mǎn)后才會(huì )發(fā)送一包數據,這就造成了報文的粘連。
(2) 接收方引起的報文粘連
由接收方引起的報文粘連,往往是因為接收方進(jìn)程沒(méi)有及時(shí)處理數據造成的。接收方要先把收到的數據放入接收數據緩沖區,用戶(hù)進(jìn)程再從該緩沖區中讀取數據。如果在下一包數據到達時(shí)前一包數據還未被用戶(hù)進(jìn)程取走,則新一包數據就接到前一包數據之后,而用戶(hù)要根據事先設定好的緩沖區大小從系統接收緩沖區中讀取數據,這就造成了一次取到了多包數據。
(3) 由交換機引起的報文粘連
由交換機引起的報文粘連,往往是因為由交換機相連的各個(gè)部件在一段時(shí)間內發(fā)送的報文數據太多,以至于超出了交換機的處理能力。這樣,本來(lái)發(fā)送端分開(kāi)發(fā)送的數據報文在交換機內部的緩沖區中粘連在一起?,F在,在實(shí)驗現場(chǎng)DCC等使用VxWorks操作系統的部件需要使用一個(gè)獨立的端口進(jìn)行程序下載,還要有一個(gè)獨立的端口提供給SecureCRT軟件以進(jìn)行實(shí)時(shí)監控;同時(shí)DCC與MCU和中央控制系統的數據傳輸也要在同一臺交換機中進(jìn)行。這就有可能導致在某一段時(shí)間內數據量超過(guò)了交換機的處理能力。
1.3 文粘連對系統的影響
如果系統發(fā)生了報文粘連現象而不進(jìn)行相應處理,則將導致整個(gè)系統無(wú)法正常運行。
如果用于傳輸數據的報文被粘連導致無(wú)法正常處理,則將使接收方無(wú)法進(jìn)行運算,現場(chǎng)實(shí)時(shí)的數據無(wú)法獲得,從而使標志位無(wú)法置位,程序無(wú)法繼續進(jìn)行。如果作為生命信號的報文被粘連導致無(wú)法正常處理,則將使接收方認為發(fā)送方出現故障;若此情況連續發(fā)生,則接收方將認為發(fā)送方死機,從而停機,以保證整個(gè)系統的安全。
2 報文粘連問(wèn)題的解決方法
2.1 發(fā)送方的解決方法
對于由發(fā)送方引起的報文粘連,可以采用以下兩種方法解決。
?。?) 關(guān)閉Nagle算法
由于VxWorks系統支持Windows Sockets 1.1標準,可以將setsockopt函數中的level項設置為IPPROTO_TCP1,這樣就可以關(guān)閉Nagle優(yōu)化算法。
?。?) 將Winsock kernel buffer設置為0
此方法只有在支持Windows Sockets 2.0標準的系統上才能使用(VxWorks不能支持),可在發(fā)送方為工控機、接收方為使用VxWorks操作系統的處理器的情況下使用。只需將setsockopt項中的level設為SOL_SOCKET,將SO_SNDBUF值設為0。
tcp/ip相關(guān)文章:tcp/ip是什么
評論