TCP本身屬面向連結的通訊協議。通訊雙方的每一個收發動作,需要以通訊鏈路正常為前提。因此TCP協議內部提供了預設的ACK驗證機制。
假定A、B之間存在一條TCP通訊鏈路,某一時刻A第一次向B發送資料,而之後B未主動向A發送資料,則約200ms之後,B會自動向A回傳一個長度為1的ACK確認包——這是由TCP內部預設機制決定的,而A在未收到ACK確認包之前,不允許第二次向B發送資料,因此B第二次收到資料時,會莫名其妙的產生一個約200ms的延時——這個延時不是別的,正是ACK確認包預設的發送時延。
當我們測試自行研發的服務端通訊架構時,一旦其發生廣播,則此時處於接收方的用戶端很有可能會因為通訊雙方的收發不均而引發上述現象——這並非是由於你的服務端通訊架構效能不達標,而是由於TCP的內部機制導致的。
那麼,我們應該如何避免這種情況呢?這裡介紹一種最簡單也最容易實現的方法——修改註冊表,提高用戶端ACK包預設的發送頻率,也就是縮短ACK包的發送時延:
首先,點擊你電腦螢幕左下角的“開始”菜單,開啟“運行”,鍵入“regedit”開啟你的註冊表;
選擇HKEY_LOCAL_MACHINE 項目開始一層層的往下點,一直到
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters/Interfaces/
這裡是關於你網卡的資料,有很多項,且它們都有類似於{B796DCA-FFE8-4002-A28F-4D2B57AE8383}這樣的名字,但是正確的那個會在右邊視窗顯示包括你的IP地址和你的伺服器IP地址等等網路設定)。 你找到DhcpIPAddress項符合你的本機IP地址的那個,那麼它就是你串連網際網路的那個網卡的設定項,我們的任務目標就是改動它來提高用戶端ACK包的發送頻率。
其次,右鍵點擊視窗右邊的空白處,“建立”-“DWORD值”;
給它改名成“TcpAckFrequency”,然後右鍵點擊它 ,選擇"修改”,然後再那個"數值資料"的空白處填"1"(不用管是16進位,還是10進位)
最後,關閉註冊表,重啟電腦,修改完成。
注意:XP用戶端可以通過上述操作直接達到目的,Win2003Server則需要事先安裝一個補丁檔案,這個檔案可以到本人的資源頁下載,記0分。另外,通過代理上網的用戶端這種方式無效。
弊端:用戶端無關痛癢,但卻無形中加大了服務端的負擔。
推薦:可以用這種方式大幅改善玩網遊時的卡機現象。
有關TcpAckFrequency的補充說明:
TcpAckFrequency 值這個值確定了windows用TCP/IP 發送應答訊息的頻率,也就是決定了在發送“命令正確應答”之前將等候幾個資料包;
預設值為 2,這時TCP/IP 將在接收到 2 個分段後發送應答,或是在接收了 1 個分段但在 200 毫秒內沒有接收到其他分段的情況下發送應答
如果值為 3,則 TCP/IP 將在接收到 3 個分段後發送應答,或是在接收了 1 個或 2 個分段但在 200 毫秒內沒有接收到其他分段的情況下發送應答,以此類推。
如果需要通過消除 TCP/IP 應答延遲來縮短回應時間,則將該值設為 1。在這種情況下,Windows將每收到一個TCP資料包就回送一個“命令正確應答”。
該值的有效範圍是 0 到 255,其中 0 表示使用預設值(2)。