本篇隨筆講述一下TCP協議下,雙向測試模式和交易測試模式下客戶端和服務端執行的狀況;測試
雙向測試模式:spa
官方文檔的解釋線程
Run Iperf in dual testing mode. This will cause the server to connect back to the client on the port specified in the -L option (or defaults to the port the client connected to the server on). This is done immediately therefore running the tests simultaneously. If you want an alternating test try -r.指針
客戶端鏈接到服務端進行數據發送的同時,服務端經過客戶端設置的監聽端口(可經過-L選項另行設置)向客戶端發起鏈接進行數據發送,達成雙向測試的效果。其實換句話來講就是模擬全雙工通訊模式。code
交易測試模式:server
官方文檔的解釋blog
Run Iperf in tradeoff testing mode. This will cause the server to connect back to the client on the port specified in the -L option (or defaults to the port the client connected to the server on). This is done following the client connection termination, therefore running the tests alternating. If you want an simultaneous test try -d.ci
客戶端鏈接到服務端進行數據發送結束後,服務端隨即經過客戶端設置的監聽端口(可經過-L選項另行設置)向客戶端發起鏈接進行數據發送,相應的就是模擬半雙工通訊模式。文檔
二者的區別在於服務端什麼時候模擬客戶端的功能開始往回鏈接。這點在IPerf中很容易就實現了。it
其實thread_Settings結構中存在兩個指向thread_Setting類型的指針變量,分別命名爲runNow和runNext,以往介紹IPerf的隨筆中指出過,thread_Settings包涵了線程運行時所需的所有信息,程序是根據該類型的變量生成各類類型的線程,runNow表示在建立當前的線程以前須要先建立runNow指向的線程,而runNext表示當前線程結束後才建立runNext所指向的線程。定位到具體的代碼以下所示:
if ( tempSettings != NULL ) { client_init( tempSettings ); if ( tempSettings->mMode == kTest_DualTest ) { #ifdef HAVE_THREAD server->runNow = tempSettings; #else server->runNext = tempSettings; #endif } else // if tradoff mode { server->runNext = tempSettings; } }
雙向測試和交易測試其實就是:
1. 在客戶端添加服務端的功能,表如今開始時添加了一個監聽者線程,接收到服務端鏈接過來的套接字後添加了一個服務端線程;
2. 在服務端線程添加了客戶端線程。
須要注意的一點就是,客戶端監聽服務端鏈接過來的套接字時,不是隨便誰的鏈接都在接收後將其放入客戶端鏈表,它須要判斷對端的地址是不是當前這端客戶端線程所鏈接的服務端的地址,若是不是則將其丟棄,並從新監聽,具體定位到代碼表示以下:
if ( client ) { //檢測發起反向鏈接的對端是否是用戶指定的服務端 if ( !SockAddr_Hostare_Equal( (sockaddr*) &mSettings->peer, (sockaddr*) &server->peer ) ) { // Not allowed try again close( server->mSock ); if ( isUDP( mSettings ) ) { mSettings->mSock = -1; Listen(); } continue; } }
下面兩張圖展現雙向測試模式下客戶端和服務端的執行過程: