• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-162  評(píng)論-223  文章-30  trackbacks-0
               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方面的問(wèn)題與解答。

            【Data Link】
            1. 環(huán)回接口地址必須是127.0.0.1嗎?
               形如127.x.x.x的A類(lèi)IP都可作為環(huán)回接口的地址,但常用的是127.0.0.1。
            2. 環(huán)回接口為什么沒(méi)有輸入處理?
               發(fā)送到環(huán)回接口的數(shù)據(jù)報(bào)實(shí)質(zhì)上被送到網(wǎng)絡(luò)層的輸入隊(duì)列中,因此數(shù)據(jù)報(bào)沒(méi)有離開(kāi)網(wǎng)絡(luò),也就不可能從鏈路上接收到目標(biāo)地址為環(huán)回接口地址的數(shù)據(jù)幀,所以不存在輸入處理。
            3. SLIP、環(huán)回和以太網(wǎng)接口,三者有何不同?
               SLIP和環(huán)回接口沒(méi)有鏈路層首部和硬件地址,環(huán)回接口沒(méi)有輸入處理,而以太網(wǎng)接口都有。
            4. SLIP和以太網(wǎng)接口如何分用輸入幀,環(huán)回接口如何分用輸出分組?
               SLIP將幀直接放進(jìn)IP輸入隊(duì)列中,以太網(wǎng)接口則根據(jù)幀類(lèi)型字段放到對(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ù)并且查詢(xún)ARP高速緩存失敗時(shí),就會(huì)廣播一個(gè)詢(xún)問(wèn)目的主機(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)幀類(lèi)型不同?
               ARP值為0x0806,RARP為0x8035,其實(shí)對(duì)于發(fā)送方來(lái)說(shuō),利用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ù)器有哪些問(wèn)題?
               一是怎么發(fā)送以太網(wǎng)幀以響應(yīng)請(qǐng)求,這與系統(tǒng)相關(guān)。二是當(dāng)存在多個(gè)服務(wù)器時(shí),同時(shí)發(fā)送響應(yīng)幀會(huì)造成以太網(wǎng)沖突,這可以通過(guò)分主從服務(wù)器和隨機(jī)延時(shí)來(lái)優(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)中必須防止這種類(lèi)型的ARP洪泛,建議最高速率是每秒一次。
            5. 免費(fèi)ARP有什么作用?
               一般的ARP請(qǐng)求用于查詢(xún)目標(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í),開(kāi)始分片,分片可發(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è)必須被重裝的分片,于是開(kāi)始重裝。
            4. 如何重裝?
               1)使用4元組{源地址,目標(biāo)地址,協(xié)議,16位標(biāo)識(shí)}為唯一標(biāo)識(shí)查找當(dāng)前分片所屬的數(shù)據(jù)報(bào)(分片表),如果沒(méi)有找到,則創(chuàng)建分片表,按偏移量將當(dāng)前分片插入到分片表,并啟動(dòng)重裝定時(shí)器。
               2)如果重裝定時(shí)器超時(shí)后,還沒(méi)有組裝好一個(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ā),但下列類(lèi)型的分組除外:1)鏈路層廣播 2)環(huán)回分組 3)網(wǎng)絡(luò)0和E類(lèi)目標(biāo)地址 4)D類(lèi)目標(biāo)地址。

            【ICMP】
            1. ICMP報(bào)文有哪些類(lèi)型,何時(shí)何地生成這些報(bào)文?
               包括請(qǐng)求、應(yīng)答、差錯(cuò)和重定向4種,其中前兩者可統(tǒng)一為查詢(xún)類(lèi)。請(qǐng)求當(dāng)需要查詢(xún)的時(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)文,并返回給原來(lái)的系統(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ù)其類(lèi)型分別處理: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ì)于用戶(hù)進(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è)。
               由此可見(jiàn),違反以上幾條都會(huì)引起網(wǎng)絡(luò)風(fēng)暴。

            【TCP & UDP】
            1. 為什么TCP首部存在首部長(zhǎng)度字段,而UDP卻沒(méi)有?
               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í),用戶(hù)進(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ù)的插口,如果沒(méi)找到,那么響應(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ù)的插口,如果沒(méi)有找到,則向源主機(jī)發(fā)送ICMP端口不可達(dá)差錯(cuò)。如果有多個(gè)插口有相同的最小通配匹配數(shù),那么具體由哪個(gè)插口接收依賴(lài)于不同的實(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)沒(méi)有禁止(udpcksum非零)時(shí),發(fā)送方會(huì)計(jì)算檢驗(yàn)和,接收方還須輸入分組檢驗(yàn)和非零時(shí)才會(huì)計(jì)算檢驗(yàn)和。如果檢驗(yàn)和字段非零,那么就使用了,反之沒(méi)有。
            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ì)端接收窗口是否已打開(kāi)。
               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,丟棄來(lái)自新連接替身的遲到的報(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)文段,但沒(méi)有找到對(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)  編輯 收藏 引用 所屬分類(lèi): Network

            評(píng)論:
            # re: TCP/IP FAQ 1 2013-09-05 16:51 | tb
            明白了 不少 還有些東西沒(méi)聽(tīng)說(shuō)過(guò) 還需要努力學(xué)習(xí)啊  回復(fù)  更多評(píng)論
              
            精品综合久久久久久97| 久久久无码精品亚洲日韩京东传媒| 91精品国产综合久久精品| 日韩精品久久久久久久电影蜜臀| 丰满少妇人妻久久久久久| 国产精品欧美久久久久无广告| 亚洲精品国产自在久久| 韩国无遮挡三级久久| 久久香综合精品久久伊人| 99久久精品国产一区二区三区| 伊人情人综合成人久久网小说 | 国产成人精品久久综合| 久久亚洲色一区二区三区| 777米奇久久最新地址| 一本色综合久久| 伊人久久综合热线大杳蕉下载| 狠狠色婷婷久久一区二区| 久久97久久97精品免视看| 国产成人久久激情91| 一本色道久久综合亚洲精品| 久久精品国产精品亚洲| 久久精品国产半推半就| 中文字幕久久精品无码| 亚洲国产精品嫩草影院久久| 97超级碰碰碰碰久久久久| www.久久99| 国产精品久久成人影院| 亚洲va久久久噜噜噜久久男同 | 蜜桃麻豆www久久国产精品| 色综合色天天久久婷婷基地| 72种姿势欧美久久久久大黄蕉| 久久香蕉国产线看观看精品yw| 亚洲香蕉网久久综合影视| 久久www免费人成看片| 99久久无色码中文字幕人妻| 久久精品亚洲AV久久久无码| 久久久久青草线蕉综合超碰| 伊人久久综合无码成人网| 久久综合亚洲鲁鲁五月天| 色偷偷久久一区二区三区| 日韩精品久久无码人妻中文字幕|