筆者單位自2010年就購買了某公司網(wǎng)上閱卷系統(tǒng),該系統(tǒng)采用服務(wù)器和客戶端模式,服務(wù)器通過掃描儀將學生答題卡掃描成圖片,再將圖片按題分割;老師們使用不同的用戶名和密碼在自己的電腦上登錄客戶端程序,每個用戶名分配不同的題目。該系統(tǒng)大大提高了老師們的閱卷速度。但是,這套閱卷系統(tǒng)在Windows 7以上系統(tǒng)中運行卻非常慢,顯示一張圖片需要10秒鐘以上,老師們怨聲載道。
既然是服務(wù)器和客戶端模式,就必然會使用網(wǎng)絡(luò)通信協(xié)議,我只要知道Windows 7系統(tǒng)對通信協(xié)議的影響,就可以查到問題的根源。于是我想到用Wireshark進行網(wǎng)絡(luò)抓包,通過分析數(shù)據(jù)包查找問題的根源。
圖1 Windows 7系統(tǒng)上的抓包
圖2 Windows XP系統(tǒng)上的抓包
通過抓包發(fā)現(xiàn),這套閱卷系統(tǒng)使用的是http協(xié)議。登錄客戶端時,客戶端使用http協(xié)議訪問服務(wù)器11次;退出客戶端時,客戶端使用http協(xié)議訪問服務(wù)器2次。在Windows XP系統(tǒng)和在Windows 7系統(tǒng)上,客戶端使用http協(xié)議訪問服務(wù)器的次數(shù)是相同的,但是,Windows 7在使用http訪問服務(wù)器時,卻多了三個TCP傳送包,這三個TCP包用時5秒多,請看圖1和圖2所示的截圖。圖1和圖2中前三個數(shù)據(jù)包是客戶端與服 務(wù) 器(88.91)通過TCP三次握手建立連接,然后是http請求和http應(yīng)答。圖1中序號18提示“tcp segment of a reassembled pdu”,意思是上層報文太大,進行了分片。通過兩圖的第四行可以看出,客戶端POST請求的內(nèi)容相同,都是GradeonNetWs.asmx。
為什么服務(wù)器回復(fù)給Windows 7系統(tǒng)時要分片呢?再仔細看看兩圖中的第一行,客戶端在申請TCP連接時,自報的MSS(TCP最大報文段長度)都是1460,而Win值(滑動窗口能接受數(shù)據(jù)的長度)和WS的值卻不一樣,Windows 7中Win=8192、WS=256, 而 Windows XP 中Win=65535、W S=1,Windows 7中滑動窗口能接受的數(shù)據(jù)長度變小了,這一定與Windows 7的TCP滑動窗口設(shè)置有關(guān)。
原來從Vista開始,微軟在TCP/IP協(xié)議棧里新加了一個叫做“Window Auto-Tuning”的功能。這個功能本身的目的是為了讓操作系統(tǒng)根據(jù)網(wǎng)絡(luò)的實時性能(比如響應(yīng)時間)來動態(tài)調(diào)整TCP數(shù)據(jù)窗口的大小,從而達到實時優(yōu)化網(wǎng)絡(luò)性能的目的。但是,這個功能有時反而使TCP的響應(yīng)變得很慢。原本一次可以接收的包可能被分解后多次接收,這就是問題的根源。
建立一個批處理文件,比 如 aa.dat,在 文件中輸入命令:netsh interface tcp set global autotuninglevel=disable。老師們只要在Windows 7系統(tǒng)上雙擊該批處理文件,就能禁用系統(tǒng)的TCP自動調(diào)整接收窗口大小的功能。如果要恢復(fù)原設(shè)置,只需要將disable改為normal即可。這個方法徹底解決了Windows 7網(wǎng)絡(luò)閱卷慢的問題,從此老師們又可以享受快速閱卷的幸福了。