在 MSP430G2553 上用 ENC28J60 運行 uIP 協議棧搭建簡易 HTTP 服務器。XP 系統瀏覽器可正常訪問,但 Win7 瀏覽器無法連接,抓包發現 Win7 發送的 TCP 數據包缺少 Checksum(校驗和)字段(顯示為 0x0000),導致 uIP 直接丟棄該包。
uip_tcpchksum() 驗證校驗和,若為 0 則判定包錯誤並丟棄。在 uIP 源碼中找到校驗和驗證邏輯(通常在 uip_process() 或 uip_tcpinput() 中),將其註釋或條件編譯關閉:
// 原代碼片段
if (uip_tcpchksum() != 0) {
uip_flags &= ~UIP_TCP_CHKSUM_OK;
goto drop;
}
// 修改為
// if (uip_tcpchksum() != 0) { ... } // 註釋掉,不再驗證校驗和
#define UIP_TCP_CHKSUM_OK 1 // 強制標記校驗和通過
或在項目配置中定義 UIP_CONF_TCP_CHECKSUM=0(視 uIP 版本而定)。
修改重新燒錄後,Win7 瀏覽器即可正常訪問 HTTP 服務,XP 仍正常。注意:禁用校驗和會降低數據完整性保障,但在受控局域網測試環境中可接受。生產環境建議在網卡驅動層關閉 Offload 或由軟件計算校驗和。
此法無需修改嵌入式代碼,但需配置每台客戶端機器,適合調試階段。