程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> TCP/IP學習筆記(4)

TCP/IP學習筆記(4)

編輯:關於VC++

一、UDP協議

UDP 是一個簡單的面向數據報的運輸層協議,進程的每個輸出操作都產生一個UDP數據報,並組裝成一份待發送的IP數據報。UDP不提供可靠性。

UDP封裝格式:

IP首部(20) UDP首部(8) UDP數據

1、UDP首部:

16位源端口號 16位目的端口號 16位UDP長度 16位UDP檢驗和 數據(如果有)

端口號表示發送和接收的進程。

UDP長度字段指的是UDP首部和UDP數據的字節長度,該字段的最小值是8,表示沒有數據。該長度不包括IP首部長度。

UDP檢驗和包括UDP首部和UDP數據的檢驗和。由於UDP數據報的長度可以為奇數字節數,因此計算時在最後增加填充字節0,這只是為了檢驗和的計算。

2、UDP檢驗和

UDP和TCP首部都包含一個12字節的偽首部,包含了IP首部和自身的一些字段,主要是為了計算檢驗和而設置的。偽首部是不占實際空間的。偽首部包含IP首部的一些字段,目的是讓UDP兩次檢查數據是否已經到達目的地,以及IP層是否正確地傳輸了數據。

UDP偽首部格式如下:

32位源IP地址 32位目的IP地址 0 8位協議(17) 16位UDP長度 16位源端口 16位目的端口 16位UDP長度 16位UDP檢驗和 數據(如果有)

前12個字節就是UDP偽首部。

注意:UDP數據報的長度在檢驗和計算過程中出現兩次。如果檢驗和的計算結果為0,則存入的值為全1(65535),如果傳送的檢驗和是0,則說明發送端沒有計算檢驗和。如果有錯誤,該報就被丟棄,不產生任何差錯報文。

3、IP分片

任何IP層接收到一份要發送的IP數據報時,它要判斷向本地哪個接口發送數據,並查詢該接口的MTU。IP把MTU與數據報的長度進行比較,如果需要則進行分片。分片可以發生在原始發送端主機上,也可以發送在中間路由器上。IP數據報分片後,只有到達目的主機後才進行重裝。

IP首部與分片有關的字段:

(1)對於每份IP數據報來說,都有一個標識字段,該值在分片時被復制到每個片中。

(2)標志字段用其中一個bit表示“更多的片”,除最後一片外,其他每個分片都要設置為1。

(3)片偏移字段指的是該片偏移原始數據報開始處的位置。

(4)數據報被分片後,每個片的總長度要改為該片的長度值。

(5)標志字段中有一個bit表示“不分片”,如果該位1,IP將不對數據報進行分片。IP報即使丟失一片數據報也要重傳整個數據報。為什麼呢?因為IP層沒有超時重傳的機制,必須由更高層負責超時重傳。

4、ICMP不可達差錯(需要分片)

當路由器收到一份需要分片的數據報,而在IP首部又設置了不分片(DF)的標志位。如果需要判斷到達目的端的路途中最小MTU是多少,就可以通過這個差錯實現。

報文格式如下:

類型3 代碼4 檢驗和 保留,必須為0 下一站的MTU IP首部+原始IP數據報中數據前8位

可以用Traceroute確定路徑MTU。要做的是發送分組,並設置“不分片”標志位。發送的第一個分組的長度正好與出口MTU相等,每次收到ICMP“不能分片”差錯時,就減少分組的長度。如果路由器發送的ICMP差錯報文是上面格式,包含出口的MTU,那麼就用該MTU值來發送,否則就用下一個最小的MTU值來發送。MTU值的個數是有限的,因此可以取得路徑的MTU。

5、UDP服務器的設計:

(1)客戶IP地址及端口號:Ip首部包括源端和目的端IP地址,UDP首部包括了遠端和目的端的端口號。

(2)目的IP地址

(3)UDP輸入隊列:通常程序所使用的每個UDP端口都與一個有限大小的輸入隊列相聯系。也就是來自不同客戶的差不多同時到達的請求將由UDP自動排隊,接收到的UDP數據報以其接收順序交給應用程序。

(4)限制本地IP地址:大多數UDP服務器在創建UDP端口時都使其本地IP地址具有通配符的特點,表明進入的UDP數據報如果其目的地位服務器端口,那麼在任何本地接口均可接收到它。如果該端口設置位某接口的端口號,則只有發送給該接口的UDP數據報能收到。可以在同一個端口上啟動多個服務器,如以太網有一個,以太網廣播有一個。

(5)限制遠程IP地址:UDP也可以設定只能收到指定IP地址和端口號的UDP數據報。

二、廣播

1、受限的廣播:受限的廣播地址是255.255.255.255,該地址用於主機配置過程中IP數據報的地址,此時,主機可能還不知道它所在網絡的網絡掩碼,甚至連它的IP地址也不知道。在任何情況下,路由器都不轉發目的地址為受限廣播地址的數據報,這樣的數據報只出現在本地網絡中。

2、指向網絡的廣播:指向網絡的廣播地址是主機號全為1的地址,A類網絡廣播地址為netid.255.255.255,其中netid為A類網絡的網絡號。

3、指向子網的廣播:指向子網的廣播地址是主機號全為1的地址,作為子網直接廣播的IP地址需要知道子網的掩碼。如果B類網絡128.1的子網掩碼是255.255.255.0,則地址128.1.2.255就是對應子網的廣播地址。

