|
UDP 協(xié)議不具備差錯(cuò)恢復(fù)機(jī)制,但能通過校驗(yàn)和判斷網(wǎng)絡(luò)傳輸是否出現(xiàn)丟包。UDP 的校驗(yàn)和由三部分內(nèi)容求和得到,分別是偽首部、首部以及數(shù)據(jù)報(bào)文,如下圖所示
為了弄清楚這些字段究竟是什么東西,下面我們使用 wireshark 來(lái)抓取一個(gè) UDP 包來(lái)詳細(xì)分析。為了制造這個(gè) UDP 包,使用如下代碼來(lái)向某 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ì)照著最開始的圖表來(lái)尋找各個(gè)參數(shù)的值了( wireshark 一個(gè)十分好用的功能就是點(diǎn)選上面的人類可讀內(nèi)容,其十六進(jìn)制值會(huì)在下面高亮顯示)。我用下表來(lái)表示
然后就可以開始著手校驗(yàn)和的計(jì)算了,但在這之前還應(yīng)注意,上表中有一項(xiàng) Checksum ,這是發(fā)送方根據(jù)發(fā)送內(nèi)容計(jì)算出來(lái)校驗(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ù)加起來(lái),之后取反碼。有一點(diǎn)需要注意的是,如果遇到最高位進(jìn)位,那么需要對(duì)結(jié)果進(jìn)行回卷,意思是
簡(jiǎn)單來(lái)說,就是將要進(jìn)的那一位加到尾部,上面是以二進(jìn)制演示的,對(duì)于16進(jìn)制同樣適用。 |
|
|
來(lái)自: bling小興星 > 《有關(guān)通信》