IP報(bào)文分段和重組模擬實(shí)現(xiàn)_第1頁(yè)
IP報(bào)文分段和重組模擬實(shí)現(xiàn)_第2頁(yè)
IP報(bào)文分段和重組模擬實(shí)現(xiàn)_第3頁(yè)
IP報(bào)文分段和重組模擬實(shí)現(xiàn)_第4頁(yè)
IP報(bào)文分段和重組模擬實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩59頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

分層協(xié)議示例-IP報(bào)文分段和重組模擬Host功能描述-1業(yè)務(wù)邏輯層的功能登錄維護(hù)當(dāng)前所有已登錄Host的信息退出登錄傳輸文件Host功能描述-2消息分段重組層的功能

消息分段根據(jù)當(dāng)前配置的消息所限定的最大長(zhǎng)度,對(duì)所有消息進(jìn)行分段消息分段重組對(duì)收到的消息分段進(jìn)行重組,恢復(fù)原始消息Host功能描述-3消息發(fā)送與接收層的功能

消息的錯(cuò)序模擬IP網(wǎng)絡(luò)可能發(fā)生的錯(cuò)序現(xiàn)象消息的丟失

模擬IP網(wǎng)絡(luò)可能發(fā)生的分組丟失現(xiàn)象消息的發(fā)送和接收

Forwarder功能描述-2消息分段重組層功能

消息的再分段余同HostForwarder功能描述-3消息發(fā)送與接收層功能

消息轉(zhuǎn)發(fā)根據(jù)消息中的源Host和目的Host的地址,進(jìn)行文件傳輸消息轉(zhuǎn)發(fā)消息的錯(cuò)序消息的丟失消息的發(fā)送和接收分層協(xié)議棧網(wǎng)絡(luò)層應(yīng)用層傳輸層網(wǎng)絡(luò)層應(yīng)用層傳輸層網(wǎng)絡(luò)層源主機(jī)目的主機(jī)路由器業(yè)務(wù)邏輯層消息分段重組層消息發(fā)送與接收層業(yè)務(wù)邏輯層消息分段重組層消息發(fā)送與接收層業(yè)務(wù)邏輯層消息分段重組層消息發(fā)送與接收層IP協(xié)議棧

應(yīng)用層協(xié)議棧

HostForwarderHost協(xié)議棧數(shù)據(jù)封裝分段重組消息頭部業(yè)務(wù)邏輯消息分段重組消息業(yè)務(wù)邏輯頭部分層協(xié)議定義-分段重組層消息verhlensrc_ipdest_ipidMoffsetprotocolver—協(xié)議版本,2比特。hlen—協(xié)議頭部長(zhǎng)度,6比特。src_ip—源IP,32比特。dest_ip—目的IP,32比特。id—分段重組消息ID,16比特。M—更多消息指示位,2比特,其中01表示有更多消息分段,00表示當(dāng)前分段是最后一個(gè)分段,最高比特位保留。offset—分段在原始數(shù)據(jù)塊中的偏移,6比特。protocol—上層協(xié)議,8比特分層協(xié)議定義-業(yè)務(wù)邏輯層消息typelen業(yè)務(wù)消息內(nèi)容type—業(yè)務(wù)消息類別,8比特。

len—業(yè)務(wù)消息總長(zhǎng)度,包含type和len字段以及后續(xù)業(yè)務(wù)消息內(nèi)容,8比特。業(yè)務(wù)邏輯層消息-登錄typelenusertype—為1。

user—登錄名,8字節(jié),其中登錄名占7字節(jié),最后一字節(jié)為’\0’業(yè)務(wù)邏輯層消息-登錄轉(zhuǎn)發(fā)typelenuseriptype—為2。

user—登錄名,8字節(jié),其中登錄名占7字節(jié),最后一字節(jié)為’\0’ip—此登錄用戶對(duì)應(yīng)的IP地址,4字節(jié)。

業(yè)務(wù)邏輯層消息-退出登錄typelenusertype—為4。user—登錄名,8字節(jié),其中登錄名占7字節(jié),最后一字節(jié)為’\0’業(yè)務(wù)邏輯層消息-文件傳輸typelenuserfilenametype—為5。user—文件發(fā)送方Host的登錄名

filename—被傳輸?shù)奈募拿?,變長(zhǎng)。

業(yè)務(wù)邏輯層消息-文件傳輸結(jié)束typelenuserfilenametype—為6。user—文件發(fā)送方Host的登錄名

filename—被傳輸?shù)奈募拿?,變長(zhǎng)。

業(yè)務(wù)邏輯層消息-允許文件傳輸typelenuserfilenametype—為7。user—文件接收方Host的登錄名

filename—被傳輸?shù)奈募拿?,變長(zhǎng)。

業(yè)務(wù)邏輯層消息-文件塊typelenuserdatatype—為8。user—文件發(fā)送方Host的登錄名

data—文件數(shù)據(jù)塊。

IP報(bào)文分段和重組模擬程序模擬程序的文件構(gòu)成host.cforwarder.cmsg.hlist.happtimer.capptimer.hmsg.confMakefilemsg.conf

#SHUFFLEdo_shuffle=1

/*混淆分段*/#DROPdo_drop=0

/*禁止丟失分段的模擬*/frags_drop:4-5-6#TIMERcountdown=300

/*未重組成功的分段回收超時(shí)時(shí)間*/#PMTUpmtu=64

/*允許發(fā)生的分段最大長(zhǎng)度*/#NICdev=eth1

/*網(wǎng)卡編號(hào)*/

Host文件發(fā)送工作流程登錄開(kāi)始選擇目標(biāo)用戶發(fā)送begin_trans消息發(fā)送文件發(fā)送end_trans消息收到ready消息?退出?NY結(jié)束N

Host文件接收工作流程登錄開(kāi)始收到begin_trans消息接收數(shù)據(jù)并寫(xiě)入文件創(chuàng)建mfn并發(fā)送ready消息收到end_trans消息?NY結(jié)束關(guān)閉文件文件傳輸完整過(guò)程forwardLOGIN_MSG分段重組層消息verhlensrc_ipdest_ipidMoffsetprotocoltypelen業(yè)務(wù)消息內(nèi)容msg_hdr(13bytes)2bytes變長(zhǎng)業(yè)務(wù)消息包括:登錄、登錄轉(zhuǎn)發(fā)、文件傳輸、......限定每個(gè)分段重組層消息的最大長(zhǎng)度為255字節(jié)分段重組層攜帶的數(shù)據(jù)大小必須滿足4字節(jié)邊界最小MTU值為17字節(jié)(13字節(jié)頭部+4字節(jié)數(shù)據(jù))2bits6bits1byte消息分段示例typelen業(yè)務(wù)消息內(nèi)容2bytes240bytes僅首個(gè)分段包含業(yè)務(wù)層消息頭…N=?msg_hdrmsg_hdr......Host程序功能模塊Host登錄與退出用戶列表維護(hù)登錄轉(zhuǎn)發(fā)處理文件接收消息分段消息重組消息接收消息發(fā)送業(yè)務(wù)邏輯模塊消息處理模塊文件發(fā)送Host程序多線程框架

input_msg_queuelogin_msg_queue登錄相關(guān)消息消息入隊(duì)列消息出隊(duì)列主線程消息重組線程用戶交互線程寫(xiě)文件非登錄消息接收應(yīng)答消息分段發(fā)送文件用戶交互消息分段Host程序流程登錄處理登錄者構(gòu)造并發(fā)出登錄消息LOGIN_MSGlogin->make_login_msg

轉(zhuǎn)發(fā)器處理并轉(zhuǎn)發(fā)登錄消息FWD_LOGIN_MSGapp_do_login->make_fwd_login_msgapp_do_login->map_username轉(zhuǎn)發(fā)器向登錄者返回登錄應(yīng)答消息REPLY_MSGapp_do_login->make_reply_msg在線用戶處理登錄轉(zhuǎn)發(fā)消息FWD_LOGIN_MSGapp_do_fwd_login->map_username登錄者處理登錄應(yīng)答消息REPLY_MSGapp_do_reply->map_usernameuser_hashuser_queue用戶登錄make_login_msgintmake_login_msg(u8*sbuf,u8*name){structlogin*p_login;p_login=(structlogin*)sbuf;p_login->h.type=LOGIN_MSG;p_login->h.len=AH_SIZE+NAMESIZE;

memcpy(p_login->user,name,NAMESIZE);returnp_login->h.len;}app_do_replyForwarder登錄處理流程向其他Host轉(zhuǎn)發(fā)此消息消息類別?刪除對(duì)應(yīng)Host記錄登錄應(yīng)答登錄退出登錄Y退出?結(jié)束N取下一消息開(kāi)始收到消息的目的地址匹配自身的地址user_hashuser_queuefn_hash登錄退出Forwarder轉(zhuǎn)發(fā)處理流程自身是目的?轉(zhuǎn)發(fā)此消息Y取下一消息開(kāi)始

退出?N圖7-7結(jié)束NYHost消息處理模塊消息處理模塊的核心功能就是從網(wǎng)絡(luò)上接收Forwarder發(fā)來(lái)的各種消息,并由分段重組層進(jìn)行消息分段的重組,然后將重組完畢的消息交給業(yè)務(wù)邏輯層進(jìn)行業(yè)務(wù)處理。此外消息處理還負(fù)責(zé)業(yè)務(wù)消息的發(fā)送

Host消息接收流程接收消息開(kāi)始消息入隊(duì)列input_msg_queue退出?結(jié)束NYHost對(duì)收到消息的進(jìn)一步處理從input_msg_queue取下一消息開(kāi)始處理非登錄業(yè)務(wù)邏輯消息重組消息NY結(jié)束登錄消息?消息入登錄隊(duì)列l(wèi)ogin_msg_queue退出?YN目的主機(jī)?YN構(gòu)造業(yè)務(wù)邏輯層消息開(kāi)始計(jì)算剩余分段大小拷貝分段數(shù)據(jù)加入分段隊(duì)列frag_queue預(yù)分段完畢?結(jié)束YN從隊(duì)列frag_queue取下一分段計(jì)算該分段偏移設(shè)置分段重組層協(xié)議頭部完畢?YNHost消息分段處理流程預(yù)分段Host消息重組流程查找該消息分段對(duì)應(yīng)的mfq結(jié)構(gòu)體開(kāi)始找到?創(chuàng)建mfq獲得該分段消息的M_OFFSET字段最高2bit位計(jì)算該消息的起始偏移量計(jì)算該消息的結(jié)束偏移量將該分段插入到分段鏈表的正確位置滿足重組條件?重組并返回重組后的原始消息結(jié)束返回NULLYNYN結(jié)束消息類別?開(kāi)始從登錄消息隊(duì)列l(wèi)ogin_msg_queue中取下一消息登錄應(yīng)答消息登錄轉(zhuǎn)發(fā)消息退出登錄消息創(chuàng)建已登錄Host列表顯示已登錄Host列表選擇目標(biāo)Host添加Host刪除Host退出?YN發(fā)送文件發(fā)送文件的流程請(qǐng)參見(jiàn)圖7-5Host用戶交互處理流程

Forwarder程序功能模塊Forwarder登錄與退出用戶列表維護(hù)登錄轉(zhuǎn)發(fā)處理消息分段與再分段消息重組消息接收消息發(fā)送業(yè)務(wù)邏輯模塊消息處理模塊消息轉(zhuǎn)發(fā)Forwarder再分段-1

開(kāi)始計(jì)算剩余分段大小拷貝分段數(shù)據(jù)加入分段隊(duì)列frag_queue再分段完畢?YN獲得再分段前該收到消息的M_OFFSET字段的高2bit位計(jì)算再分段前該消息的起始偏移量1Forwarder再分段-2

設(shè)置標(biāo)志not_last_frag從分段隊(duì)列frag_queue中取下一消息重新設(shè)置該分段的分段重組層頭部MF位及其他有關(guān)字段計(jì)算該消息的相對(duì)分段偏移值處理完畢?YN結(jié)束1Forwarder登錄應(yīng)答

開(kāi)始獲得登錄Host的用戶名、IP和端口創(chuàng)建登錄應(yīng)答消息轉(zhuǎn)發(fā)完畢?YN更新該Host的IP和端口Host已存在?建立新Host從已登錄Host表中取下一個(gè)Host向該Host發(fā)送登錄轉(zhuǎn)發(fā)消息向該新登錄Host發(fā)送登錄應(yīng)答消息結(jié)束YN消息錯(cuò)序和丟失模擬

開(kāi)始產(chǎn)生一個(gè)小于當(dāng)前待發(fā)送分段數(shù)的隨機(jī)序號(hào)數(shù)N待處理分段數(shù)減1完畢?將該N序號(hào)分段加入到shuffled_frag_queue隊(duì)列尾部YN從frag_queue分段消息隊(duì)列中移除第N號(hào)分段結(jié)束關(guān)鍵數(shù)據(jù)結(jié)構(gòu)-1

structmsg_buff{ /*消息定義*/u8*data; /*消息數(shù)據(jù)指針*/intmsg_len; /*消息長(zhǎng)度*/

#ifdefFORWARDERstructsockaddr_insk_addr;#endifu16offset; /*消息分段在原始消息中的偏移值*/u16PREV_OLAP; /*當(dāng)前消息分段和前一個(gè)分段重疊大小*/u16NEXT_OLAP; /*當(dāng)前消息分段和后一個(gè)分段重疊大小*/structmsg_buff*next; /*消息分段鏈表*/

structlist_headlist; /*消息隊(duì)列input_msg_queue

*/};關(guān)鍵數(shù)據(jù)結(jié)構(gòu)-2msg_buffmsg_buff……input_msg_queuedatabufferdatabufferdatadata關(guān)鍵數(shù)據(jù)結(jié)構(gòu)-3[hashcode]=1saddrdaddrprotocolIDfragssaddrdaddrprotocolIDfrags[hashcode]=9分段M=1分段M=1分段M=1分段M=0…structmfq……mfq_hash[HQ_HASHSZ]structmfqnextnextnext關(guān)鍵數(shù)據(jù)結(jié)構(gòu)-3

structhlist_headmfq_hash[HQ_HASHSZ];structmfq{structhlist_nodehlist; /*哈希鏈表*/

structlist_headlru_list; /*最近使用過(guò)鏈表*/u32src; /*發(fā)送此消息的源用戶IP*/u32dest; /*接收此消息的目的用戶IP*/u16id; /*消息id*/u8protocol; /*上層協(xié)議*/u8last_in;/*最后分段到達(dá)標(biāo)志*/structmsg_buff*frags; /*已接收消息分段鏈表*/intlen; /*原始消息的總長(zhǎng)度*/intmeat; /*實(shí)際收到的消息分段的累計(jì)長(zhǎng)度*/structapp_timertimer; /*垃圾回收定時(shí)器*/};關(guān)鍵數(shù)據(jù)結(jié)構(gòu)-4ipnameporthlistlist[hashcode]=1[hashcode]=9ipnameporthlistliststruct

