UDP 協(xié)議不具備差錯(cuò)恢復(fù)機(jī)制,但能通過校驗(yàn)和判斷網(wǎng)絡(luò)傳輸是否出現(xiàn)丟包。UDP 的校驗(yàn)和由三部分內(nèi)容求和得到,分別是偽首部、首部以及數(shù)據(jù)報(bào)文,如下圖所示 為了弄清楚這些字段究竟是什么東西,下面我們使用 wireshark 來抓取一個(gè) UDP 包來詳細(xì)分析。為了制造這個(gè) UDP 包,使用如下代碼來向某 ip 地址發(fā)送一段數(shù)據(jù)(這個(gè) ip 不一定非得實(shí)際存在,我們只需要觀察基于 UDP 協(xié)議封裝的數(shù)據(jù),所以只要能被 wireshark 獲取就行)
在運(yùn)行之前,啟動(dòng) wireshark 捕獲,之后找到 Destination 欄為 11.111.111.111 的 UDP 行,類似于下圖所示 然后找到這個(gè) UDP 包的詳細(xì)信息 以及這段信息的十六進(jìn)制表示 有了以上這些內(nèi)容,剩下的就是對(duì)照著最開始的圖表來尋找各個(gè)參數(shù)的值了( wireshark 一個(gè)十分好用的功能就是點(diǎn)選上面的人類可讀內(nèi)容,其十六進(jìn)制值會(huì)在下面高亮顯示)。我用下表來表示
然后就可以開始著手校驗(yàn)和的計(jì)算了,但在這之前還應(yīng)注意,上表中有一項(xiàng) Checksum ,這是發(fā)送方根據(jù)發(fā)送內(nèi)容計(jì)算出來校驗(yàn)和,接受方需要根據(jù)收到的內(nèi)容重新計(jì)算一遍校驗(yàn)和,然后再對(duì)比兩者。所以在接收方計(jì)算時(shí)應(yīng)該忽略這里 Checksum 項(xiàng)。 校驗(yàn)和的計(jì)算規(guī)則很簡(jiǎn)單,就是將上表中所有的 16 進(jìn)制數(shù)加起來,之后取反碼。有一點(diǎn)需要注意的是,如果遇到最高位進(jìn)位,那么需要對(duì)結(jié)果進(jìn)行回卷,意思是 簡(jiǎn)單來說,就是將要進(jìn)的那一位加到尾部,上面是以二進(jìn)制演示的,對(duì)于16進(jìn)制同樣適用。 |
|