TCP/IP FAQ系列,以經(jīng)典的4.4BSD-Lite實(shí)現(xiàn)為準(zhǔn),參考《TCP/IP協(xié)議詳解》3卷 ,加入個(gè)人的思考理解,理清主干,不深究細(xì)枝末節(jié),皆在總結(jié)基本原理和實(shí)現(xiàn)。本篇涵蓋了數(shù)據(jù)鏈路層、ARP、RARP、IP、ICMP、TCP、UDP方面的問題與解答。
【Data Link】
1. 環(huán)回接口地址必須是127.0.0.1嗎?
形如127.x.x.x的A類IP都可作為環(huán)回接口的地址,但常用的是127.0.0.1。
2. 環(huán)回接口為什么沒有輸入處理?
發(fā)送到環(huán)回接口的數(shù)據(jù)報(bào)實(shí)質(zhì)上被送到網(wǎng)絡(luò)層的輸入隊(duì)列中,因此數(shù)據(jù)報(bào)沒有離開網(wǎng)絡(luò),也就不可能從鏈路上接收到目標(biāo)地址為環(huán)回接口地址的數(shù)據(jù)幀,所以不存在輸入處理。
3. SLIP、環(huán)回和以太網(wǎng)接口,三者有何不同?
SLIP和環(huán)回接口沒有鏈路層首部和硬件地址,環(huán)回接口沒有輸入處理,而以太網(wǎng)接口都有。
4. SLIP和以太網(wǎng)接口如何分用輸入幀,環(huán)回接口如何分用輸出分組?
SLIP將幀直接放進(jìn)IP輸入隊(duì)列中,以太網(wǎng)接口則根據(jù)幀類型字段放到對(duì)應(yīng)的協(xié)議輸入隊(duì)列中,環(huán)回接口則按目的地址族放到對(duì)應(yīng)的輸入隊(duì)列中。
5. 接口和地址有什么關(guān)聯(lián)?
一個(gè)接口的編址信息包括主機(jī)地址、廣播地址和網(wǎng)絡(luò)掩碼,當(dāng)內(nèi)核初始化時(shí),每個(gè)接口分配一個(gè)鏈路層地址,可以配置有多個(gè)相同或不同的網(wǎng)絡(luò)層地址,例如2個(gè)IP地址,或者1個(gè)IP地址、1個(gè)OSI地址。
【ARP & RARP】
1. 何時(shí)發(fā)送ARP請(qǐng)求,何時(shí)應(yīng)答ARP請(qǐng)求?
當(dāng)單播發(fā)送IP數(shù)據(jù)并且查詢ARP高速緩存失敗時(shí),就會(huì)廣播一個(gè)詢問目的主機(jī)硬件地址的ARP請(qǐng)求;當(dāng)接收到ARP請(qǐng)求的主機(jī)就是該請(qǐng)求所要查找的目的主機(jī)或目的主機(jī)的ARP代理服務(wù)器時(shí),就會(huì)單播一個(gè)ARP應(yīng)答。
2. 為什么兩者的以太網(wǎng)幀類型不同?
ARP值為0x0806,RARP為0x8035,其實(shí)對(duì)于發(fā)送方來說,利用ARP的op字段可以區(qū)分RARP,但對(duì)于接收方,由于ARP實(shí)現(xiàn)在內(nèi)核中,而RARP一般實(shí)現(xiàn)為服務(wù)器,所以為了更易區(qū)分,就單獨(dú)用另一個(gè)值標(biāo)識(shí)。
3. 設(shè)計(jì)RARP服務(wù)器有哪些問題?
一是怎么發(fā)送以太網(wǎng)幀以響應(yīng)請(qǐng)求,這與系統(tǒng)相關(guān)。二是當(dāng)存在多個(gè)服務(wù)器時(shí),同時(shí)發(fā)送響應(yīng)幀會(huì)造成以太網(wǎng)沖突,這可以通過分主從服務(wù)器和隨機(jī)延時(shí)來優(yōu)化避免。
4. ARP在等待應(yīng)答時(shí),它會(huì)如何處理發(fā)往給定目的的多個(gè)報(bào)文?
在大多數(shù)的實(shí)現(xiàn)中,在等待一個(gè)ARP應(yīng)答時(shí),只將最后一個(gè)報(bào)文發(fā)給特定目的主機(jī)。Host Requirements RFC要求實(shí)現(xiàn)中必須防止這種類型的ARP洪泛,建議最高速率是每秒一次。
5. 免費(fèi)ARP有什么作用?
一般的ARP請(qǐng)求用于查詢目標(biāo)硬件地址,并等待應(yīng)答。而免費(fèi)的ARP發(fā)出請(qǐng)求并不一定期望應(yīng)答,這可以有兩方面的作用:
1)一個(gè)主機(jī)可以確定是否存在相同IP地址的另一主機(jī)
2)當(dāng)本機(jī)硬件地址改變時(shí),通知其它主機(jī)更新ARP高速緩存。
6. ARP如何映射一個(gè)IP多播地址?
先獲取IP多播地址的低23位,再與常量0x01005e7f0000按位或,結(jié)果就是對(duì)應(yīng)的多播硬件地址。
【IP】
1. 何時(shí)何地分片?
當(dāng)數(shù)據(jù)報(bào)長(zhǎng)度大于鏈路接口MTU且DF=0時(shí),開始分片,分片可發(fā)生在源主機(jī),也可發(fā)生在中途路由器。若需要分片但DF=1,則向源主機(jī)發(fā)送ICMP不可達(dá)差錯(cuò)。
2. 如何分片?
1)計(jì)算每個(gè)分片的數(shù)據(jù)長(zhǎng)度(不含IP首部),除后一個(gè)分片外,其它分片數(shù)據(jù)長(zhǎng)度為8字節(jié)的倍數(shù)。
2)除復(fù)制對(duì)應(yīng)數(shù)據(jù)外,還復(fù)制原始分組的首部及(部分)選項(xiàng)到新的每個(gè)分片中,更新新分片首部的頭部長(zhǎng)度、總長(zhǎng)度、MF標(biāo)志和偏移量。如果原始分組已經(jīng)是分片,那么MF=1,否則最后一個(gè)分片MF=0,其余MF=1。
3. 何時(shí)何地重裝?
由于分片可以有不同的路由,而且中途路由器可能再次分片,因此只有目標(biāo)主機(jī)才能重裝所有分片。當(dāng)接收端第一次收到一個(gè)MF或偏移量非零的分組時(shí),則該分組就是一個(gè)必須被重裝的分片,于是開始重裝。
4. 如何重裝?
1)使用4元組{源地址,目標(biāo)地址,協(xié)議,16位標(biāo)識(shí)}為唯一標(biāo)識(shí)查找當(dāng)前分片所屬的數(shù)據(jù)報(bào)(分片表),如果沒有找到,則創(chuàng)建分片表,按偏移量將當(dāng)前分片插入到分片表,并啟動(dòng)重裝定時(shí)器。
2)如果重裝定時(shí)器超時(shí)后,還沒有組裝好一個(gè)完整的IP數(shù)據(jù)報(bào),此時(shí)如果已經(jīng)收到第一個(gè)分片,則向源主機(jī)返回ICMP超時(shí)差錯(cuò),最后丟棄收到的所有分片;否則,提交數(shù)據(jù)給適當(dāng)?shù)膫鬏攲犹幚怼?br />
5. 哪些分組能被轉(zhuǎn)發(fā),何時(shí)轉(zhuǎn)發(fā)?
到達(dá)非最終目的地系統(tǒng)的分組,且當(dāng)系統(tǒng)配置為可轉(zhuǎn)發(fā)或分組包含源路由時(shí),才能被轉(zhuǎn)發(fā),但下列類型的分組除外:1)鏈路層廣播 2)環(huán)回分組 3)網(wǎng)絡(luò)0和E類目標(biāo)地址 4)D類目標(biāo)地址。
【ICMP】
1. ICMP報(bào)文有哪些類型,何時(shí)何地生成這些報(bào)文?
包括請(qǐng)求、應(yīng)答、差錯(cuò)和重定向4種,其中前兩者可統(tǒng)一為查詢類。請(qǐng)求當(dāng)需要查詢的時(shí)候由進(jìn)程生成,應(yīng)答由當(dāng)內(nèi)核收到請(qǐng)求報(bào)文時(shí)生成,當(dāng)主機(jī)發(fā)出的數(shù)據(jù)報(bào)無(wú)法成功地提交給目的主機(jī)時(shí),目的主機(jī)或中間路由器的IP或傳輸協(xié)議生成差錯(cuò)報(bào)文,并返回給原來的系統(tǒng)。
2. 內(nèi)核怎么處理收到的ICMP報(bào)文?
ICMP是一種傳輸層協(xié)議,其協(xié)議號(hào)為1,當(dāng)IP層收到一個(gè)ICMP報(bào)文時(shí),分用交給ICMP協(xié)議輸入處理,ICMP協(xié)議輸入根據(jù)其類型分別處理:1)請(qǐng)求---生成適當(dāng)?shù)膽?yīng)答報(bào)文 2)差錯(cuò)---提交給適當(dāng)?shù)膫鬏攲訁f(xié)議處理 3)應(yīng)答---提交給等待ICMP報(bào)文的進(jìn)程 4)重定向---更新路由表,并提交給等待的進(jìn)程。
3. 怎么發(fā)送ICMP報(bào)文?
構(gòu)造ICMP報(bào)文-->計(jì)算ICMP檢驗(yàn)和-->封裝到IP數(shù)據(jù)報(bào)中-->提交給IP協(xié)議輸出處理,對(duì)于用戶進(jìn)程,須使用原始IP機(jī)制才能發(fā)送。
4. 哪些情況不會(huì)產(chǎn)生ICMP差錯(cuò)報(bào)文,為什么?
1)ICMP差錯(cuò)報(bào)文:違反此條可能導(dǎo)致差錯(cuò)引起差錯(cuò),無(wú)休止循環(huán)下去。
2)源地址不是單播地址的IP數(shù)據(jù)報(bào):違反此條導(dǎo)致差錯(cuò)可能同時(shí)發(fā)到多個(gè)主機(jī)。
3)目的地址是廣播或多播地址的IP數(shù)據(jù)報(bào):違反此條導(dǎo)致多個(gè)主機(jī)可能同時(shí)響應(yīng)。
4)作為鏈路層廣播的數(shù)據(jù)報(bào):違反此條導(dǎo)致多個(gè)主機(jī)可能同時(shí)響應(yīng)。
5)不是IP分片的第一片:違反此條可能導(dǎo)致產(chǎn)生多個(gè)ICMP差錯(cuò),每個(gè)分片一個(gè)。
由此可見,違反以上幾條都會(huì)引起網(wǎng)絡(luò)風(fēng)暴。
【TCP & UDP】
1. 為什么TCP首部存在首部長(zhǎng)度字段,而UDP卻沒有?
TCP首部存在選項(xiàng),如mss,timestame,nop和wscale等。
2. 為什么這兩種協(xié)議首部前面都是源和目的端口?
當(dāng)TCP收到一個(gè)ICMP差錯(cuò)時(shí),必須檢查兩個(gè)端口號(hào)以決定差錯(cuò)對(duì)應(yīng)于哪個(gè)連接;只有當(dāng)UDP套接口連接到對(duì)端時(shí),用戶進(jìn)程才會(huì)收到ICMP差錯(cuò),例如當(dāng)服務(wù)器未運(yùn)行時(shí),返回的ICMP端口不可達(dá)消息。
3. 當(dāng)收到TCP或UDP數(shù)據(jù)包時(shí),怎么提交給應(yīng)用層?
插口由進(jìn)程調(diào)用socket或accept創(chuàng)建,關(guān)聯(lián)到對(duì)應(yīng)的PCB(協(xié)議控制塊)上,通配匹配數(shù)由本地和外部IP地址確定,有3種取值:0--本地和外部IP都不為*、1--本地或外部IP有一個(gè)為*和2--本地和外部IP都為*。與UDP不同的是,TCP還有自己的PCB。
1)TCP:先掃描Internet PCB,查找最小通配匹配數(shù)的插口,如果沒找到,那么響應(yīng)RST包;再查看對(duì)應(yīng)的TCP PCB,若不存在則響應(yīng)RST包,否則若TCP 狀態(tài)為關(guān)閉,則丟棄;最后交付給找到的對(duì)應(yīng)插口。
2)UDP:這里要分2種情況,對(duì)于目的地為廣播或多播地址的IP數(shù)據(jù)報(bào),交付給所有匹配的插口;對(duì)于目的地為單播的IP數(shù)據(jù)報(bào),掃描Internet PCB,查找具有最小通配匹配數(shù)的插口,如果沒有找到,則向源主機(jī)發(fā)送ICMP端口不可達(dá)差錯(cuò)。如果有多個(gè)插口有相同的最小通配匹配數(shù),那么具體由哪個(gè)插口接收依賴于不同的實(shí)現(xiàn)。
4. 計(jì)算首部檢驗(yàn)和時(shí),為什么要引入偽首部?
這是因?yàn)榭紤]到IP層的可能差錯(cuò),TCP和UDP需要驗(yàn)證數(shù)據(jù)包是否被遞送到正確的協(xié)議和目的主機(jī)。
5. UDP何時(shí)會(huì)計(jì)算檢驗(yàn)和,如何區(qū)分是否使用了檢驗(yàn)和?
UDP的檢驗(yàn)和是可選的,當(dāng)系統(tǒng)沒有禁止(udpcksum非零)時(shí),發(fā)送方會(huì)計(jì)算檢驗(yàn)和,接收方還須輸入分組檢驗(yàn)和非零時(shí)才會(huì)計(jì)算檢驗(yàn)和。如果檢驗(yàn)和字段非零,那么就使用了,反之沒有。
6. 在TCP狀態(tài)遷移中,哪些狀態(tài)在什么情況下可直接轉(zhuǎn)到CLOSED狀態(tài)?
SYN_SENT在連接定時(shí)器超時(shí)后,F(xiàn)IN_WAIT_2在FIN_WAIT_2定時(shí)器超時(shí)后。
7. 為什么TCP需要持續(xù)(persist)定時(shí)器、FIN_WAIT_2定時(shí)器和2MSL定時(shí)器?
1)因?yàn)檫B接對(duì)端發(fā)送的窗口通告為ACK報(bào)文,而ACK是不會(huì)確認(rèn)的,允許TCP繼續(xù)發(fā)送數(shù)據(jù)的窗口更新可能會(huì)丟失,所以需要設(shè)定persist定時(shí)器,在超時(shí)后發(fā)送1字節(jié)的數(shù)據(jù),判定對(duì)端接收窗口是否已打開。
2)因?yàn)樵谡G闆r下,當(dāng)連接主動(dòng)關(guān)閉時(shí),會(huì)由FIN_WAIT_1狀態(tài)進(jìn)入FIN_WAIT_2狀態(tài)等待接收對(duì)端的FIN報(bào)文,但對(duì)方可能一直不發(fā)送FIN,所以需要FIN_WAIT_2定時(shí)器避免連接永遠(yuǎn)滯留在FIN_WAI_2狀態(tài)。
3)因?yàn)楫?dāng)連接主動(dòng)關(guān)閉進(jìn)入TIME_WAIT狀態(tài)后,將等待2個(gè)MSL時(shí)間,在這段時(shí)間內(nèi),TCP可以重發(fā)丟失的ACK,丟棄來自新連接替身的遲到的報(bào)文段以防止被曲解,所以需要2MSL定時(shí)器,超時(shí)后關(guān)閉連接。
8. 當(dāng)TCP發(fā)送數(shù)據(jù),調(diào)用ip_output返回ENOBUFS差錯(cuò)時(shí),可能會(huì)發(fā)生什么情況?
當(dāng)提交給網(wǎng)絡(luò)層因?yàn)閮?nèi)存不足發(fā)送失敗時(shí),數(shù)據(jù)包被丟棄。如果丟棄的是數(shù)據(jù)報(bào)文,重傳定時(shí)器超時(shí)后數(shù)據(jù)將被重傳;如果丟棄的是純ACK報(bào)文,對(duì)端收不到ACK時(shí)會(huì)重傳對(duì)應(yīng)的數(shù)據(jù)報(bào)文;如果丟棄的是RST報(bào)文,當(dāng)對(duì)端重傳導(dǎo)致發(fā)送RST報(bào)文的數(shù)據(jù)報(bào)文時(shí),將再次生成RST報(bào)文。
9. TCP何時(shí)發(fā)送ACK報(bào)文?
對(duì)于數(shù)據(jù)、SYN和FIN報(bào)文,發(fā)送ACK,但對(duì)于純ACK和RST報(bào)文,不會(huì)發(fā)送;另外當(dāng)遇以下情況時(shí),則立即發(fā)送。
1)200ms延時(shí)ACK定時(shí)器超時(shí);2)收到失序的報(bào)文段;3)三次握手收到了SYN;4)收到了FIN。
10. TCP何時(shí)發(fā)送RST報(bào)文?
1)當(dāng)收到報(bào)文段,但沒有找到對(duì)應(yīng)的internet pcb或tcp pcb。
2)當(dāng)連接處于LISTEN狀態(tài)時(shí),收到了ACK報(bào)文段。
3)當(dāng)連接處于SYS_SENT狀態(tài)時(shí),收到了錯(cuò)誤的ACK報(bào)文段(ack小于等于iss或大于snd_max)。
4)當(dāng)連接被動(dòng)關(guān)閉時(shí)(狀態(tài)大于CLOSE_WAIT),收到了數(shù)據(jù)。
5)當(dāng)連接處于SYN_RCVD狀態(tài)時(shí),收到了錯(cuò)誤的ACK報(bào)文段(ack小于snd_una或大于snd_max)。
posted on 2013-08-25 10:50
春秋十二月 閱讀(2565)
評(píng)論(1) 編輯 收藏 引用 所屬分類:
Network