




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第二章 操作系統(tǒng)中的TCP/IP軟件結(jié)構(gòu) 1 進(jìn)程問(wèn)題: A 進(jìn)程概念:一個(gè)進(jìn)程就是一次計(jì)算過(guò)程,并且獨(dú)立于其他計(jì)算過(guò)程。 B 進(jìn)程調(diào)度策略:CPU對(duì)沒(méi)有被阻塞的進(jìn)程賦予最高優(yōu)先級(jí),如多個(gè)進(jìn)程優(yōu)先級(jí)相同則在其中快速切換。 C 進(jìn)程通信的三種機(jī)制: 1. 計(jì)數(shù)信號(hào)量通用進(jìn)程同步機(jī)制 2. 端口 3. 消息傳遞 D 生產(chǎn)者消費(fèi)者問(wèn)題: 1. 生產(chǎn)者生產(chǎn)數(shù)據(jù)報(bào),放入數(shù)據(jù)報(bào)隊(duì)列中,消費(fèi)者從隊(duì)列中提取數(shù)據(jù)報(bào),消費(fèi)數(shù)據(jù)。 2. 信號(hào)量初始化: S1=screate(N); / 初始化生產(chǎn)者信號(hào)量 S2=screate(0);/初始化消費(fèi)者信號(hào)量生產(chǎn)者執(zhí)行:wait(s1) . Singal(s2) 消費(fèi)者
2、執(zhí)行:wait(s2) . Singal(s1) 3. 隊(duì)列全滿時(shí)生產(chǎn)者阻塞,隊(duì)列全空時(shí)消費(fèi)者阻塞,其他情況兩進(jìn)程正常運(yùn)行。 E 端口通信: 端口: 即消息隊(duì)列,該隊(duì)列有兩個(gè)控制訪問(wèn)量,亦適用了信號(hào)量機(jī)制。 端口全滿psend() 進(jìn)程阻塞,全空precieve()阻塞。 F 消息傳送: 消息傳送允許一個(gè)進(jìn)程直接將消息發(fā)送給另外一個(gè)進(jìn)程。 進(jìn)程通過(guò)send()發(fā)送消息,以進(jìn)程標(biāo)識(shí)號(hào)和一個(gè)消息做入口參數(shù);receive()等待接收消息,它被阻塞直到某消息到達(dá),調(diào)用send()函數(shù)的進(jìn)程持續(xù)運(yùn)行,連續(xù)兩次調(diào)用send()無(wú)receive函數(shù)接收返回SYSERR,消息無(wú)法發(fā)送。可以調(diào)用recvclr
3、()函數(shù)刪除等待隊(duì)列中的所有消息。2. 數(shù)據(jù)傳輸問(wèn)題 A 協(xié)議內(nèi)部數(shù)據(jù)傳輸: 一旦IP進(jìn)程接受了一個(gè)傳入數(shù)據(jù)報(bào),它必須決定將其發(fā)往何處做進(jìn)一步處理,根據(jù)其內(nèi)容再將其交付給指定的進(jìn)程。如:將數(shù)據(jù)交給TCP或UDP。 B 與操作系統(tǒng)數(shù)據(jù)傳輸: 系統(tǒng)具有從各個(gè)網(wǎng)絡(luò)接口讀取分組的能力,為每一個(gè)網(wǎng)絡(luò)硬件設(shè)備提供一個(gè)輸入隊(duì)列,當(dāng)有分組到達(dá)時(shí),發(fā)生中斷并調(diào)用send()給IP進(jìn)程發(fā)送消息,唯一的IP進(jìn)程從所有隊(duì)列中提取數(shù)據(jù)報(bào)進(jìn)行處理。第3章 網(wǎng)絡(luò)接口層 網(wǎng)絡(luò)接口層: 管理網(wǎng)絡(luò)的硬件,完成從IP地址到硬件地址的映射過(guò)程,封裝并發(fā)送分組,接收傳入分組并將其發(fā)往對(duì)應(yīng)的模塊。網(wǎng)絡(luò)接口的抽象模型,使得上層協(xié)議與硬件細(xì)
4、節(jié)無(wú)關(guān).A:偽網(wǎng)絡(luò)接口問(wèn)題: 1 使用的是0號(hào) 還是1號(hào) ? 0號(hào) 2 為什么說(shuō)偽網(wǎng)絡(luò)接口在數(shù)據(jù)傳輸中有重要作用 ? 偽網(wǎng)絡(luò)接口既沒(méi)有與之相關(guān)的設(shè)備驅(qū)動(dòng)程序,也沒(méi)有具體的硬件設(shè)施。 發(fā)往偽網(wǎng)絡(luò)接口的數(shù)據(jù)報(bào)將轉(zhuǎn)交給本機(jī)的協(xié)議軟件;當(dāng)協(xié)議軟件生成一個(gè)需要發(fā)送出去的數(shù)據(jù)報(bào)時(shí),通過(guò)偽網(wǎng)絡(luò)接口將此數(shù)據(jù)報(bào)傳遞給IP.設(shè)立偽網(wǎng)絡(luò)接口的優(yōu)點(diǎn): 1. 消除了特殊情況的存在,簡(jiǎn)化了IP程序. 2. 使得本機(jī)在路由器表中的表示方法與其他目的站的表示方法完全一致. 3. 使得網(wǎng)絡(luò)管理員能夠像查詢其它接口一樣方便查詢本地接口. B:如何通過(guò)網(wǎng)絡(luò)接口地址求網(wǎng)絡(luò)號(hào)?(P2728頁(yè)代碼) /* ni_in.c 傳入分組的多路
5、分解 (2006.4.5) */#include #include #include /#include int arp_in(struct netif*,struct ep*);int rarp_in(struct netif*,struct ep*);int ip_in(struct netif*,struct ep*);int ni_in(struct netif *pni,struct ep *pep,unsigned len) int rv; pep-ep_ifn = pni - &nif0;/用當(dāng)前端口的地址減去0端口的地址得到端口號(hào) 答題重點(diǎn) pni-ni_ioctets +=
6、len;/累加收到的總字節(jié) /判斷是否為廣播分組,累加相應(yīng)的計(jì)數(shù)器 if (!memcmp(pni-ni_hwa.ha_addr,pep-ep_dst,EP_ALEN) pni-ni_iucast+;/廣播包 else pni-ni_inucast+;/非廣播包 /多路分解的實(shí)現(xiàn) switch (net2hs(pep-ep_type) case EPT_ARP: rv = arp_in(pni,pep);break; case EPT_RARP: rv = rarp_in(pni,pep);break; case EPT_IP: rv = ip_in(pni,pep);break; defau
7、lt:/不是這三種協(xié)議,則拋棄包 pni-ni_iunkproto+; free(pep);/用c庫(kù)中的free釋放,分配的時(shí)候也用malloc rv = OK; return rv;第4章 地址的發(fā)現(xiàn)與綁定 ARP1,ARP高速緩存結(jié)構(gòu)問(wèn)題:A,為什么使用單一的高速緩存結(jié)構(gòu),它的優(yōu)缺點(diǎn)如何? 答:為了正確的闡述ARP協(xié)議規(guī)范,并且保證綁定正確且能滿足高效性!優(yōu)點(diǎn):高速緩存分配能隨網(wǎng)絡(luò)動(dòng)態(tài)的變化。缺點(diǎn):網(wǎng)絡(luò)接口的獨(dú)立性較差,頻繁使用的網(wǎng)絡(luò)接口的綁定占據(jù)了大部分高速緩存時(shí),高速緩存總是保持著100%的含量,查找到某表項(xiàng)的概率很小。 B,ARP高速緩存結(jié)構(gòu)問(wèn)題?structarpentry sho
8、rtae_state;/* 表現(xiàn)狀態(tài)*/shortae_hwtype;/* 硬件類(lèi)型*/shortae_prtype;/* 協(xié)議類(lèi)型*/charae_hwlen;/* 硬件地址長(zhǎng)度*/charae_prlen;/*協(xié)議地址長(zhǎng)度*/struct netif *ae_pni;/* 接口結(jié)構(gòu)指針*/intae_queue;/* 此地址的包的隊(duì)列*/intae_attempts;/* 已發(fā)送綁定請(qǐng)求次數(shù)*/intae_ttl;/* 生存值*/u_charae_hwaMAXHWALEN;/* 硬件地址*/u_charae_praMAXPRALEN;/* 協(xié)議地址*/;ae_state具有三種狀態(tài)AS_F
9、REE此表項(xiàng)當(dāng)前空閑,AS_PEDING此表項(xiàng)正在使用,但還未找到綁定,在此種狀態(tài)中ae_attempts表示該表項(xiàng)請(qǐng)求分組被廣播的次數(shù);AS_RESOLVED狀態(tài)表示此表項(xiàng)正在使用且綁定正確。ae_ttl表示在該表項(xiàng)需要被刪除時(shí)還能保持多長(zhǎng)時(shí)間。ae_quee指向分組隊(duì)列,當(dāng)相應(yīng)的ARP相應(yīng)分組到達(dá)后,隊(duì)列中的分組被發(fā)送出去。在ARP高速緩存中,綁定的表項(xiàng)使用數(shù)組存儲(chǔ),對(duì)應(yīng)的分組放入ae_quee指針指向的隊(duì)列中。 C,如何解決當(dāng)一個(gè)IP請(qǐng)求mac時(shí)正在響應(yīng)時(shí),又有新的請(qǐng)求到達(dá)的問(wèn)題?主要為理解P3738頁(yè)的代碼,代碼如下,調(diào)試部分已去除。#include #include #include
10、 #include structarpentry*arpalloc();structarpentry *arpfind(u_char *, u_short, struct netif *);intarpsend(struct arpentry *);intlocal_out(struct ep *);intnetwrite(struct netif *pni, struct ep *pep, unsigned len)structarpentry *pae; /arp表項(xiàng)指針STATWORDps;if (pni-ni_state != NIS_UP) /判斷網(wǎng)絡(luò)接口狀態(tài),如果狀態(tài)為關(guān),則返回錯(cuò)
11、誤freebuf(pep);return SYSERR;pep-ep_len = len; disable(ps);pae = arpfind(u_char *)&pep-ep_nexthop, pep-ep_type, pni); /調(diào)用arpfind()函數(shù),如果已綁定返回pae=1未綁定返回pae=0if (pae & pae-ae_state = AS_RESOLVED) /處理已綁定情況memcpy(pep-ep_dst, pae-ae_hwa, pae-ae_hwlen);restore(ps);return write(pni-ni_dev, pep, len);if (IP_C
12、LASSD(pep-ep_nexthop) /判斷是否為廣播地址restore(ps);return SYSERR;if (pae = 0) /處理未綁定狀態(tài)pae = arpalloc(); /回答本問(wèn)題關(guān)鍵點(diǎn),arpalloc()函數(shù)如后面所示pae-ae_hwtype = AR_HARDWARE;pae-ae_prtype = EPT_IP;pae-ae_hwlen = EP_ALEN;pae-ae_prlen = IP_ALEN;pae-ae_pni = pni;pae-ae_queue = EMPTY;memcpy(pae-ae_pra, &pep-ep_nexthop, pae-a
13、e_prlen);pae-ae_attempts = 0;pae-ae_ttl = ARP_RESEND;arpsend(pae);if (pae-ae_queue = EMPTY)pae-ae_queue = newq(ARP_QSIZE, QF_NOWAIT);if (enq(pae-ae_queue, pep, 0) 0)freebuf(pep);restore(ps);return OK;arpalloc()函數(shù)如下#include #include #include #include void arpdq(struct arpentry *);struct arpentry *arp
14、alloc()staticintaenext = 0;structarpentry *pae;inti;for (i=0; iae_state = AS_PENDING & pae-ae_queue = 0) /若表項(xiàng)處于AS_PENDING且分組隊(duì)列大于0則調(diào)用arpdq(pae)刪除一項(xiàng)并將下一項(xiàng)狀態(tài)設(shè)為AS_PEDING,返回此時(shí)的AS_PEDINGarpdq(pae);pae-ae_state = AS_PENDING;return pae;綜合上面代碼:當(dāng)有IP請(qǐng)求未完成時(shí),若又有新請(qǐng)求到達(dá),則先調(diào)用netwrite在newwrite()函數(shù)中先調(diào)用appalloc()在判定等待隊(duì)列
15、是否大于零,若大于零,則刪除一項(xiàng),返回下一項(xiàng)指針,然后將該項(xiàng)各屬性賦值再次調(diào)用arpsend();發(fā)送請(qǐng)求,并將ae_attempts加1。,高速緩存管理問(wèn)題:, 舊表項(xiàng)刪除Arp表項(xiàng)的刪除是通過(guò)arpalloc();函數(shù)實(shí)現(xiàn)的,替換策略如下:在為arp高速緩存中的新成員分配空間時(shí),如果存在空表項(xiàng)則選擇空表項(xiàng),不存在則采用循環(huán)法刪除,即刪除代碼中靜態(tài)整形變量aenext指向的項(xiàng),并把a(bǔ)enext向后移動(dòng)一個(gè)位置,以使下一輪查找跨過(guò)新添加的表項(xiàng)。代碼注釋如下:#include #include #include #include void arpdq(struct arpentry *);str
16、uct arpentry *arpalloc()staticintaenext = 0; /靜態(tài)整型變量,指向當(dāng)緩存滿時(shí)最先被替換的表項(xiàng)structarpentry *pae; /表項(xiàng)數(shù)組指針inti;for (i=0; iae_state = AS_PENDING & pae-ae_queue = 0)arpdq(pae); /刪除即將被刪除表項(xiàng)指向的等待隊(duì)列pae-ae_state = AS_PENDING; /設(shè)置狀態(tài)為等待綁定return pae; /返回表項(xiàng)指針 B,添加新表項(xiàng)流程:添加新表項(xiàng)主要由arpadd()和arpqsend()兩個(gè)函數(shù)完成,其中arpadd()先讀取網(wǎng)絡(luò)上傳
17、來(lái)的arp分組,并通過(guò)調(diào)用arpalloc()函數(shù)為新分組分配一個(gè)表項(xiàng),并利用arp分組信息填寫(xiě)該表項(xiàng),并把該表項(xiàng)狀態(tài)賦值為AS_RESEOLVED.arpqsend()主要用來(lái)發(fā)送等待地址轉(zhuǎn)換隊(duì)列中的分組。Arpqsend()通過(guò)遍歷隊(duì)列,取出數(shù)據(jù)分組調(diào)用netwrite()來(lái)發(fā)送發(fā)送分組到網(wǎng)絡(luò)輸出隊(duì)列中。Arpadd()函數(shù)注釋如下:/* arpadd.c - arpadd */#include #include #include struct arpentry *arpalloc(void);/*- * arpadd - Add a RESOLVED entry to the ARP c
18、ache * N.B. Assumes interrupts disabled *- */structarpentry *arpadd(struct netif *pni, struct arp *parp)structarpentry*pae;pae = arpalloc(); /分配表項(xiàng)空間 /根據(jù)arp分組填寫(xiě)新表項(xiàng)信息pae-ae_hwtype = parp-ar_hwtype;pae-ae_prtype = parp-ar_prtype;pae-ae_hwlen = parp-ar_hwlen;pae-ae_prlen = parp-ar_prlen;pae-ae_pni = pni
19、;pae-ae_queue = EMPTY;memcpy(pae-ae_hwa, SHA(parp), parp-ar_hwlen);memcpy(pae-ae_pra, SPA(parp), parp-ar_prlen);pae-ae_ttl = ARP_TIMEOUT;pae-ae_state = AS_RESOLVED; /設(shè)置狀態(tài)為正確綁定return pae; /返回表項(xiàng)指針 C,arp定時(shí)機(jī)制:A,為什么事使用定時(shí)機(jī)制?已有定時(shí)機(jī)制的缺點(diǎn),如何改進(jìn)? 答:定期維護(hù)高速緩存表,避免高速緩存表時(shí)刻保持高占用性,提高查找速度。已有定時(shí)機(jī)制主要通過(guò)計(jì)算最長(zhǎng)保留時(shí)間和已在高速緩存中存在時(shí)間之
20、差來(lái)確定刪除表項(xiàng),并沒(méi)有考慮到相應(yīng)表項(xiàng)的使用頻率。對(duì)最近的使用的表項(xiàng)重新設(shè)置其最長(zhǎng)保留時(shí)間。使他能不因超時(shí)被刪除。 D,arp電子欺騙問(wèn)題?P47,4.9答:對(duì)于方案一,通過(guò)在軟件中增加判定IP地址和綁定設(shè)備關(guān)系之間的判斷語(yǔ)句,并不能很好的防止arp欺騙,主要因?yàn)橄薅嗽O(shè)備對(duì)arp請(qǐng)求綁定,將會(huì)導(dǎo)致一些正常的請(qǐng)求不能響應(yīng),造成協(xié)議效率低;對(duì)于方案二,判斷正確率高,但破壞了協(xié)議軟件之間的層次性,不利于協(xié)議之間的通信。第5章 IP軟件總體結(jié)構(gòu) A:IP設(shè)計(jì)思想為什么要統(tǒng)一輸入隊(duì)列?1、統(tǒng)一的輸入隊(duì)列及統(tǒng)一的選路過(guò)程。2、獨(dú)立的IP進(jìn)程。3、本地主機(jī)接口。 使事情變得簡(jiǎn)單化:IP不需要在程序代碼中對(duì)
21、本地生成的數(shù)據(jù)報(bào)個(gè)別對(duì)待.B:IP數(shù)據(jù)報(bào)處理流程?即從輸入接口進(jìn)入到從另一個(gè)接口輸出的全過(guò)程? :選擇傳入數(shù)據(jù)報(bào)的策略 公平分配優(yōu)先權(quán),使傳入和外發(fā)數(shù)據(jù)流在選擇路由時(shí)享有平等的優(yōu)先權(quán). 實(shí)現(xiàn)策略是: 以循環(huán)法來(lái)選擇數(shù)據(jù)報(bào),以期達(dá)到公平合理. D:IP校驗(yàn)和的計(jì)算?及和UDP,TCP數(shù)據(jù)報(bào)校驗(yàn)和計(jì)算的區(qū)別? ipproc利用cksum過(guò)程計(jì)算校驗(yàn)和*-* 二進(jìn)制補(bǔ)碼算法: 首部視為16位整數(shù)的序列-所有整數(shù)各自求反-相加求和-結(jié)果求反 大多數(shù)設(shè)備使用 二進(jìn)制補(bǔ)碼算法,所以cksum過(guò)程(用C語(yǔ)言編寫(xiě))使用32位算法累加得和,向和中加 所有進(jìn)位位 ,將結(jié)果折合為16位的值.cksum返回結(jié)果的反碼
22、. Cksum.()函數(shù)如下:從本書(shū)網(wǎng)站上下載的源碼這部分是由匯編寫(xiě)的,書(shū)上的代碼在P57頁(yè) :發(fā)送本地生成數(shù)據(jù)報(bào)問(wèn)題?(頁(yè)代碼)/* ipsend.c - ipsend */#include #include #include #include static ipackid = 1;intipsend(IPaddr faddr, struct ep *pep, unsigned datalen,u_char proto, u_char ptos, u_char ttl)structip *pip = (struct ip *) pep-ep_data; /提取數(shù)據(jù)報(bào)ip部分pep-ep_ty
23、pe = EPT_IP;pep-ep_order |= EPO_IP|EPO_NET;pip-ip_verlen = (IP_VERSIONip_tos = ptos; /pip-ip_len = datalen+IP_HLEN(pip);pip-ip_id = ipackid+;pip-ip_fragoff = 0; /偏移值pip-ip_ttl = ttl; /設(shè)置生存時(shí)間值pip-ip_proto = proto;pip-ip_dst = faddr; /以上代碼用于對(duì)IP頭部各值段進(jìn)行設(shè)置 /* * special case for ICMP, so source matches de
24、stination * on multi-homed hosts. */if (pip-ip_proto != IPT_ICMP) /判斷是否是ICMP報(bào)文pip-ip_src = ip_anyaddr;if (enq(nifNI_LOCAL.ni_ipinq, pep, 0) 0) freebuf(pep);IpOutDiscards+;send(ippid, NI_LOCAL); /調(diào)用send()函數(shù)發(fā)送到,NI_LOCAL為本地網(wǎng)絡(luò)接口IpOutRequests+;return OK;/* special IP addresses */IPaddrip_anyaddr = 0;#ifB
25、YTE_ORDER = LITTLE_ENDIANIPaddrip_loopback = 0xF;/* 127.0.0.1 */#else/* BYTE_ORDER */IPaddrip_loopback = 0x7F;/* 127.0.0.1 */#endif/* BYTE_ORDER */第6章 、IP:選路表和選路算法應(yīng)當(dāng)選擇能使查找路由花費(fèi)最小的IP數(shù)據(jù)結(jié)構(gòu)和算法,維護(hù)路由的花費(fèi)則并不那么重要. A:路由表結(jié)構(gòu)問(wèn)題?(桶散列如何構(gòu)成?)補(bǔ)充(如何計(jì)算key值及key值的具體含義) 采用了桶散列(bucket hashing)結(jié)構(gòu):它將選路表的入口劃分成許多“散列表元”,并利用一個(gè)散列函
26、數(shù)迅速找到正確的散列表元。 保存路由的主要數(shù)據(jù)結(jié)構(gòu)是數(shù)組。數(shù)組的每個(gè)元素對(duì)應(yīng)一個(gè)散列表元,并包含一個(gè)指針,指向被裝入這個(gè)散列表元中的通往目的站的路由記錄鏈表:表中每個(gè)記錄包含一個(gè)IP目的地址、子網(wǎng)掩碼、下跳地址、用于向下一跳地址發(fā)送數(shù)據(jù)的網(wǎng)絡(luò)接口,以及其他在路由管理中使用的信息。 字段rt_key 包含的是一個(gè)排序關(guān)鍵字,在向鏈表中插入結(jié)點(diǎn)時(shí)使用. Key 值如何計(jì)算 (抱歉,沒(méi)找到). B:新路由加入流程?即新路由信息如何放入路由表? 過(guò)程rtadd向表中增加一個(gè)新路由。以 IP 路由協(xié)議為基礎(chǔ). 流程: 1. rtadd調(diào)用過(guò)程rtnew來(lái)分配一個(gè)新結(jié)點(diǎn),并初始化它的各個(gè)字段; 2. rt
27、add將默認(rèn)路由當(dāng)作特殊情況對(duì)待。對(duì)于非默認(rèn)的路由,rtadd利用rthash計(jì)算新路由在路由表中的索引值,并遍歷該表項(xiàng)中的路由鏈表。一旦它在鏈表中找到新路由應(yīng)該被插入的地方,就查看鏈表是否包含一個(gè)具有相同目的站的已有路由。如果有,rtadd比較舊路由和新路由的度量,是否新路由更好。如果不是,就丟棄新路由。 3. rtadd或者在鏈表中插入一個(gè)新結(jié)點(diǎn),或者將信息復(fù)制到具有同樣地址的已有結(jié)點(diǎn)中。C:路由刪除問(wèn)題?(大小寫(xiě)rt_free()的區(qū)別?) 過(guò)程rtdel以一個(gè)目的地址作為入口參數(shù),并通過(guò)從選路表中移走結(jié)點(diǎn)來(lái)刪除路由。 象通常那樣,程序代碼查看并以特殊情況對(duì)待默認(rèn)路由。如果沒(méi)有找到匹配表
28、項(xiàng),rtdel計(jì)算目的地址的散列值,并在路由鏈表中搜索。 一旦它找到正確的路由,rtdel將該結(jié)點(diǎn)從鏈表中刪除,并利用宏RTFREE來(lái)遞減引用計(jì)數(shù)值?;叵胍幌拢绻糜?jì)數(shù)值達(dá)到0,RTFREE就將該結(jié)點(diǎn)返回空閑結(jié)點(diǎn)表。如果引用計(jì)數(shù)值仍為正值,表示肯定還有其他一個(gè)或幾個(gè)進(jìn)程正在使用該結(jié)點(diǎn)。只有當(dāng)最后一個(gè)進(jìn)程將引用計(jì)數(shù)值減至0時(shí),此結(jié)點(diǎn)才被釋放回空閑結(jié)點(diǎn)表。 區(qū)別: 宏RTFREE假設(shè)正在執(zhí)行中的進(jìn)程已經(jīng)獲得了單獨(dú)訪問(wèn)選路表的權(quán)力,因此它可在諸如rtdel之類(lèi)的過(guò)程中被使用。任意個(gè)需要遞減選路表中引用計(jì)數(shù)值的過(guò)程部可以調(diào)用過(guò)程rtfree 。當(dāng)rtfree被喚醒后,首先它等待互斥信號(hào)旦,然后喚醒
29、宏RTFREE最后釋放信號(hào)量。 D:選項(xiàng)處理?(P83頁(yè)) 主機(jī)調(diào)用過(guò)程ipdstopts來(lái)處理到達(dá)主機(jī)的數(shù)據(jù)報(bào)的選項(xiàng)。雖然我們?cè)谶^(guò)程中并沒(méi)有真正實(shí)現(xiàn)選項(xiàng)的處理,但它分析了IP首部中選項(xiàng)長(zhǎng)度八位組的信息,并將選項(xiàng)字段從IP首部中刪除。/* ipdstopts.c - ipdstopts */#include #include #include /*- * ipdstopts - do host handling of IP options *- */intipdstopts(struct netif *pni, struct ep *pep)structip*pip = (struct ip
30、*)pep-ep_data;u_char*popt, *popend;intlen;if (IP_HLEN(pip) = IPMHLEN)return OK;popt = pip-ip_data;popend = (u_char *)&pep-ep_dataIP_HLEN(pip);/* NOTE: options not implemented yet */* delete the options */len = pip-ip_len-IP_HLEN(pip);/* data length*/if (len)memcpy(pip-ip_data, &pep-ep_dataIP_HLEN(pi
31、p), len);pip-ip_len = IPMHLEN + len;pip-ip_verlen = (pip-ip_verlen&0xf0) | IP_MINHLEN;return OK;第7章 IP分片與重組 劉 星 A:如何分片 ? 何時(shí)需要分片: IP為數(shù)據(jù)報(bào)選擇路由之后;將其置人一個(gè)與指定的網(wǎng)絡(luò)接口相關(guān)聯(lián)的隊(duì)列之前的這段時(shí)間里. 前提條件: IP把數(shù)據(jù)報(bào)長(zhǎng)度與網(wǎng)絡(luò)的MTU相比較,以確定是否有必要將其分片。 原理及其過(guò)程: 1.對(duì)需要分片的情況,IP生成多個(gè)數(shù)據(jù)報(bào),并將每個(gè)數(shù)據(jù)報(bào)中的分片比特置1; 2.將源數(shù)據(jù)報(bào)中的數(shù)據(jù)按順序分片,并裝人數(shù)據(jù)報(bào)中; 3.在向一源數(shù)據(jù)報(bào)產(chǎn)生的所有數(shù)據(jù)報(bào)
32、片中將MF比特置為1,末尾的分片除外。 4.IP邊為數(shù)據(jù)報(bào)分片,一邊將它們傳遞給網(wǎng)絡(luò)接口發(fā)送出去。 分片的實(shí)現(xiàn): ipputp 過(guò)程 P86-P87 B:如何計(jì)算每片分片大???最后一片如何處理 ? 首部如何處理?分片的實(shí)現(xiàn): ipputp過(guò)程 P86-P87ipputp計(jì)算分片的最大可能長(zhǎng)度,然后將數(shù)據(jù)報(bào)順序劃分為一連串最大長(zhǎng)度的數(shù)據(jù)報(bào)片,最后剩余的數(shù)據(jù)被裝入末尾數(shù)據(jù)報(bào)片。一旦ipputp計(jì)算出了最大分片長(zhǎng)度,它遍歷整個(gè)數(shù)據(jù)報(bào),并調(diào)用ipfsend,發(fā)送每個(gè)數(shù)據(jù)報(bào)片。1. 每個(gè)數(shù)據(jù)報(bào)片必須含有一個(gè)IP首都,因此次可發(fā)送的最大數(shù)據(jù)量等于MTU減去IP首 部的長(zhǎng)度,然后截短成為最接近的8的倍數(shù)。2
33、. 僅當(dāng)數(shù)據(jù)報(bào)中剩余的數(shù)據(jù)大于一次可發(fā)送的最大數(shù)據(jù)量時(shí),發(fā)送動(dòng)作才會(huì)繼續(xù)進(jìn)行。3. 發(fā)送末尾數(shù)據(jù)報(bào)片時(shí),ipputp僅對(duì)源數(shù)據(jù)報(bào)做適當(dāng)更改,而不再把生成的數(shù)據(jù)報(bào)片復(fù)制到一個(gè)新緩沖區(qū)中。4. 通常末尾數(shù)據(jù)報(bào)片中的MF比特為0。然而,當(dāng)網(wǎng)關(guān)為一個(gè)非末尾的數(shù)據(jù)報(bào)片再次分片時(shí),它必須設(shè)置所有子分片的MF比特為1。 核心代碼段: 分片 maxdlen = (pni-ni_mtu - IP_HLEN(pip) & 7; offset = 0; offindg = (pip-ip_fragoff & IP_FRAGOFF)ip_len - IP_HLEN(pip); C:重組問(wèn)題,如何測(cè)試數(shù)據(jù)報(bào)完整?(P9
34、5為何是offMAXLRGBUF) 重組問(wèn)題 數(shù)據(jù)結(jié)構(gòu):ipreass.h 使用一個(gè)列表數(shù)組來(lái)保存數(shù)據(jù)報(bào)片. 為提高判斷效率,分片鏈表按順序存放. 為保證進(jìn)程在訪問(wèn)數(shù)據(jù)報(bào)片的鏈表時(shí)不相互干擾,重組時(shí)使用一互斥信號(hào)量ipfmutex. 過(guò)程ipreass接受數(shù)據(jù)報(bào)片,用線性查找法找出相應(yīng)的鏈表,調(diào)用ipfadd向鏈表中加入該數(shù)據(jù)報(bào)片. 再調(diào)用ipfjion查看是否所有的數(shù)據(jù)報(bào)片已全部到齊,進(jìn)而重組數(shù)據(jù)報(bào)片. P 94-95 過(guò)程ipfjoin檢查數(shù)據(jù)報(bào)片鏈表看它們是否能形成一個(gè)完整數(shù)據(jù)報(bào).核心代碼段: 測(cè)試數(shù)據(jù)包是否完整 while (pep=(struct ep *)seeq(iq-ipf_q
35、) pip = (struct ip *)pep-ep_data;packoff = (pip-ip_fragoff & IP_FRAGOFF)3;if (off ipf_q)/emptyreturn 0;off = packoff + pip-ip_len - IP_HLEN(pip); 一旦ipfjoin證實(shí)所有的數(shù)據(jù)報(bào)片已被全部收集齊,執(zhí)行以下代碼段: if (off MAXLRGBUF) while (pep = (struct ep *)deq(iq-ipf_q)freebuf(pep);freeq(iq-ipf_q);iq-ipf_state = IPFF_FREE;return
36、0; off MAXLRGBUF, 通過(guò)判斷來(lái)保證數(shù)據(jù)報(bào)是否可以被轉(zhuǎn)入一個(gè)大緩沖區(qū). 因?yàn)閿?shù)據(jù)報(bào)在被傳送給應(yīng)用程序前,必須在連續(xù)的存儲(chǔ)空間中重組, 所以軟件只能處理裝入大緩沖區(qū)的數(shù)據(jù)報(bào).第十章、UDP用戶數(shù)據(jù)報(bào) 用戶數(shù)據(jù)包UDP提供應(yīng)用程序之間的無(wú)連接通信. 協(xié)議端口號(hào): 應(yīng)用程序用來(lái)識(shí)別通信的端點(diǎn)的抽象模型. 優(yōu)點(diǎn) : 保持了協(xié)議與特定系統(tǒng)之間的獨(dú)立性; 允許不同類(lèi)型的計(jì)算機(jī)系統(tǒng)應(yīng)用程序之間互相通信.A:多對(duì)一和成對(duì)(即一對(duì)一)通信使用的端口有何不同?應(yīng)用范圍有何不同? 成對(duì)(一對(duì)一)通信 : 兩個(gè)應(yīng)用程序各自從本地操作系統(tǒng)中獲取UDP端口號(hào),并且他們利用這對(duì)端口號(hào)交換UDP報(bào)文. 圖示:
37、多對(duì)一通信: 單一的服務(wù)器應(yīng)用程序接收來(lái)自多個(gè)客戶的UDP報(bào)文. 使用的端口區(qū)別: 成對(duì)通信: 應(yīng)用程序和協(xié)議軟件之間的理想的接口,是將具體的地址操作從發(fā)送和接收數(shù)據(jù)報(bào)的操作中分離出來(lái). 接口允許一個(gè)應(yīng)用程序一次性指定本地的和遠(yuǎn)程的協(xié)議端口號(hào),然后多次發(fā)送和接收數(shù)據(jù)報(bào)。多對(duì)一通信: 服務(wù)器使用的理想型接口并沒(méi)有將地址標(biāo)識(shí)和數(shù)據(jù)報(bào)的傳送分開(kāi)。接口必須允許服務(wù)器在每次發(fā)送數(shù)據(jù)報(bào)時(shí)給出有關(guān)目的站的信息。應(yīng)用范圍區(qū)別: 成對(duì)通信: 點(diǎn)對(duì)點(diǎn), 范圍窄多對(duì)一通信: 多對(duì)一, 范圍更廣 B:如何處理已到達(dá)的數(shù)據(jù)報(bào)?(可能是代碼填空) 當(dāng)有一個(gè)以本機(jī)為目的站的UDP數(shù)據(jù)報(bào)到達(dá)后,偽網(wǎng)絡(luò)接口中的一個(gè)過(guò)程就調(diào)用過(guò)
38、程udp_in,它以參數(shù)的形式傳遞含有輸入分組的緩沖區(qū)地址以及網(wǎng)絡(luò)接口索引,分組通過(guò)該網(wǎng)絡(luò)接口到達(dá)。 過(guò)程: 1. 判斷是否支持校驗(yàn)和選項(xiàng); 2. 調(diào)用udpchsum 驗(yàn)證校驗(yàn)和,正確返回0;否則,不做處理,丟棄該報(bào); 3. 調(diào)用udpnet2h 轉(zhuǎn)首部字段為本機(jī)字節(jié)順序. 4. 數(shù)據(jù)報(bào)多路分解,調(diào)用psend 將數(shù)據(jù)報(bào)入隊(duì)列. 隊(duì)列滿, 溢出報(bào)錯(cuò). 5. 調(diào)用send 發(fā)送數(shù)據(jù)報(bào)./* udp_in.c - udp_in */#include #include #include #include #include intudp_in(struct netif *pni, struct ep
39、 *pep)structip*pip = (struct ip *)pep-ep_data;structudp*pudp = (struct udp *)pip-ip_data;structupq*pup;unsigned shortdst;inti;if (pudp-u_cksum & udpcksum(pep, net2hs(pudp-u_len) /判斷校驗(yàn)和是否正確freebuf(pep);return SYSERR;/* checksum error */udpnet2h(pudp);/* 將網(wǎng)絡(luò)自己順序轉(zhuǎn)換為主機(jī)字節(jié)順序 */dst = pudp-u_dst;wait(udpmut
40、ex); /設(shè)置互斥訪問(wèn)信號(hào)量for (i=0 ; iup_port = dst) /判定端口是否等于目的端口/* drop instead of blocking on psend */ if (pcount(pup-up_xport) = UPPLEN) signal(udpmutex);freebuf(pep);UdpInErrors+;return SYSERR;psend(pup-up_xport, (WORD)pep); /調(diào)用psend()將數(shù)據(jù)報(bào)置入隊(duì)列,然后調(diào)用send()向等待該數(shù)據(jù)報(bào)的進(jìn)程發(fā)送一個(gè)報(bào)文UdpInDatagrams+;if (!isbadpid(pup-up
41、_pid) send(pup-up_pid, OK);pup-up_pid = BADPID;signal(udpmutex);return OK;signal(udpmutex); /釋放信號(hào)量UdpNoPorts+;icmp(ICT_DESTUR, ICC_PORTUR, pip-ip_src, pep, 0); /搜索完畢,沒(méi)找到目的端口,發(fā)送端口不可達(dá)報(bào)文。return OK;intudpmutex; C:UDP校驗(yàn)和問(wèn)題 過(guò)程udpcksum為一個(gè)UDP數(shù)據(jù)報(bào)計(jì)算其校驗(yàn)和。 UDP校驗(yàn)和要包括整個(gè)UDP數(shù)據(jù)報(bào)及其偽首都,偽首部中包括IP源地址和目的地址、UDP長(zhǎng)度以及UDP協(xié)議標(biāo)識(shí)符
42、等。 在為一個(gè)外發(fā)數(shù)據(jù)報(bào)計(jì)算校驗(yàn)和的時(shí)候,協(xié)議軟件必須找出在將UDP報(bào)文封裝到一個(gè)IP數(shù)據(jù)報(bào)時(shí)所需要用到的數(shù)值. 在驗(yàn)證一個(gè)已到達(dá)的報(bào)文的校驗(yàn)和時(shí),UDP從攜帶該報(bào)文的IP數(shù)據(jù)報(bào)中提取各個(gè)值。/* udpcksum.c - udpcksum */#include #include #include /*- * udpcksum - compute a UDP pseudo-header checksum *- */unsigned shortudpcksum(struct ep *pep, int len)structip*pip = (struct ip *)pep-ep_data;stru
43、ctudp*pudp = (struct udp *)pip-ip_data;unsignedshort*sptr;unsignedlong ucksum;inti;ucksum = 0;sptr = (unsigned short *) &pip-ip_src;/* 2*IP_ALEN octets = IP_ALEN shorts. */* they are in net order.*/for (i=0; i= 1;/* convert to length in shorts */for (i=0; i 16) + (ucksum & 0xffff);ucksum += (ucksum
44、16);return (short)(ucksum & 0xffff);第十一章、TCP數(shù)據(jù)結(jié)構(gòu)和輸入處理 吳虹莉 A:TCP概念,什么是TCP? TCP:Transmission Control Protocol 傳輸控制協(xié)議TCP是一種面向連接(連接導(dǎo)向)的、可靠的、基于字節(jié)流的運(yùn)輸層(Transport layer)通信協(xié)議 B:TCP序號(hào)問(wèn)題,如何利用序號(hào)進(jìn)行數(shù)據(jù)報(bào)先后比較?為什么用減法比較? TCP利用整數(shù)減法來(lái)比較兩個(gè)序列值的大小. 因?yàn)樗梢约僭O(shè)兩個(gè)序列值之間的差距永遠(yuǎn)也不會(huì)大于序列空間值的一半。在這種情況下,當(dāng)一個(gè)很大的值與一個(gè)很小的值相比較時(shí),整數(shù)計(jì)算時(shí)的下溢仍能產(chǎn)生正確結(jié)果。 C:狀態(tài)變遷問(wèn)題(12個(gè)狀態(tài),具體不知哪一個(gè),但一定會(huì)考一個(gè)。分值六分) 為了理解TCP有限狀態(tài)機(jī)制,讓我們來(lái)看一個(gè)例子,它是用于在客戶和服務(wù)器之間建立連接的三次握手操作。不論是客戶還是服務(wù)器,它們都要為通信創(chuàng)建一個(gè)端點(diǎn),并且都具有一份有限狀態(tài)機(jī)的副本。 服務(wù)器首先發(fā)起一個(gè)“被動(dòng)打開(kāi)”的操作,這將導(dǎo)致服務(wù)器的有限狀態(tài)機(jī)進(jìn)入“聽(tīng)”狀態(tài)。服務(wù)器在“聽(tīng)”狀態(tài)中等待,直到有一個(gè)客戶與它
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 顧客到店課件
- 順產(chǎn)與剖腹產(chǎn)課件
- 項(xiàng)目級(jí)安全教育課件
- 幼兒園教師安全常規(guī)培訓(xùn)
- 光伏車(chē)間生產(chǎn)管理培訓(xùn)
- 市政污水管網(wǎng)改造項(xiàng)目經(jīng)濟(jì)效益和社會(huì)效益分析報(bào)告(參考)
- 城鎮(zhèn)污水管網(wǎng)建設(shè)項(xiàng)目運(yùn)營(yíng)管理方案(參考模板)
- 城鎮(zhèn)污水管網(wǎng)建設(shè)工程招投標(biāo)方案(范文模板)
- 無(wú)人機(jī)航拍圖像處理與優(yōu)化
- 屋面工程質(zhì)量通病防治手冊(cè)
- 碘海醇外滲的預(yù)防與處理
- 醫(yī)療糾紛-醫(yī)療投訴登記表
- 人民醫(yī)院診斷證明書(shū)
- 燃?xì)庥邢薰咎胤N設(shè)備安全管理制度
- 2023年株洲農(nóng)村商業(yè)銀行股份有限公司招聘員工歷年試題(常考點(diǎn)甄選)含答案帶詳解-1
- 嘉峪關(guān)市招聘公辦幼兒園編制外聘用制教師考試真題2022
- 塔吊基礎(chǔ)沉降觀測(cè)記錄
- 綜合日語(yǔ)說(shuō)課講課公開(kāi)課一等獎(jiǎng)市優(yōu)質(zhì)課賽課獲獎(jiǎng)?wù)n件
- 茶樓服務(wù)員的禮儀培訓(xùn)資料
- GB/T 5976-2006鋼絲繩夾
- GB/T 4169.3-2006塑料注射模零件第3部分:帶頭導(dǎo)套
評(píng)論
0/150
提交評(píng)論