筆者單位自2010年就購買了某公司網上閱卷系統,該系統采用服務器和客戶端模式,服務器通過掃描儀將學生答題卡掃描成圖片,再將圖片按題分割;老師們使用不同的用戶名和密碼在自己的電腦上登錄客戶端程序,每個用戶名分配不同的題目。該系統大大提高了老師們的閱卷速度。但是,這套閱卷系統在Windows 7以上系統中運行卻非常慢,顯示一張圖片需要10秒鐘以上,老師們怨聲載道。
既然是服務器和客戶端模式,就必然會使用網絡通信協議,我只要知道Windows 7系統對通信協議的影響,就可以查到問題的根源。于是我想到用Wireshark進行網絡抓包,通過分析數據包查找問題的根源。

圖1 Windows 7系統上的抓包

圖2 Windows XP系統上的抓包
通過抓包發現,這套閱卷系統使用的是http協議。登錄客戶端時,客戶端使用http協議訪問服務器11次;退出客戶端時,客戶端使用http協議訪問服務器2次。在Windows XP系統和在Windows 7系統上,客戶端使用http協議訪問服務器的次數是相同的,但是,Windows 7在使用http訪問服務器時,卻多了三個TCP傳送包,這三個TCP包用時5秒多,請看圖1和圖2所示的截圖。圖1和圖2中前三個數據包是客戶端與服 務 器(88.91)通過TCP三次握手建立連接,然后是http請求和http應答。圖1中序號18提示“tcp segment of a reassembled pdu”,意思是上層報文太大,進行了分片。通過兩圖的第四行可以看出,客戶端POST請求的內容相同,都是GradeonNetWs.asmx。
為什么服務器回復給Windows 7系統時要分片呢?再仔細看看兩圖中的第一行,客戶端在申請TCP連接時,自報的MSS(TCP最大報文段長度)都是1460,而Win值(滑動窗口能接受數據的長度)和WS的值卻不一樣,Windows 7中Win=8192、WS=256, 而 Windows XP 中Win=65535、W S=1,Windows 7中滑動窗口能接受的數據長度變小了,這一定與Windows 7的TCP滑動窗口設置有關。
原來從Vista開始,微軟在TCP/IP協議棧里新加了一個叫做“Window Auto-Tuning”的功能。這個功能本身的目的是為了讓操作系統根據網絡的實時性能(比如響應時間)來動態調整TCP數據窗口的大小,從而達到實時優化網絡性能的目的。但是,這個功能有時反而使TCP的響應變得很慢。原本一次可以接收的包可能被分解后多次接收,這就是問題的根源。
建立一個批處理文件,比 如 aa.dat,在 文件中輸入命令:netsh interface tcp set global autotuninglevel=disable。老師們只要在Windows 7系統上雙擊該批處理文件,就能禁用系統的TCP自動調整接收窗口大小的功能。如果要恢復原設置,只需要將disable改為normal即可。這個方法徹底解決了Windows 7網絡閱卷慢的問題,從此老師們又可以享受快速閱卷的幸福了。