TCP性能測試與問題分析(進階)

TCP性能測試與問題分析(進階)

 

當TCP的傳輸速度提高和測試方法增加後,出現了許多tcp問題,設計中對遇到的比較有針對性地問題記錄如下,並給出實際地解決方案和過程。

目錄

問題1TCP&UDP助手和快速TCP發送的性能分析(初步)

問題2:特殊情況下的TCP檢驗和出錯

問題3TCP測試助手性能受限問題

問題4TCP接收測試死機,無ACK迴應問題

問題5:快速發送模式時,FPGA回傳PSH數據出錯。

 

 

問題1:TCP&UDP助手和快速TCP發送的性能分析(初步)

描述:TCP助手在接收數據時,處於延遲ACK模式,只有接收到2幀TCP數據時,才立即回覆ACK。否則,在接收單幀數據時,必須等200mS纔回復ACK。

因此,要測試TCP速度,必須在FPGA程序中實現累計Seq發送機制,即連續發送2幀TCP數據,再判斷ACK接收情況。

爲此,再次重新設計了TCP接收狀態機,並加入超時重傳和ACK錯誤重傳。加入超時重傳4次,執行RST復位等,完善的功能。

測試結果如下,當啓動回傳測試命令後,分析發送速度如下。雖然很慢,但算是突破性的一步。

繼續分析後面的接收數據,得到如下結果。

見圖中分析,結果很不錯。此數據保存爲:TCP快速測試-問題1的分析對應結果.pcapng

 

問題2:特殊情況下的TCP檢驗和出錯

描述:發送測試中,當TCP校驗和出錯時,引發重傳,但是TCP校驗和就是錯的,導致一直重傳。並最終引起FPGA發送重置幀,而斷開連接。

現象如下,不止一次出現,多次測試,都是因爲這個問題而導致RST。不然,可預計,發送測試可繼續順利進行下去。

如下圖所示,考慮到手動用計算器算校驗和,實在是太麻煩,前面飽受手算的摧殘。然後再網上找了很久,找到了如下右邊的計算工具。實際測試了,可以用,雖然比較難用,注意事項已在圖中說明。下載鏈接:https://download.csdn.net/download/feillow/914693

通過如上圖,一步步細心整理,得到計算結果:FFF6!果真是我程序中設計的TCP校驗和有誤!

真是尷尬。很多問題這是不測試不知道,一測試(使用)嚇一跳。這個問題,我大概猜到原因:應該是循環加的時候,在特殊情況下出錯了!

爲了全面驗證計算校驗和的細節,再次進行了手算,過程如下。找到問題所在!因此,在FPGA程序中,要考慮兩次進位的情況!

因此,對程序中,所有計算校驗和的地方如下,都進行了2次循環進位加,以確保不會出錯。

 

問題3:TCP測試助手性能受限問題

從問題1,已經詳細分析了TCP&UDP助手的性能,實在太差。最佳解決方案是,自己編寫一個客戶端,實現自定義的、靈活的TCP接收器。但還有一個方法,就是網上尋找,希望能找到一個合適的、功能強大的TCP測試工具。

經過大量尋找,在CSDN資源上挺多,但是層次不齊。

方案1:繼續尋找,一直找到一個合適的。

方案2:尋求同學幫助,讓其幫忙寫一個針對我的設計,開發的上位機。

 

問題4:TCP接收測試死機,無ACK迴應問題

如下圖,在連續發送很多次TCP數據後,會出現FPGA無ACK響應的問題。

經過分析,此種情況下,FPGA端已經“死機”,程序已經跑飛。真的慘。

這個問題就很難了,因爲在前面幾百次的傳輸中都是正常的,直到某個時候,FPGA就跑飛了,很難定位到問題。因此,也不好確定具體要優化FPGA內部哪裏的程序。

方案1:將發送時鐘統一成上升沿發送。--已實現,但仍會出現跑飛。

方案2:將關鍵TCP控制狀態機,改成三段式。--待改進中。

測試中,若採用慢速的向FPGA發送,則不會出現上述錯誤。所以問題,很可能在於FPGA跑飛了。

 

問題5:快速發送模式時,FPGA回傳PSH數據出錯。

截圖如下,本來是正常傳輸狀態,應該繼續發送數據,但是FPGA端出錯,發送PSH被“截斷”,導致序號、長度等全部出錯。從而導致傳輸中斷。

優化發送狀態機,分析整個發送流程,一定要把這個問題找出來!

PS:利用其它TCP助手測試,對比結果,排除是否是測試助手的問題。

使用心得TCP助手測試,結果如下。也出現了同樣的問題,因此,可以排除,不是助手的問題,問題就出在FPGA程序上。我的天吶!

再換了一個客戶端,測試也是一樣的問題。所以,問題確定在FPGA端!

因此,現在的問題重心,在於梳理狀態機,試試改成三段式狀態機。

 

可能原因:

1,可能tcp_rx_done與tcp_req_tx_data1衝突,所以先執行tcp_rx_done,而忽略tcp_req_tx_data1執行了。

實際情況是,執行了PSH,但是沒有尾部數據!

2,推測出了可能問題地方:tcp_rx_done與tcp_req_tx_data1相爭奪,導致後續控制不對。採用三段式狀態機便可解決這個問題。對TCP_TX採用。

3,就是tcp_rx_done來的時候,tx狀態還沒到d0,導致沒有正確接收到tcp_rx_done。所以,把每個標誌都改成迴環確認形式。

就是要解決:能同時執行發送和接收,並使它們不衝突。

後續工作尚多,還需不斷地進行驗證和測試。

 

歡迎交流、源碼分享見CSDN資源,筆者扣扣:1021100382 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章