usermap……structusermapuser_hash[HQ_HASHSZ]ipnameporthlistlistuser_queue…關(guān)鍵數(shù)據(jù)結(jié)構(gòu)-4structusermap{structhlist_nodehlist;structlist_headlist;u32ip;#ifdefFORWARDERu16port;#endifu8name[NAMESIZE];};關(guān)鍵數(shù)據(jù)結(jié)構(gòu)-5user*fphlist[hashcode]=1[hashcode]=9user*fphliststruct

mfn……structmfnfn_hash[HQ_HASHSZ]user*fphlistlist…關(guān)鍵數(shù)據(jù)結(jié)構(gòu)-5structhlist_headfn_hash[HQ_HASHSZ];structmfn{structhlist_nodehlist;u8user[NAMESIZE];FILE*fp;};關(guān)鍵數(shù)據(jù)結(jié)構(gòu)-6structmsg_hdr{ /*分段重組消息頭部*/u8 hlen:6, /*消息頭部長(zhǎng)度*/ ver:2; /*消息版本*/u32src; /*源用戶IP*/u32dest; /*目標(biāo)用戶IP*/u16id; /*分段id*/u8 frag_off; /*分段標(biāo)志和分段偏移*/u8 protocol; /*上層協(xié)議*/};structapp_hdr{ /*業(yè)務(wù)邏輯層消息頭部*/u8type; /*業(yè)務(wù)邏輯層消息類型*/u8len; /*業(yè)務(wù)邏輯層消息長(zhǎng)度*/};業(yè)務(wù)邏輯層消息定義-1structlogin{ /*登錄消息*/structapp_hdrh;u8user[NAMESIZE];};structlogin_fwd{ /*登錄轉(zhuǎn)發(fā)消息*/structapp_hdrh;u8user[NAMESIZE];u32ip;};structlogin_reply{ /*登錄應(yīng)答消息*/structapp_hdrh;u8user[NAMESIZE];u32ip;u8others[0]; /*已登錄用戶及其IP地址從此開(kāi)始*/};業(yè)務(wù)邏輯層消息定義-2structlogin_exit{ /*退出登錄消息*/structapp_hdrh;u8user[NAMESIZE];};structbegin_trans{ /*開(kāi)始文件傳輸消息*/structapp_hdrh;u8user[NAMESIZE];u8file[256]; /*文件名*/};structend_trans{ /*結(jié)束文件傳輸消息*/structapp_hdrh;u8user[NAMESIZE];u8file[256]; /*文件名*/};structready{ /*允許文件傳輸消息*/structapp_hdrh;u8user[NAMESIZE];u8file[256]; /*文件名*/};structdatablock{ /*文件塊*/structapp_hdrh;u8user[NAMESIZE];u8data[0];};業(yè)務(wù)邏輯層消息定義-3最大255字節(jié)msg_hdrapp_hdrapp_dataIP報(bào)文分段和重組模擬場(chǎng)景hostForwarderhostuser890user789mtu=17mtu=32testfile

user789向user890發(fā)送文件testfile

user890和Forwarder的mtu均設(shè)為17字節(jié),而user789的mtu為

32字節(jié)

user789發(fā)出的消息首先就按32字節(jié)進(jìn)行分段,然后Forwarder將對(duì)32字節(jié)的消息分段按17字節(jié)進(jìn)行再分段處理模擬程序的編譯all:hostforwarderhost:host.oapptimer.o

gcc-g-ohosthost.oapptimer.o-lpthread-std=gnu99

host.o:msg.hlist.hhost.c

gcc-g-chost.c-std=gnu99

forwarder:forwarder.oapptimer.o

gcc-g-oforwarderforwarder.oapptimer.o–lpthread-std=gnu99

forwarder.o:msg.hlist.hforwarder.c

gcc-g-cforwarder.c-std=gnu99

apptimer.o:apptimer.hlist.happtimer.cgcc-capptimer.c-std=gnu99Forwarder的啟動(dòng)$./forwarder192.168.1.1379000loadingtheconfigfile...shufflefunctionisenabled!dropfragsfunctionisdisabled!thetimerofmfq'scountdownnumber:300sthePMTU:17#SHUFFLEdo_shuffle=1#DROPdo_drop=0frags_drop:4-5-6#TIMERcountdown=300#PMTUpmtu=17登錄Forwarder-1$./host192.168.1.1379000user890loadingtheconfigfile...shufflefunctionisenabled!dropfragsfunctionisdisabled!thetimerofmfq'scountdownnumber:300sthePMTU:17[0]MORE[1]user789

pleasechooseoneusertobeginFragmentationexercise:#SHUFFLEdo_shuffle=1#DROPdo_drop=0frags_

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論