4、指向所有子網的廣播:指向所有子網的廣播也需要知道目的網絡的子網掩碼。這些廣播地址的子網號和主機號全為1。如果目的子網掩碼是255.255.255.0,那麼IP地址128.1.255.255就是一個指向所有子網的廣播地址。

三、多播

IP多播主要向多個目的地發送數據,還可以無盤工作站啟動時確定啟動引導服務。多博地址是D類地址,格式如下:

1 1 1 0 28位多播組ID

1、多播地址包括為1110地最高4位和多播組號:

范圍為:224.0.0.0到239.255.255.255。能夠接收發往一個特定多播組地址數據地主機集合稱為主機組,一個主機組可以跨越多個網絡。主機組中成員可隨時加入或離開主機組,主機組中對主機地數量沒有限制,同時不屬於某一主機組地主機可以向該組發送信息。

一些多播組地址為知名地址:

224.0.0.1-該子網內地所有系統組
224.0.0.2-該子網內地所有路由器組
224.0.1.1-網絡時間協議NTP
224.0.0.9-RIP2
224.0.1.2-SGI公司的dogfight應用

2、多播地址到以太網地址的轉換:

IANA擁有一個以太網地址塊,即高位24位為00-00-5e,這意味這該地址塊所擁有的地址范圍從00-00-5e-00-00-00到00-00-5e-ff-ff-ff。IANA將其中的一般分配為多播地址。為了指明一個多播地址,任何以太網地址的首字節必須為01,這意味者與IP多播相對應的以太網地址范圍從01-00-5e-00-00-00到01-00-5e-7f-ff-ff。

這種地址分配將使以太網多播地址的23位與IP多播組號相對應起來,通過將多播組號中的低23位映射到以太網地址中的低23位事項。

由於多播組號中的最高5位在映射過程中被忽略,因此每個以太網多播地址對應的多播組是不唯一的,32個不同的多播組號被映射位一個以太網地址。例如,多播地址224.128.64.32(16進制為e0-80-40-20)和224.0.64.32(16進制為e0-00-40-20)都映射為同一以太網地址01-00-5e-00-40-20。

既然地址映射不是唯一的,那麼設備驅動層或IP層就必須對數據報進行過濾,因為網卡可能收到主機不想接收的多播數據幀。

四、IGMP:Internet組管理協議

IGMP 讓一個物理網絡上的所有系統知道主機當前所在的廣播組。多播路由器需要這些信息以便知道多播數據報應該向哪些接口轉發。IGMP也被當作IP層的一部分,IGMP報文通過IP數據報進行傳輸,其報文格式如下: 

4位版本1 4位類型(1-2) 未用 檢驗和 32位組地址(D類IP地址)

IGMP類型位1說明是由多播路由器發出的查詢報文,為2說明是主機發出的報告報文。

檢驗和的計算和ICMP協議一樣。

組地址為D類IP地址,在查詢報文中組地址設置為0,在報告報文中組地址為要參加的組地址。

1、加入一個多播組

進程以某種方式在給定的接口上加入某個多播組,進程也能離開先前加入的多播組。一個進程可以在多個接口上加入同一多播組。主機通過組地址和接口來標識一個多播組。主機必須保留一個表,該表中包含所有至少含有一個進程的多播組及多播組中的進程數量。

2、IGMP報告和查詢

多播路由器通過IGMP報文來記錄與該路由器相連網絡中組成員的變化情況,規則如下:

(1) 當第一個進程加入組時,主機就發送一個IGMP報告。如果主機的多個進程加入同一組,只發送一個IGMP報告。這個報告被發送到進程加入組所在的同一接口上。

(2) 進程離開一個組時,主機不發送IGMP報告,即使時組中最後一個進程離開。主機知道在確定的組中已不再由組成員後,在隨後的IGMP查詢中就不再發送報告報文。

(3) 多播路由器定時發送IGMP查詢是否還有任何主機包含有屬於多播組的進程。多播路由器必須向每一個接口發送IGMP查詢。因為路由器希望主機對它加入的每個多播組均返回一個報告,因此IGMP查詢報文中的組地址被設置為0。

(4) 主機通過發送IGMP報告來響應一個IGMP查詢,對每個至少還包含一個進程的組均要發回IGMP報告。

3、實現細節

(1) 當一個主機首次發送IGMP報告時,並不保證該報告被可靠地接收,下一個報告將在間隔一段時間後發送。

(2) 當一個主機收到從一個路由器發出地查詢後,並不立即響應,而是經過一定的時間間隔後才發出一些響應。

(3) 一個主機在等待發送報告的過程中,卻收到了發自其他主機的相同報告,則該主機的響應就不用發送了。

(4) 在沒有任何多播路由器的單個物理網絡中,僅有的IGMP通信量就是在主機加入一個新的多播組時,支持IP多播的主機發送的報告。

4、生存時間字段

IGMP報告和查詢的生存時間(TTL)均設置為1,這將使多播數據報僅限於同一子網內傳送。更大的TTL值能被多播路由器轉發。224.0.0.0-224.0.0.255的特殊地址使打算用於多播范圍不超過1跳的應用,不管TTL是多少,多播路由器均不轉發目的地址為這些地址中的任何一個地址的數據報。

5、所有主機組

224.0.0.1地址稱為所有主機組地址,它涉及在一個物理網絡中所有具備多播能力的主機和路由器。當接口初始化後,所有具備多播能力接口上的主機均自動加入這個多播組。這個組的成員無需發送IGMP報告。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved