當前位置:首頁 » 網路連接 » 偏移位計算機網路
擴展閱讀
北京移動網路出故障 2025-10-20 08:58:18
西鄉網站製作多少錢 2025-10-20 08:54:23

偏移位計算機網路

發布時間: 2022-09-20 04:49:34

㈠ 請計算機數據方面高手進.請幫忙講解一下何為偏移量、偏移地址,及其作用.(定以高分相酬)

研究偏移量 就先要了解 內存數據儲存格式 與位置
通過CE來理解它 下面是CE的 數據修改方法

現在,我們來開始一步一步學習CE的使用吧,通過完成CE帶的那個TUTORIAL,按它的要求一步一步做完,如果你做得到,你就基本上算是掌握了CE的用法了。

CE帶的TUTORIAL,是英文的,不過沒關系,我在教你使用CE來完成這個TUTORIAL的同時,會把TUTORIAL上面的所有英文都翻譯出來讓你看明白,所以不用怕。

CE帶的這個TUTORIAL,是CE作者做的用來讓你練習的一個程序,它裡面也和游戲一樣,在每一個步驟都會有一些類似血(HEALTH)或子彈數量的東西,並且你點了上面某個按鈕之後,這些數值也會象游戲中一樣減少,這樣讓你象是修改游戲一樣,去找到它的地址,並按TUTORIAL上面的要求修改,當你按它的要求做到了,才讓你做下一步。而在第一步時那個輸入密碼的地方,不是說這個TUTORIAL要輸入密碼才能運行,而是有時你需要從中間某一步開始時,輸入相應的密碼會直接從某一步開始,而不用每一次都從第一步開始的。而你每完成一步之後,它也會給你相應的密碼。

好了,也許你等不及了,那麼我們現在就開始吧。

第一步:

先在開始菜單上找到CE的程序組,找裡面的「Cheat Engine Tutorial」(以下簡稱TUT),點擊運行。這個時候就出來這個TUT的對話框,上面一大段英文,而Next這個按鈕是灰的,為什麼呢?讓我翻譯一下上面的英文吧,你就明白。TUT上面的英文的譯文,我會用【】號把它們括起來。

【歡迎你來到CE的教程(V2.4)
這個教程試圖解釋在游戲中作弊的基本步驟,並讓你更熟悉CE的使用。

首先運行CE,如果你還沒運行的話(CCB:因為還沒運行,所以Next按鈕才是灰色的:)。
然後點擊"open process"按鈕(在左上角那個有電腦圖標的那個)

當進程列表窗口打開後,找到這個教程,進程的名字應該是「tutorial.exe」,除非你把它改名了。選擇它,並點擊OK。現在先不要管其他所有的按鈕,如果你喜歡,以後再研究它們。

當這一切都做對了之後,進程選擇窗口將會消失並且在CE上方會顯示進程名。

現在,點擊NEXT按鈕繼續到下一個步驟(或者輸入密碼而進到你想去的其他步驟)。


好了,上面的這些英文,我翻譯過來了,所以這一步應該不需要我再補充什麼,看這些譯文應該能明白怎麼做,就是開TUT,開CE(哪個先開都沒關系),然後點擊CE左上的那個選擇進程的按鈕,選擇這個TUT的進程,這樣就可以點NEXT進到下一步了。

第二步:

【第二步:精確數值掃描(密碼:090453)
現在你已經在CE中打開了TUT,讓我們進入到下一步吧。

你看到在這個窗口的下方的文字Health:XXX
每次你點擊"Hit me"(打我)時,你的Health(血)會減少。

要進到下一個步驟,你必須找到這個數值並把它改為1000

要找到這個數值,有幾個不同的方法,但我會告訴你一個最簡單的,'Exact Value(精確數值掃描)':
首先確認數值類型設置為2位元組或4位元組,1位元組也可以的,但當你最後在修改它時你會遇到麻煩(雖然很容易解決)(CCB:大家不會忘了吧?1位元組表示的最大數值是255,而這里要你改為1000,所以雖然用1位元組能找到,但要改卻要連前一位元組一起改,所以有點麻煩,不過不是大麻煩)。8位元組可能也可以,如果這個地址後面是0的話,不過我不敢打賭。Single, Double, 以及其他的掃描方式不行,因為它們儲存數值的方式不同。

當數值類型設置正確後,確認掃描方式設置在'Exact Value'
把血的數值填在數值輸入框上,並點擊'First Scan(首次掃描)'
過一會兒(如果你有一個非常慢的電腦的話)掃描完成並且掃描的結果會顯示在左邊(如果找到的地址的數量少於設置的數值的話)。

如果你找到多於一個地址而你不知道哪一個是正確的地址的話,點擊TUT上的'Hit me',並把新的血的數值填到數值輸入框,並點'Next Scan(再次掃描)'
重復這些步驟直到你確認你已經找到它的地址了(在地址列表上只有一個地址)

現在雙擊左邊列表上的地址,這樣會讓這個地址移動到下方的列表上並顯示它的當前數值。
雙擊(下方列表的)數值欄(或者選擇它,並按回車),並把它修改為1000。

如果一切都OK,NEXT按鈕將會變成可點擊的了,你就准備好了進入下一步了。】

這一步,也不用我再補充什麼了,這個TUT已經說得很清楚,這是使用CE的最基本功能,即找到數值,如果掃描結果太多,試圖改變數值然後再次掃描,直到結果剩下很少或者1個為止,這樣你就找到了要修改的數值的地址,並且也就能修改它了。到這一步,你已經能對付很簡單的游戲了,不過現在的大多數游戲都沒這么簡單,但至少你已經學到最基本的一步,就是精確數值的掃描和修改了。現在就點擊NEXT進入下一步吧!

第三步:

【第三步:未知初始數值(密碼:419482)
OK,看來你已經理解了怎樣使用精確數值掃描找到一個數值了,讓我們進入下一步吧。

在上一步中我們知道初始數值所以我們進行了精確數值掃描,但現在我們有一個進度條,我們不知道它開始時的數值。
我們只知道這個數值是在0到500之間,並且每次你點'Hit me'之後你會減一些血,每次減的血量會顯示在進度條的上方。

同樣的有好幾個方式找這個數值,(例如使用「減少了什麼數值」的掃描方式),但我只解釋最簡單的方式,「Unknown initial value」(未知初始數值)和「Descreased value(減少了的數值)」。
因為你不知道現在它的數值是多少,所以使用精確數值不行了,所以選擇掃描方式為"Unknown initial value",同樣的,數值類型選擇4位元組,(大多數WINDOWS應用程序使用4位元組數據)
點擊'First scan'並等它掃描完成。

當掃描完成後點擊'Hit me',你會掉一些血(掉的血量多少會在血條上方顯示幾秒然後消失,但你不需要這個數值)
現在回到CE,並選擇'Decreased Value'(減少了的數值),並點擊「Next Scan」
當掃描完成後,再次點擊'Hit me',並重復上面的步驟,直到你找到了若乾地址。

我們知道這個數值是在0到500之間,所以選擇比較象我們要的那個地址是,並把它加到下邊的列表。
現在,把它改為5000,才能進到下一步。


這一步,稍為復雜一點了,這是對那些血條之類的東西的掃描。作者說知道數值是0到500之間,但沒說是怎麼知道的。我的看法是,這東西一方面靠猜,另一方面靠試。你也許會說,比如血條或藍條,上面或下面不是有數字嗎?是的,有些有,有些沒有,但有時,血條上面有個表示血的數字,說血是548,但你就知道它是真的按這個值存在內存的嗎?不一定的哦,很多游戲的開發者,可能會用某一個方式存真正的血的數值,而用另一個方式顯示,例如,最簡單的就是,真正的血是你看到的數值的3倍,例如上面說的548,其實在內存可能是1644,而當它要顯示的時候才把1644除以3然後顯示出來,所以如果你受這個顯示數字的誤導,結果就有可能找不到真正的地址。所以關於那些以長度表示的數值,一般還是靠猜,然後根據猜測來找。還有,CCB友情提醒一下,其實有時在找到的數值比較多的時候,試試在掃描的過程中,確認數值確實沒改變的情況下,多加幾次"Unchange"(無變化)掃描,這樣可以再減掉一些無關的結果。另外,其實在這一步,如果你夠聰明,每次點了Hit me之後記住血條上面顯示的減少的數字,再在CE中輸入剛才的數字(負號不要,負號只是表示它是減少的),並選擇'Decreased value by',即「減少了什麼數值」,這樣也能更快地找到准確的地址,但這種方式是在要知道減少了多少這個具體數值才有用。好了,繼續下一步吧。

第四步:

【第四步:浮點數(密碼:890124)
在前面的教程中,我們使用位元組來掃描,但有些游戲使用了叫做「浮點數」的記數方法。
(可能是為了防止簡單的內存掃描)
浮點數是帶有小數點的一些數字(如5.12或11321.1)

如下邊你看到你的血(Health)和子彈(Ammo)。兩者都以浮點數儲存,但血是儲存為float(浮點數)而子彈是儲存為double(雙精度浮點數)(CCB:這是數據類型的術語,float和double都是浮點數,但float為單精度數,而double為雙精度數,它們在電腦裡面佔用的位元組數長度不同,而所能表示的精度也不同,看不懂不要緊,反正知道這是兩種不同的浮點數就行)。
點擊Hit me可以減少一些血,而點擊shoot(CCB:其實是Fire)可以用掉0.5的子彈。

你得把這兩者都修改到5000或者更多才能進下一步。

精確數值掃描方式在這一步能工作得很好,但也許你想試試其他的掃描方式。(CCB友情提示:掃描子彈的時候試試'Decreased value by'方式就不錯,數值填入0.5,很快就能找到)


這一步,其實也沒什麼,只是讓你熟悉不同數據類型的掃描。再次提醒一下,其實有時游戲的開發者為了不讓你太容易掃描到數值的地址,所以有時故意顛倒黑白,例如你看到有小數的地方,有時在內存卻是用整數來保存,而你明明看到是顯示為整數的數值,卻有可能在內存中是用小數來保存,所以有時不要輕易地被你看到的東西誤導,特別是在多次搜索不到結果的時候,有時要換換別的方式,不要讓狡猾的游戲開發者騙了:)。

第五步:

【代碼尋找(密碼:888899)
有時一些東西的保存位置在你重新開始游戲時會改變,甚至是在你玩的時候也會變,在這種情況下,你用二件事仍然能做出可以用的內存列表。
在這一步我會描述怎樣用尋找代碼功能。

下面的數值每次你開始這個TUT的時候會存放在不同的位置,所以一個普通的內存地址列表將會不適用。
首先找到這個數值的內存地址(你能進到這一步,我假設你已經知道怎麼做了)
當你找到地址後,右擊CE中的這個地址,並選擇「Find out what writes to this address」(找到是什麼改寫這個地址),一個窗口將會出現,上面會有一個空的列表。
然後,點擊這個TUT上的'Change value'(改變數值)按鈕,回到CE,如果一切都做得對,會看到一個地址和一些匯編代碼。
點擊這個地址並選擇Replace(替換)選項把它替換成什麼也不做的代碼,這樣還會將代碼地址加到高級選項窗口上的代碼列表(它將會一起保存,如果你保存地址表的話)。

點擊Stop,這樣游戲(CCB:指這個TUT)將會再次正常地運行下去,並點Close關閉這個窗口。
現在,點擊這個TUT上的Change value按鈕,如果一切都做對,NEXT按鈕將會變成可點擊的了。

註:如果你以足夠快的速度鎖定這個地址,這個NEXT按鈕也會變成可見的。
]】

越來越精彩了,現在不但教你找地址,還教你找那條修改這個地址的指令了,雖然,你還不太清楚怎樣手工修改找到的地址,但至少也比單純地找數值的地址並修改和鎖定要好一些了,不是嗎?別急,更精彩的還在後面呢。

第六步

【指針(密碼098712)
在上一步我解釋了怎樣用代碼尋找功能對付變化位置。但單獨用那個方法不容易找到地址來修改為你要的數值。
這就是為什麼要用到指針了:

在TUT下面你會找到兩個按鈕,一個會改變數值,另一個不但會改變數值並且還會改變數值在內存中的位置。
在這一步,你不需要真的懂匯編,但如果你懂的話會很有幫助。

首先找到數值的地址,當你找到後,再找找是什麼在改寫這個地址。再次改變這個數值,這樣會找到一個代碼地址,雙擊這個代碼地址(或者選擇它並點擊More info),這樣一個新的窗口會打開並顯示詳細的信息告訴你當這個指令運行時會發生什麼事(CCB:這個新出來的窗口上,那條指令會是紅色的)。如果這個匯編指令裡面沒有包括一個在方括弧中的東西,(CCB:說明這個不是我們要的)那麼再看看代碼地址列表中另一個代碼地址。如果有方括弧,就是說CE認為找到了數值的指針了。
回到CE主窗口,(你可以讓那個擴展信息窗口開著,但如果你關了,要記住在方括弧中間的內容)(CCB:要關了那個有代碼地址列表的窗口,才能回到CE主窗口,但擴展信息窗口可以不用關掉),並做一次4位元組的掃描,掃描擴展信息窗口告訴你的十六進制數。(CCB:就是方括弧裡面的內容,如果方括弧裡面是[eax],那麼看看擴展信息窗口下面EAX=後面的數值)。當掃描完成時它可能返回一個或幾百個地址。大多數情況下你要的會是最小(CCB:指地址最小,也就是排在列表的最上面)那一個。現在點擊手工添加內存地址(Add address manually)並在pointer(指針)這個選項上打勾。

這個窗口將會改變,並允許你填入指針的地址和偏移量。
在地址那裡填入你剛才掃描到的地址。
如果匯編指令在後面有一個計算(例如:[esi+12])那麼把數值填在後面,否則讓它保持0(CCB:就是如果有類似那樣的計算,把12這個數值填在偏移量(OFFSET)那裡,否則那裡填0),如果是更復雜的指令,看看它的算式。

舉例說明更復雜的算式:
[EAX*2+EDX+00000310] eax=4C 並且 edx=00801234.(CCB:這時各個寄存器的值到底是多少,要看擴展信息窗口下方,那裡有各個寄存器在執行這條指令時的值)
在這個情況下EDX會是數值的指針,而EAX*2+00000310則是它的偏移量,所以你要填的偏移量會是2*4C+00000310=3A8.(這些都是在十六進制下計算的,使用WINDOWS的計算器在科學方式下用十六進制計算)。

回到TUT(CCB:?),點擊OK,這個地址將會加到列表上,如果沒搞錯,將會顯示P->xxxxxxxx,xxxxxxxx會是你找到的數值的地址。如果不正確,那你一定是哪裡做錯了。
現在,使用那個指針改變數值為5000並鎖定(就是在下面的地址列表中,點最前面FROZEN那一欄的勾)它,然後(CCB:應該是這里才回到TUT吧?),點擊'Change pointer'按鈕,如果一切正確,那麼NEXT按鈕將變成可見的了。

額外信息:
在這個TUT中,事實上數值是由一個指針指向另一個指針(CCB:再指向真正的數值,就是使用了「指針的指針」,有點象繞口令:),但要完成這個TUT只需要一個指針。要找到這個指針(CCB:是說要找到指向指針的另一個指針),只要搜索是什麼改變那個指針。
如果你懂匯編,你可能會看到類似這樣的:
mov eax,[ebp-4]
mov eax,[eax+310]
這些別搞混了,只使用擴展信息窗口告訴你的數值。ebp-4指向堆棧中保存了指向這個指針的指針,但堆棧的位置總是在變化,所以不要搜索ebp,而要搜索eax的數值。


這一步,確實就夠復雜了,也許你到這一步真的有點想放棄了。不過,如果我告訴你,這是這個TUT的最後一步了,你還會想放棄嗎?呵呵,堅持啊,看不懂就問,把CCB這傢伙問倒了才好呢:)。其實這就是對付DMA的方法之一了,就是先找到地址然後找到指針,找到指針就好辦了。

【做得好,你完成了CE的教程了,再玩玩這個TUT並學習一下其他的掃描方法怎樣工作的】

==============================================================

如果你一邊看一邊做,已經做到了這一步,CCB要恭喜你,你已經領到2005年第一學期的GH小學入學證書了,呵呵。以後就是個小學生了,可要聽家長和老C的話哦,不要搗亂,不要遲到曠課,知道嗎?

其實,這個教程,本身也並不很詳細,而且本身可能由於作者疏忽並且英語也不是作者的母語吧,所以裡面也有些不正確的地方,有些地方我是根據我的理解做了修正的,雖然即使你做完成了這個教程,也不是說你就很了不起了,但至少,你已經學會了CE的基本操作了,只要再多做練習,熟悉CE的操作和各種掃描方式的使用,對付一些簡單的游戲,已經是游刃有餘了,但要更深入地使用CE的更高級的功能,還要再多學習的。

其實到這里為止,CE界面上的一些東西還沒有詳細的講過呢,不過在你做完這個教程之前,其實講了可能你也聽不太清楚,所以我會在大家熟悉了CE的操作後,再另外寫一個相對全面一點的介紹CE各個部分和各個功能的帖子。

怎麼寫了一夜,都不覺得是自己在寫東西,倒象是在翻譯呢?也許是職業病吧,告訴你,在很久很久以前,CCB還不懂電腦的時候,就是專業做翻譯的,不過不是做英語的翻譯:)。

有時真的搞不懂,我自己三分鍾就能做完的這個教程,翻譯起來再拼湊上自己的幾句,就竟然要花掉我五六個小時?也許,這就是創作和享受的差別吧。種田的人,從一棵穀苗到一把米,要花多長的時間?你卻一口就能把它吃下:)

最後,歡迎大家提問題和扔臭雞蛋,當然,扔幾個魔功120的魔靈,我也絕對不反對的。不過一定要記得扔在小青蛇,別的區,你扔了我還不想撿呢:)

補充說明:最後一步不清楚或者進行不下去的朋友,請看本主題73樓,有詳細的單獨說明。

另外,本討論主題後續的討論有一些很有參考價值的討論,而且31樓和65樓也有一些我做的補充,建議大家特別是那些在做這個教程的過程中遇到疑難的朋友,細心讀完整個討論主題的所有後續討論,也許你遇到的問題以前有人遇到過並且知道問題出在哪裡和怎麼解決了。還有,本教程是針對CE4.4所帶的TUT,新版本的TUT增加了幾個步驟,新增加有步驟在本版精華區中有相應的教程,如果你用的是新版的CE,後面幾步可以到精華區去看看。

73樓
現在我來開始單獨做最後這一步。

一,運行CE,運行TUT,在CE中指定tutorial.exe這個進程,這個我想大家都會了吧。

二,因為是單獨做,所以我輸入了密碼直接跳到最後一步,密碼是098712,輸入後點後面的OK就直接出現最後一步。

三,根據TUT的要求,我們先找到數值所在的內存地址,現在在TUT上面顯示的數字是100,於是我在CE中直接輸入100然後FIRST SCAN,這一步得到了83個地址(這個並不重要,也許你的情況不是83,也許更多,也許更少)。

四,然後,我點TUT左下的寫著「Change Value」的按鈕,現在TUT上的變成723,於是我在CE中輸入723然後NEXT SCAN,現在就只得到一個地址了,地址是00BD50BC。

五,接下來的一步就是把這個地址加到CE下邊的地址列表中,雙擊左邊的這個地址就自動加到下面的地址列表了。

六,根據TUT的要求,要我們用CE的Find out what writes to this address,於是我在下邊的地址列表中對著這個地址點右鍵,在彈出菜單上點擊Find out what writes to this address。接著會出來一個讓你確認的對話框,點YES,接著CE的主窗口右邊會多出一個新的窗口,窗口標題是"Created processes",它下面的列表框中有一個項目,內容是FFEA10D7,這個就是TUT這個進程的進程號或者叫PID,雙擊它或者選擇它後點下面的Select。這樣CE的主窗口前面又會多一個新的窗口,標題是"The following opcodes changed the selected address",現在可以把"Created processes"窗口關掉了。

七,回到TUT,現在仍然是點它左下的Change Value。因為我們現在只想改變它的值,還不想讓那個數值的地址也改變,所以只點左邊的這個按鈕。馬上你就能看到在CE前面的那個The following opcodes...那個窗口裡出現一條指令,在我這里它顯示的是004560cf 89 10 mov [eax], edx。如果是在對游戲進行實際的跟蹤而不是在完成這個教程,有時可能這個列表會有三四條指令。事實上這個就是CE告訴我們,它找到了是這條指令改變了那個地址上的數值。不過這還不夠,所以還要繼續。

八,現在我們先按The following opcodes這個窗口右下角的STOP,先停止CE對TUT的跟蹤,然後如TUT所說,雙擊這條找到的指令,或者單擊它然後點右邊的MORE INFORMATION。在出來的EXTRA INFO這個窗口,上面說的那條指令顯示為紅色,在這里我再大概說一下這條指令的意思,它是把edx這個寄存器裡面的數值,放到一個內存地址里,是哪個內存地址呢?這個內存地址就保存在eax。記得吧?加了方括弧的寄存器就不是指數值,而是指一個內存地址,因此這一步不是把edx的值放到eax這個寄存器裡面,而是把edx的數值放到保存在eax中的那個地址。因此,我們要看看剛才程序執行到這一條指令時,eax的數值是多少。在extra info這個對方框下半部,我們可以看到EAX=00BD50BC,因此我們知道EAX的值。

九,現在我們按The following opcodes這個窗口下邊的Close按鈕,先把它關掉,這樣才能回到CE的主窗口。而EXTRA INFO可以留著。現在根據TUT的要求,我們要來做一次十六進制的掃描,點擊CE主窗口的NEW SCAN,然後把輸入數值的前面那個HEX的選項打上勾,表示我們要輸入的是十六進制數,再把在EXTRA INFO中看到的數字,也就是00BD50BC這個十六進制數輸入,然後按FIRST SCAN進行掃描,馬上一個唯一的結果就出來了,在我這里搜索到的結果是00BD4E64。

十,現在我們來按TUT的要求,以指針的方面把這個結果手工加到地址列表中,並且鎖定它。在CE主窗口的右中部有個按鈕「add address manually」,點它之後會出現一個添加地址的對話框。在OK這個按鈕的上方有個Pointer的選項,因為我們是要以指針方式添加這個地址,所以這個選項要打勾。打勾之後,上面原來填地址的地方就變成問號不讓你輸入了,現在是要在下面的輸入框中輸入地址和偏移量了。地址就是上面第九步掃描得到的結果,即00BD4E64,而因為指令中方括弧中只有一個EAX,而沒有算式,所以偏移量是0,我們不用改動。同時我們也可以注意到,當我們輸入完00BD4E64之後,上面剛才不讓輸入地址的地方再在就變成00BD50BC,也就是現在數值所在的地址,說明我們這個指針確實是指向正確的位置的了。現在點確定,新添加上的地址就會出現在地址列表上,並且顯示為P->00BD50BC,表示這是一個指針,它當前指向的內存地址是00BD50BC。現在來試試TUT下邊另一個按鈕,就是改變數值同時改變內存地址的那個「Change pointer」按鈕,看看地址變了我們的指針是否還會正確指向它新的地址。確實我們按這個按鈕之後,地址列表上的地址P->後面的內容變了,就是說現在TUT把這個數值放到新的地址了,不過地址表上那個數值仍然和TUT上顯示的數值一樣。經過這一步的測試我們也可以更好地增加對DMA和指針方面的認識。現在只要按TUT的要求把這個地址前面的FROZEN打上勾,再把它的數值改為5000,然後點TUT上的Change pointer按鈕,NEXT就出現了。

其實我想大家在這一步卡住 的原因,一方面是可能對DMA和指針這方面的內容還不夠了解,另一方面是沒認真看TUT上的文字,我相信大家按照我上面說的步驟做一遍應該就覺得不會那麼困難了。

由於TUT中找到的指令比較簡單,沒有偏移量,因此我在這里再補充一點關於偏移量方面的內容。假設剛才我們上面找到的指令是mov [eax+3C], edx,並且假設EXTRA INFO窗口上的數值和上面說的一樣的話,那麼,我們要掃描的就是eax+3C,也即方括弧中的數值了。上面例子中eax的值是00BD50BC,那麼eax+3C=00BD50BC+3C=00BD50F8,在第九步要掃描的就是這個00BD50F8了,而在最後手工添加地址到地址列表的時候,地址要填00BD50BC,偏移量要填3C。

還有,在這個例子中,我們可以把TUT中那個數值看成是游戲中的HP的值,那麼,上面的00BD50BC就是在某一時刻HP所在的內存地址,這個地址是會改變的(例如我們點了Change pointer按鈕時它就會變化),而00BD4E64這個地址就是這個HP的指針,不管地址怎麼變化,但變化後的新地址都保存在00BD4E64這個指針位置上。所以我們只要找到指針,不管內存地址怎麼變,我們都能找到數值。從這個例子也可以讓大家更好的了解指針到底是怎麼一回事。

計算機網路中IP數據報的片偏移計算

答案是A,偏移量的意思就是這個數據包是從源數據包哪個地方開始的,因為IP報文有40個位元組的IP報文頭,所以1300個位元組的數據會被分成以下三個包: A數據包:包含40個位元組的IP報文頭,0-460位元組的數據,偏移量為0; B數據包:包含40個位元組的IP報文頭,460-920位元組的數據,偏移量為460; C數據包:包含40個位元組的IP報文頭,920-1300位元組的數據,偏移量為920

㈢ 計算機網路:網路層(2)

如圖,一個IP數據報由首部和數據兩部分組成。首部的前一部分是固定長度,共20位元組,是所有IP數據報必須具有的。在首部的固定部分的後面是一些可選欄位,其長度是可變的。

(1)版本
佔4位,指IP協議的版本。通信雙方使用的IP協議的版本必須一致。目前廣泛使用的IP協議版本號為4(即IPv4)。也有使用IPv6的(即版本6的IP協議)。
(2)首部長度
佔4位,可表示的最大十進制數值是15。 這個欄位所表示數的單位是32位字(1個32位字長是4位元組),因此,當I的首部長度為1111時(即十進制的15),首部長度就達到最大值60位元組。當分組的首部長度不是4位元組的整數倍時,必須利用最後的填充欄位加以填充。 因此數據部分永遠在4位元組的整數倍時開始,這樣在實現IP協議時較為方便。首部長度限制為60位元組的缺點是有時可能不夠用。但這樣做是希望用戶盡量減少開銷。最常用的首部長度就是20位元組(即首部長度為0101),這時不使用任何選項。
(3)區分服務
佔8位,用來獲得更好的服務。這個欄位在舊標准中叫做服務類型,但實際上一直沒有被使用過。1998年ITF把這個欄位改名為區分服務DS( Differentiated Services。只有在使用區分服務時,這個欄位才起作用。在一般的情況下都不使用這個欄位。
(4)總長度
總長度指首部和數據之和的長度,單位為位元組。總長度欄位為16位,因此數據報的最大長度為216-1=65535位元組。
在IP層下面的每一種數據鏈路層都有其自己的幀格式,其中包括幀格式中的數據欄位的最大長度,這稱為最大傳送單元MTU( Maximum Transfer Unit)。當一個IP數據報封裝成鏈路層的幀時,此數據報的總長度(即首部加上數據部分)一定不能超過下面的數據鏈路層的MTU值。雖然使用盡可能長的數據報會使傳輸效率提高,但由於乙太網的普遍應用,所以實際上使用的數據報長度 很少有超過1500位元組 的。為了不使IP數據報的傳輸效率降低,有關IP的標准文檔規定,所有的主機和路由器必須能夠處理的IP數據報長度不得小於576位元組。這個數值也就是最小的IP數據報的總長度。當數據報長度超過網路所容許的最大傳送單元MTU時,就必須把過長的數據報進行分片後才能在網路上傳送。這時,數據報首部中的「總長度」欄位不是指未分片前的數據報長度,而是指分片後的每一個分片的首部長度與數據長度的總和。
(5)標識 (identification)
佔16位。軟體在存儲器中維持一個計數器,每產生一個數據報,計數器就加1,並將此值賦給標識欄位。但這個「標識」並不是序號,因為IP是無連接服務,數據報不存在按序接收的問題。當數據報由於長度超過網路的MTU而必須分片時,這個標識欄位的值就被復制到所有的數據報片的標識欄位中。相同的標識欄位的值使分片後的各數據報片最後能正確地重裝成為原來的數據報。
(6)標志(flag)
佔3位,但目前只有兩位有意義。
標志欄位中的最低位記為 MF ( More Fragment)。MF=1即表示後面「還有分片」的數據報。MF=0表示這已是若千數據報片中的最後一個。
標志欄位中間的一位記為 DF (Dont Fragment),意思是「不能分片」。只有當DF=0時才允許分片。
(7)片偏移
佔13位。片偏移指出:較長的分組在分片後,某片在原分組中的相對位置。也就是說,相對於用戶數據欄位的起點,該片從何處開始。片偏移以8個位元組為偏移單位。這就是說,每個分片的長度一定是8位元組(64位)的整數倍。
(8)生存時間
佔8位,生存時間欄位常用的英文縮寫是TTL( Time To live),表明是數據報在網路中的壽命。由發出數據報的源點設置這個欄位。其目的是防止無法交付的數據報無限制地在網際網路中兜圈子(例如從路由器R1轉發到R2,再轉發到R3,然後又轉發到R1),因而白白消耗網路資源。最初的設計是以秒作為TTL值的單位。每經過一個路由器時,就把TTL減去數據報在路由器所消耗掉的一段時間。若數據報在路由器消耗的時間小於1秒,就把TTL值減1。當TTL值減為零時,就丟棄這個數據報然而隨著技術的進步,路由器處理數據報所需的時間不斷在縮短,一般都遠遠小於1秒鍾,後來就把TTL欄位的功能改為「跳數限制」(但名稱不變)。路由器在轉發數據報之前就把TTL值減1。若TTL值減小到零,就丟棄這個數據報,不再轉發。因此,現在TTL的單位不再是秒,而是跳數。 TTL的意義是指明數據報在網際網路中至多可經過多少個路由器 。顯然,數據報能在網際網路中經過的路由器的最大數值是255。若把TTL的初始值設置為1,就表示這個數據報只能在本區域網中傳送。因為這個數據報一傳送到區域網上的某個路由器,在被轉發之前TTL值就減小到零,因而就會被這個路由器丟棄。
(9)協議
佔8位,協議欄位指出此數據報攜帶的數據是使用何種協議,以便使目的主機的IP層知道應將數據部分上交給哪個處理過程。

過程大致如下:
(1)從數據報的首部提取目的主機的IP地址D,得出目的網路地址為N。
(2)若N就是與此路由器直接相連的某個網路地址,則進行直接交付,不需要再經過其他的路由器,直接把數據報交付給目的主機(這里包括把目的主機地址D轉換為具體的硬體地址,把數據報封裝為MAC幀,再發送此幀);否則就是間接交付,執行(3)。
(3)若路由表中有目的地址為D的特定主機路由,則把數據報傳送給路由表中所指明的下一跳路由器;否則,執行(4)。
(4)若路由表中有到達網路N的路由,則把數據報傳送給路由表中所指明的下一跳路由器;否則,執行(5)
(5)若路由表中有一個默認路由,則把數據報傳送給路由表中所指明的默認路由器;否則,執行(6)。
(6)報告轉發分組出錯。

在進行更詳細的轉發解釋之前,先要了解一下子網掩碼:

上一篇說到了二級IP地址,也就是IP地址由網路號和主機號組成。

二級IP地址有以下缺點:
第一,IP地址空間的利用率有時很低每一個A類地址網路可連接的主機數超過1000萬,而每一個B類地址網路可連接的主機數也超過6萬。然而有些網路對連接在網路上的計算機數目有限制,根本達不到這樣大的數值。例如10 BASE-T乙太網規定其最大結點數只有1024個。這樣的乙太網若使用一個B類地址就浪費6萬多個IP地址,地址空間的利用率還不到2%,而其他單位的主機無法使用這些被浪費的地址。有的單位申請到了一個B類地址網路,但所連接的主機數並不多,可是又不願意申請一個足夠使用的C類地址,理由是考慮到今後可能的發展。IP地址的浪費,還會使IP地址空間的資源過早地被用完。
第二,給每一個物理網路分配一個網路號會使路由表變得太大因而使網路性能變壞。
每一個路由器都應當能夠從路由表査出應怎樣到達其他網路的下一跳路由器。因此,互聯網中的網路數越多,路由器的路由表的項目數也就越多。這樣,即使我們擁有足夠多的IP地址資源可以給每一個物理網路分配一個網路號,也會導致路由器中的路由表中的項目數過多。這不僅增加了路由器的成本(需要更多的存儲空間),而且使查找路由時耗費更多的時間,同時也使路由器之間定期交換的路由信息急劇增加,因而使路由器和整個網際網路的性能都下降了。
第三,兩級IP地址不夠靈活。
有時情況緊急,一個單位需要在新的地點馬上開通一個新的網路。但是在申請到一個新的IP地址之前,新增加的網路是不可能連接到網際網路上工作的。我們希望有一種方法,使一個單位能隨時靈活地增加本單位的網路,而不必事先到網際網路管理機構去申請新的網路號。原來的兩級IP地址無法做到這一點。

於是為解決上述問題,從1985年起在IP地址中又增加了一個「子網號欄位」,使兩級IP地址變成為三級IP地址,它能夠較好地解決上述問題,並且使用起來也很靈活。這種做法叫作劃分子網 (subnetting),或子網定址或子網路由選擇。劃分子網已成為網際網路的正式標准協議。

劃分子網的基本思路如下:
(1)一個擁有許多物理網路的單位,可將所屬的物理網路劃分為若干個子網 subnet)。劃分子網純屬一個單位內部的事情。本單位以外的網路看不見這個網路是由多少個子網組成,因為這個單位對外仍然表現為一個網路。
(2)劃分子網的方法是從網路的主機號借用若干位作為子網號 subnet-id,當然主機號也就相應減少了同樣的位數。於是兩級IP地址在本單位內部就變為三級IP地址:網路號、子網號和主機號。也可以用以下記法來表示:
IP地址:=(<網路號>,<子網號>,<主機號>}

(3)凡是從其他網路發送給本單位某個主機的IP數據報,仍然是根據IP數據報的目的網路號找到連接在本單位網路上的路由器。但此路由器在收到IP數據報後,再按目的網路號和子網號找到目的子網,把IP數據報交付給目的主機。

簡單來說就是原來的IP地址總長度不變,把原來由「網路號+主機號」組成的IP地址,變為了「網路號+子網號+主機號」,因為其他網路找當前網路的主機時,使用的還是網路號,所以外面的網看不見當前網路的子網。當本網的路由器在收到IP數據報後,按目的網路號和子網號找到目的子網,把IP數據報交付給目的主機。

現在剩下的問題就是:假定有一個數據報(其目的地址是145.133.10)已經到達了路由器R1。那麼這個路由器如何把它轉發到子網145.3.3.0呢?
我們知道,從IP數據報的首部並不知道源主機或目的主機所連接的網路是否進行了子網的劃分。這是因為32位的IP地址本身以及數據報的首部都沒有包含任何有關子網劃分的信息。因此必須另外想辦法,這就是使用子網掩碼( (subnet mask)。

子網掩碼,簡單來說就是把除了主機號設置為0,其他位置的數字都設置為1。
以B類地址為例:

把三級IP地址的網路號與子網號連起來,與子網掩碼做「與」運算,就得到了子網的網路地址。

在網際網路的標准規定:所有的網路都必須使用子網掩碼,同時在路由器的路由表中也必須有子網掩碼這一欄。如果一個網路不劃分子網,那麼該網路的子網掩碼就使用默認子網掩碼。
那麼既然沒有子網,為什麼還要使用子網掩碼?
這就是為了更便於査找路由表。
默認子網掩碼中1的位置和IP地址中的網路號欄位 net-id正好相對應。因此,若用默認子網掩碼和某個不劃分子網的IP地址逐位相「與」(AND),就應當能夠得出該IP地址的網路地址來。這樣做可以不用查找該地址的類別位就能知道這是哪一類的IP地址。顯然,

子網掩碼是一個網路或一個子網的重要屬性。在RFC950成為網際網路的正式標准後,路由器在和相鄰路由器交換路由信息時,必須把自己所在網路(或子網)的子網掩碼告訴相鄰路由器。在路由器的路由表中的每一個項目,除了要給出目的網路地址外,還必須同時給出該網路的子網掩碼。若一個路由器連接在兩個子網上就擁有兩個網路地址和兩個子網掩碼。
以一個B類地址為例,說明可以有多少種子網劃分的方法。在採用固定長度子網時,所劃分的所有子網的子網掩碼都是相同的。

表中的「子網號的位數」中沒有0,1,15和16這四種情況,因為這沒有意義。雖然根據已成為網際網路標准協議的RFC950文檔,子網號不能為全1或全0,但隨著無分類域間路由選擇CIDR的廣泛使用,現在全1和全0的子網號也可以使用了,但一定要謹慎使用,要弄清你的路由器所用的路由選擇軟體是否支持全0或全1的子網號。這種較新的用法我們可以看出,若使用較少位數的子網號,則每一個子網上可連接的主機數就較多。
反之,若使用較多位數的子網號,則子網的數目較多但每個子網上可連接的主機數就較少因此我們可根據網路的具體情況(一共需要劃分多少個子網,每個子網中最多有多少個主機)來選擇合適的子網掩碼。

所以,劃分子網增加了靈活性,但卻減少了能夠連接在網路上的主機總數。

在劃分子網的情況下,分組轉發的演算法必須做相應的改動。
使用子網劃分後,路由表必須包含以下三項內容:目的網路地址、子網掩碼和下一跳地址。
所以之前的流程變成了下面這樣:
(1)從收到的數據報的首部提取目的IP地址D。
(2)先判斷是否為直接交付。對路由器直接相連的網路逐個進行檢查:用各網路的子網掩碼和D逐位相「與」(AND操作),看結果是否和相應的網路地址匹配。若匹配,則把分組進行直接交付(當然還需要把D轉換成物理地址,把數據報封裝成幀發送出去),轉發任務結束。否則就是間接交付,執行(3)。
(3)若路由表中有目的地址為D的特定主機路由,則把數據報傳送給路由表中所指明的下一跳路由器;否則,執行(4)。
(4)對路由表中的每一行(目的網路地址,子網掩碼,下一跳地址),用其中的子網掩碼和D逐位相「與」(AND操作),其結果為N。若N與該行的目的網路地址匹配,則把數據報傳送給該行指明的下一跳路由器;否則,執行(5)。
5)若路由表中有一個默認路由,則把數據報傳送給路由表中所指明的默認路由器;否則,執行(6)
(6)報告轉發分組出錯。

㈣ 計算機網路偏移量怎麼算

舉例說明:考慮發送一個1300位元組的數據報到MTU為 500位元組的鏈路中(B)。 • A、產生三個分片,偏移量為0,460,920 • B、產生三個分片,偏移量為0,60,120 • C、產生三個分片,偏移量為0,500,1000 • D、以上答案都不正確。

答案是A:偏移量的意思就是這個數據包是從源數據包哪個地方開始的,因為IP報文有40個位元組的IP報文頭,所以1300個位元組的數據會被分成以下三個包:
A數據包:包含40個位元組的IP報文頭,0-460位元組的數據,偏移量為0;
B數據包:包含40個位元組的IP報文頭,460-920位元組的數據,偏移量為460;
C數據包:包含40個位元組的IP報文頭,920-1300位元組的數據,偏移量為920

㈤ 計算機網路中片偏移可以為小數嗎

不可以,片偏移是通過求余數算出來的,而被除數和除數都不可能是小數,都是數據塊的位元組序號

㈥ 求解計算機網路,ip數據報里的offset可以是小數嗎例如380/8

IP數據包里的OFFSET應該是分組偏移量,以8位元組為單位,不能是小數。另外380/8=47也不是小數啊

㈦ 計算機里偏移地址怎麼說

所謂偏移,就是有一個地方為標准,別位置到該位置單位數量。計算機里也如此。就是從某地址到已知地址單位數。計算機中最基本的存儲單元是位元組。

㈧ 計算機網路(四)網路層

主要任務是把分組從源端傳到目的端,為分組交換網上的不同主機提供通信服務。網路層傳輸單位是數據報。

鏈路層數據幀可封裝數據的上限稱為最大傳送單元MTU

標識:同一數據報的分片使用同一標識。

中間位DF(Don』t Fragment):

最低位MF(More Fragment):

片偏移:指出較長分組分片後,某片在原分組中的相對位置。以8B為單位。除了最後一個分片,每個分片長度一定是8B的整數倍。

IP地址:全世界唯一的32位/4位元組標識符,標識路由器主機的介面。IP地址::={<網路號>,<主機號>}

有一些IP地址是不能用的,有其特殊的作用,如:

網路地址轉換NAT(Network Address Translation):在專用網連接到網際網路的路由器上安裝NAT軟體,安裝了NAT軟體的路由器叫NAT路由器,它至少有一個有效的外部全球IP地址。

此外,為了網路安全,劃分出了部分IP地址和私有IP地址,私有IP地址網段如下:

路由器對目的地址是私有IP地址的數據報一律不進行轉發。

分類的IP地址的弱點:

某單位劃分子網後,對外仍表現為一個網路,即本單位外的網路看不見本單位內子網的劃分。

路由器轉發分組的演算法:

無分類域間路由選擇CIDR:

CIDR記法:IP地址後加上「/」,然後寫上網路前綴(可以任意長度)的位數。e.g. 128.14.32.0/20

CIDR把網路前綴都相同的連續的IP地址組成一個「CIDR地址塊」。

使用CIDR時,查找路由表可能得到幾個匹配結果(跟網路掩碼按位相與),應選擇具有最長網路前綴的路由。前綴越長,地址塊越小,路由越具體。

將多個子網聚合成一個較大的子網,叫做構成超網,或路由聚合。方法:將網路前綴縮短(所有網路地址取交集)。

由於在實際網路的鏈路上傳送數據幀時,最終必須使用MAC地址。

ARP協議:完成主機或路由器IP地址到MAC地址的映射。

ARP協議使用過程:

ARP協議4種典型情況:

動態主機配置協議DHCP是 應用層 協議,使用 客戶/伺服器 方式,客戶端和服務端通過 廣播 方式進行交互,基於 UDP

DHCP提供即插即用聯網的機制,主機可以從伺服器動態獲取IP地址、子網掩碼、默認網關、DNS伺服器名稱與IP地址,允許地址重用,支持移動用戶加入網路,支持在用地址續租。

DHCP工作流程如下:

ICMP協議支持主機或路由器:包括差錯(或異常)報告和網路探詢,分部發送特定ICMP報文

ICMP差錯報告報文(5種):

不應發送ICMP差錯報文的情況:

ICMP詢問報文:

ICMP的應用:

32位IPv4地址空間已分配殆盡,這時,可以採用更大地址空間的新版本的IPv6,從根本上解決地址耗盡問題

IPv6數據報格式如下圖

IPv6的主要特點如下:

IPv6地址表示形式:

零壓縮:一連串連續的0可以被一對冒號取代。雙冒號表示法在一個地址中僅可出現一次。

IPv6基本地址類型:

IPv6向IPv4過渡的策略:

R1的路由表/轉發表如下:

最佳路由:「最佳」只能是相對於某一種特定要求下得出的較為合理的選擇而已。

路由演算法可分為

由於網際網路規模很大且許多單位不想讓外界知道自己的路由選擇協議,但還想連入網際網路,可以採用自治系統來解決

自治系統AS:在單一的技術管理下的一組路由器,而這些路由器使用一種AS內部的路由選擇協議和共同的度量以確定分組在該AS內的路由,同時還使用一種AS之間的路由協議以確定在AS之間的路由。

一個AS內的所有網路都屬於一個行政單位來管轄,一個自治系統的所有路由器在本自治系統內都必須連通。

路由選擇協議

RIP是一種分布式的基於距離向量的路由選擇協議,是網際網路的協議標准,最大優點是簡單。

RIP協議要求網路中每一個路由器都維護從它自己到其他每一個目的網路的唯一最佳距離 [1] 記錄(即一組距離)。 RIP協議只適用於小互聯網。

RIP是應用層協議,使用 UDP 傳送數據。一個RIP報文最多可包括25個路由,如超過,必須再用一個RIP報文傳送。

RIP協議的交換

路由器剛開始工作時,只知道直接連接的網路的距離(距離為1),接著每一個路由器也只和數目非常有限的相鄰路由器交換並更新路由信息。

經過若干次更新後,所有路由器最終都會知道到達本自治系統任何一個網路的最短距離和下一跳路由器的地址,即「收斂」。

RIP的特點:當網路出現故障時,要經過比較長的時間(例如數分鍾) 才能將此信息傳送到所有的路由器,「慢收斂」。

對地址為X的相鄰路由器發來的RIP報文,修改此報文中的所有項目:把「下一跳」欄位中的地址改為X,並把所有的「距離」欄位+1。

開放最短路徑優先OSPF協議:「開放」標明OSPF協議不是受某一家廠商控制,而是公開發表的;「最短路徑優先」是因為使用了Dijkstra提出的最短路徑演算法SPF。OSPF最主要的特徵就是使用分布式的鏈路狀態協議。 OSPF直接用IP數據報傳送。

OSPF的特點:

為了使OSPF 能夠用於規模很大的網路,OSPF 將一個自治系統再劃分為若干個更小的范圍,叫做區域。每一個區域都有一個32 位的區域標識符(用點分十進製表示)。區域也不能太大,在一個區域內的路由器最好不超過200 個。

BGP 所交換的網路可達性的信息就是要到達某個網路所要經過的一系列AS。當BGP 發言人互相交換了網路可達性的信息後,各BGP 發言人就根據所採用的策略從收到的路由信息中找出到達各AS 的較好路由。

一個BGP 發言人與其他自治系統中的BGP 發言人要交換路由信息,就要先建立TCP 連接,即通過TCP傳送,然後在此連接上交換BGP 報文以建立BGP 會話(session),利用BGP 會話交換路由信息。 BGP是應用層協議,藉助TCP傳送。

BGP協議特點:

BGP-4的四種報文

組播提高了數據傳送效率。減少了主幹網出現擁塞的可能性。組播組中的主機可以是在同一個物理網路,也可以來自不同的物理網路(如果有組播路由器的支持)。

IP組播地址讓源設備能夠將分組發送給一組設備。屬於多播組的設備將被分配一個組播組IP地址(一群共同需求主機的相同標識)。

組播地址范圍為224.0.0.0~239.255.255.255(D類地址),一個D類地址表示一個組播組。只能用作分組的目標地址。源地址總是為單播地址。

同單播地址一樣,組播IP地址也需要相應的組播MAC地址在本地網路中實際傳送幀。組播MAC地址以十六進制值01-00-5E打頭,餘下的6個十六進制位是根據IP組播組地址的最後23位轉換得到的。

TCP/IP 協議使用的乙太網多播地址的范圍是:從01-00-5E-00-00-00到01-00-5E-7F-FF-FF .

收到多播數據報的主機,還要在IP 層利用軟體進行過濾,把不是本主機要接收的數據報丟棄。

ICMP和IGMP都使用IP數據報傳遞報文。組播路由器知道的成員關系只是所連接的區域網中有無組播組的成員。

IGMP工作的兩個階段:

只要有一個主機對某個組響應,那麼組播路由器就認為這個組是活躍的;如果經過幾次探詢後沒有一個主機響應,組播路由器就認為本網路上的沒有此組播組的主機,因此就不再把這組的成員關系發給其他的組播路由器。

組播路由協議目的是找出以源主機為根節點的組播轉發樹。構造樹可以避免在路由器之間兜圈子。對不同的多播組對應於不同的多播轉發樹;同一個多播組,對不同的源點也會有不同的多播轉發樹。

組播路由選擇協議常使用的三種演算法:

移動IP技術是移動結點(計算機/伺服器等)以 固定的網路IP地址 ,實現跨越不同網段的 漫遊 功能,並保證了基於網路IP的網路許可權在漫遊過程中不發生任何改變。

路由器是一種具有多個輸入埠和多個輸出埠的專用計算機,其任務是轉發分組。

若路由器處理分組的速率趕不上分組進入隊列的速率,則隊列的存儲空間最終必定減少到零,這就使後面再進入隊列的分組由於沒有存儲空間而只能被丟棄。 路由器中的輸入或輸出隊列產生溢出是造成分組丟失的重要原因。

路由器(網路層)可以互聯兩個不同網路層協議的網段。
網橋(鏈路層)可以互聯兩個物理層和鏈路層不同的網段。
集線器(物理層)不能互聯兩個物理層不同的網段。

路由表根據路由選擇演算法得出的,主要用途是路由選擇,總用軟體來實現。

轉發表由路由表得來,可以用軟體實現,也可以用特殊的硬體來實現。轉發表必須包含完成轉發功能所必需的信息,在轉發表的每一行必須包含從要到達的目的網路到輸出埠和某些MAC地址信息的映射。

㈨ 計算機組成原理中的位移量和偏移量

偏移地址即有效地址EA(邏輯地址),尋找的實際物理地址就是段地址*10H+偏移地址。若操作數的定址方式是......相對尋,則位移量就是構成偏移地址的一部分