天天看點

TCP/IP協定 FAQ (一)

TCP/IP協定 FAQ (一)

   本文所述的問題與解答,以古老經典的4.4BSD-Lite實作為準,參考《TCP/IP協定詳解》卷1、卷2和卷3 ,加入個人的了解,理清主幹,不深究細枝末節,皆在總結基本原理和實作。

【Data Link】

1. 環回接口位址必須是127.0.0.1嗎?

   形如127.x.x.x的A類IP都可作為環回接口的位址,但常用的是127.0.0.1。

2. 環回接口為什麼沒有輸入處理?

   發送到環回接口的資料報實質上被送到網絡層的輸入隊列中,是以資料報沒有離開網絡,也就不可能從鍊路上接收到目标位址為環回接口位址的資料幀,是以不存在輸入處理。

3. SLIP、環回和以太網接口,三者有何不同?

   SLIP和環回接口沒有鍊路層首部和硬體位址,環回接口沒有輸入處理,而以太網接口都有。

4. SLIP和以太網接口如何分用輸入幀,環回接口如何分用輸出分組?

   SLIP将幀直接放進IP輸入隊列中,以太網接口則根據幀類型字段放到對應的協定輸入隊列中,環回接口則按目的位址族放到對應的輸入隊列中。

【ARP & RARP】

1. 何時發送ARP請求,何時應答ARP請求?

   當單點傳播發送IP資料并且查詢ARP高速緩存失敗時,就會廣播一個詢問目的主機硬體位址的ARP請求;當接收到ARP請求的主機就是該請求所要查找的目的主機或目的主機的ARP代理伺服器時,就會單點傳播一個ARP應答。

2. 為什麼兩者的以太網幀類型不同?

   ARP值為0x0806,RARP為0x8035,其實對于發送方來說,利用ARP的op字段可以區分RARP,但對于接收方,由于ARP實作在核心中,而RARP一般實作為伺服器,是以為了更易區分,就單獨用另一個值辨別。

3. 設計RARP伺服器有哪些問題?

   一是怎麼發送以太網幀以響應請求,這與系統相關。二是當存在多個伺服器時,同時發送響應幀會造成以太網沖突,這可以通過分主從伺服器和随機延時來優化避免。

4. ARP在等待應答時,它會如何處理發往給定目的的多個封包?

   在大多數的實作中,在等待一個ARP應答時,隻将最後一個封包發給特定目的主機。Host Requirements RFC要求實作中必須防止這種類型的ARP洪泛,建議最高速率是每秒一次。

5. 免費ARP有什麼作用?

   一般的ARP請求用于查詢目标硬體位址,并等待應答。而免費的ARP送出請求并不一定期望應答,這可以有兩方面的作用:

   1)一個主機可以确定是否存在相同IP位址的另一主機

   2)當本機硬體位址改變時,通知其它主機更新ARP高速緩存。

6. ARP如何映射一個IP多點傳播位址?

   先擷取IP多點傳播位址的低23位,再與常量0x01005e7f0000按位或,結果就是對應的多點傳播硬體位址。

【IP】

1. 何時何地分片?

   當資料報長度大于鍊路接口MTU且DF=0時,開始分片,分片可發生在源主機,也可發生在中途路由器。

2. 如何分片?

   1)計算每個分片的資料長度(不含IP首部),除後一個分片外,其它分片資料長度為8位元組的倍數。

   2)除複制對應資料外,還複制原始分組的首部及(部分)選項到新的每個分片中,更新新分片首部的頭部長度、總長度、MF标志和偏移量。如果原始分組已經是分片,那麼MF=1,否則最後一個分片MF=0,其餘MF=1。

3. 何時何地重裝?

   由于分片可以有不同的路由,而且中途路由器可能再次分片,是以隻有目标主機才能重裝所有分片。當接收端第一次收到一個MF或偏移量非零的分組時,則該分組就是一個必須被重裝的分片,于是開始重裝。

4. 如何重裝?

   1)使用4元組{源位址,目标位址,協定,16位辨別}為唯一辨別查找目前分片所屬的資料報(分片表),如果沒有找到,則建立分片表,按偏移量将目前分片插入到分片表,并啟動重裝定時器。

   2)如果重裝定時器逾時後,還沒有組裝好一個完整的IP資料報,此時如果已經收到第一個分片,則向源主機傳回ICMP逾時差錯,最後丢棄收到的所有分片;否則,送出資料給适當的傳輸層處理。

5. 哪些分組能被轉發,何時轉發?

   到達非最終目的地系統的分組,且當系統配置為可轉發或分組包含源路由時,才能被轉發,但下列類型的分組除外:1)鍊路層廣播 2)環回分組 3)網絡0和E類目标位址 4)D類目标位址。

【ICMP】

1. ICMP封包有哪些類型,何時何地生成這些封包?

   包括請求、應答、差錯和重定向4種,其中前兩者可統一為查詢類。請求當需要查詢的時候由程序生成,應答由當核心收到請求封包時生成,當主機發出的資料報無法成功地送出給目的主機時,目的主機或中間路由器的IP或傳輸協定生成差錯封包,并傳回給原來的系統。

2. 核心怎麼處理收到的ICMP封包?

   ICMP是一種傳輸層協定,其協定号為1,當IP層收到一個ICMP封包時,分用交給ICMP協定輸入處理,ICMP協定輸入根據其類型分别處理:1)請求---生成适當的應答封包 2)差錯---送出給适當的傳輸層協定處理 3)應答---送出給等待ICMP封包的程序 4)重定向---更新路由表,并送出給等待的程序。

3. 怎麼發送ICMP封包?

   構造ICMP封包-->計算ICMP檢驗和-->封裝到IP資料報中->送出給IP協定輸出處理,對于使用者程序,須使用原始IP機制才能發送。

【TCP & UDP】

1. 為什麼TCP首部存在首部長度字段,而UDP卻沒有?

   TCP首部存在選項,如mss,timestame,nop和wscale等。

2. 為什麼這兩種協定首部前面都是源和目的端口?

   當TCP收到一個ICMP差錯時,必須檢查兩個端口号以決定差錯對應于哪個連接配接;隻有當UDP套接口連接配接到對端時,使用者程序才會收到ICMP差錯,例如當伺服器未運作時,傳回的ICMP端口不可達消息。

3. 當收到TCP或UDP資料包時,怎麼送出給應用層?

   送出給綁定了目标位址或通配位址的那個插口,如果兩者都有綁定(通過設定SO_REUSRADDR實作),則送出到目标位址的那個插口。

4. 計算首部檢驗和時,為什麼要引入僞首部?

   這是因為考慮到IP層的可能差錯,TCP和UDP需要驗證資料包是否被遞送到正确的協定和目的主機。

5. UDP何時會計算檢驗和,如何區分是否使用了檢驗和?

   UDP的檢驗和是可選的,當系統沒有禁止(udpcksum非零)時,發送方會計算檢驗和,接收方還須輸入分組檢驗和非零才會計算檢驗和。如果檢驗和字段非零,那麼就使用了,反之沒有。

TCP/IP協定 FAQ (一)

繼續閱讀