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

TCP/IP學習筆記(3)

編輯:關於VC++

一、Ping程序:

先看:

//ping
   C:\WINNT\system32>ping svr00804
   Pinging svr00804.sccnj.swirebev.com [192.1.8.12] with 32 bytes of data:
   Reply from 192.1.8.12: bytes=32 time<10ms TTL=128
   Reply from 192.1.8.12: bytes=32 time<10ms TTL=128
   Reply from 192.1.8.12: bytes=32 time<10ms TTL=128
   Reply from 192.1.8.12: bytes=32 time<10ms TTL=128
   Ping statistics for 192.1.8.12:
   Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
   Approximate round trip times in milli-seconds:
   Minimum = 0ms, Maximum = 0ms, Average = 0ms   

ICMP回顯請求和回顯應答報文格式如下:(以Ping為例)

類型0或8 代碼0 檢驗和 標識符 序號

結構定義如下:

typedef struct icmp_hdr
{
unsigned char icmp_type; //類型
unsigned char icmp_code; //代碼
unsigned short icmp_checksum; //檢驗和
unsigned short icmp_id; //標識符
unsigned short icmp_sequence; //序號
} ICMP_HDR, *PICMP_HDR, FAR *LPICMP_HDR;

PING程序把ICMP報文中的標識符字段設置為發送進程的ID號,這樣即使在同一台主機同時運行多個ping實例,ping程序也可以識別返回的信息。

二、IP記錄路由選項

PING程序為我們提供了查看IP記錄路由(RR)選項的機會。每個處理PING請求的路由器都把它的IP地址放入選項字段中。當PING程序收到回顯應答時,它就可以打印出這份IP地址清單。

由於IP首部中的首部長度字段只有4bit,因此IP首部最大為60字節。由於IP首部固定長度為20個字節,RR選項用去3個字節,因此存放IP地址的控件只有37個字節,也就是最多放9個IP地址。

code(1) len(1) ptr(1) 9個IP地址 多余1

code:IP選項類型,RR選項為7。

len:RR選項總長度,為39。

ptr:指針字段,存放下一個IP地址的位置,開始為4,放滿為40。

IP地址為路由器的出口地址,同時原始主機收到帶有RR選項的ICMP回響應答時也把它的入口IP地址放入清單。

三、IP時間戳選項:

Code(1) Len(1) Ptr(1) OF(4bit) FL(4bit) 時間戳

Code:時間戳的代碼為0x44。

Len: 時間戳選項總長度,一般為36或者40。

Ptr:時間戳數據指針。

OF:溢出字段。

FL:標志字段:0-只記錄時間戳

1-每台路由七都記錄IP地址和時間戳,在選項列表中只存放4對IP地址和時間戳。

3-發送端對選項列表進行初始化,存放4個IP地址和4個取值為0的時間戳。只有當列表中的下一個IP地址與當前路由器地址相匹配時,才記錄它的時間戳。

如果路由器沒有控件而不能增加時間戳選項時,那麼將設置溢出字段的值。

四、Traceroute程序:

Traceroute程序使用ICMP報文和IP首部的TTL字段,發送ICMP回顯應答時一般把TTL設置為255。工作原理:開始時發送一個TTL字段為1的數據報,然後每次將TTL字段值加1,以確定路徑中的每個路由器。每個路由器在丟棄UDP數據報時都返回一個ICMP超時報文2,而最終目的主機則產生一個ICMP端口不可到達的報文。

報文長度為40:

◆ 20字節的IP首部

◆ 8字節的UDP首部

◆ 4字節的序列號,每發一個就加1

◆ 4個字節的TTL副本

◆ 4個字節的發送數據報的時間戳。

超時報文格式:

類型11 代碼0或1 檢驗和 保留,必須為0 IP首部+原始IP數據報中數據的前8位

五、IP選路

IP搜索路由表的步驟:

◆ 搜索匹配的主機地址

◆ 搜索匹配的網絡地址

◆ 搜索默認選項

1、路由表:

DestinationGatewayFlags Refcnt use 
140.252.13.65 140.252.13.35 UGH 0 0
127.0.01127.0.01 UH10
default 140.252.13.33 UG 00
140.252.13.32 140.252.13.34 U 4 25043

說明:U-該路由可以使用(use)

G-該路由似到一個網關。(gateway)

H-該路由是到一個主機(host)

Refcnt-是正在使用路由的進程數

Use-通過該路由發送的分組數

每當初始化一個接口時,系統就為接口自動創建一個直接路由。如果到達主機和網絡的路由不是直接相連的,就需要手工加入路由表。

> route ADD 157.0.0.0 MASK 255.0.0.0 157.55.80.1 METRIC 3 IF 2
destination^ ^mask ^gateway metric^ Interface^

如果表中沒有默認項,又沒有找到匹配項。如果數據報時本地主機產生的,那麼就給發送該數據報的應用程序一個差錯,或者是“主機不可達差錯”或者是“網絡不可達差錯”。如果是被轉發的數據報,那麼就給原始發送端發送一份ICMP主機不可達的差錯報文。

2、ICMP重定向差錯

如果我們發送一份IP報給R1路由器,R1收到數據報並且檢查它的路由表,發線R2是發送該數據報的下一站。當它把數據報發送給R2時,R1檢測到它正在發送的接口與數據報到達接口是相同的(即主機和兩個路由器所在的LAN)。這樣路由器R1就會發送重定向報文給主機。

ICMP重定向差錯報文格式:

類型5 代碼(0-3) 檢驗和 應該使用的路由器IP地址 IP首部+原始IP數據報中前8個字節

代碼說明:0-網絡重定向

1-主機重定向

2-服務類型和網絡重定向

3-服務類型和主機重定向

ICMP重定向報文的接受者必須查看三個IP地址:(1)導致重定向的IP地址(2)發送重定向報文的路由器IP地址(3)因該采用的路由器IP地址。

ICMP重定向報文只能由路由器生成,不能由主機生成。

主機收到重定向報文時,在修改路由表前必須做一些檢查。

◆ 新的路由器必須直接與網絡相連接

◆ 重定向報文必須來自當前到目的地所選擇的路由器

◆ 重定向報文不能讓主機本身作為路由器

◆ 被修改的路由必須是一個間接路由

3、ICMP路由器發現報文

主機在引導以後要廣播或多播傳送一份路由器請求報文。一台或多台路由器響應一份路由器通告報文。另外,路由器定期關波或多播傳送他們的路由器通告報文,允許每個正在監聽的主機相應地更新它們地路由表。

ICMP路由器請求報文格式:

類型10 代碼0 檢驗和 保留,必須為0

ICMP路由器通告報文格式:

類型9 代碼0 檢驗和 地址數 地址項長度2 生存時間 路由器地址1 優先級1 路由器地址2 優先級2 ...

地址數指的是報文重所包含得地址數。

地址項大小指的是每個路由器地址32bit的數目,始終為2。

生存時間指的是通告地址有效的時間(秒數)

IP地址必須是發送路由器的某個地址

優先級是一個有符號的32位整數,指出該IP地址作為默認路由器地址的優先等級,值越大說明優先級越高。優先級的默認值一般設定位0。

六、動態選路協議RIP

當相鄰路由器之間進行通信,以告知對方每個路由器當前所在的網絡,這就出現了動態選路。路由器上有一個進程叫路由守護程序,它運行選路協議,並於其相鄰的一些路由器進行通信。路由器根據它從相鄰路由器接收到的信息,更新內核中的路由表。

報文格式:

IP首部 UDP首部 RIP報文   命令1-6 版本1 必須為0 地址系列2 必須為0 32位IP地址 必須為0 必須為0 度量(1-16) 最多24個另外的路由,與前20個字節格式相同

RIP報文包含在UDP數據報中。

命令1表示請求,2表示應答,3和4不用,5和6為非正式的命令。請求表示要求其他系統發送其全部或部分路由表,應答則包含發送者全部或部分路由表。

版本字段通常為1,根據實際設定。

地址系列為地址類型,IP地址為2。

由於每個報文最多攜帶25個路由,因此為了發送整個路由表,經常需要發送多個報文。

1、運行過程

初始化:在啟動一個路由守護程序時,它先判斷啟動了哪些接口,並在每個接口上發送一個請求報文,要求其他路由器發送完整路由表。目的端口號時520。這種請求報文的命令字段為1,但地址系列字段設置為0,度量字段設置為16。這是一種要求另一端完整路由表的特殊請求報文。

接收到請求:如果這個請求時剛才提到的特殊請求,那麼路由器就將完整的路由表發送給請求者。否則就處理請求中的每一個表項:如果有連接到指定地址的路由,則將度量設置為我們的值,否則將度量設置為16,表示沒有到達目的地地路由,然後發送相應。

接收到響應:使相應生效,可能會更新路由表或增加新表項,對已有地表項進行修改,或者刪除已有表項。

定期更新選路:每過30秒,所有或部分路由器會將其完整地路由表發送給相鄰的路由器,發送路由表一般是廣播形式的。

觸發更新:每當一條路由的度量發生變化時,就對它進行更新。不需要發送完整路由表,只需發送那些發生變化的表項。

每條路由都有與之相關的定時器:如果運行RIP的系統發現一條路由在3分鐘未更新,就將該路由的度量設置為16,並標注為刪除。

2、度量:

度量是相連通過的接口數,如果是直接相連,則度量是1。如果一個路由器到一個網絡有多條路由,則路由器將選擇最短的路由。

度量最大值是15,16表示無路由到達該IP地址。

3、RIP2

RIP2利用RIP報文中必須為0的字段來傳遞一些額外的信息。其報文格式如下:

命令1-6 版本2 路由域 地址類2 路由標記 32位IP地址 32位子網掩碼 32位下一站IP地址 度量(1-16) 最多24個另外的路由,與前20個字節格式相同

選路域是一個選路守護程序的標識符,指出了這個數據報的所有者。一般是進程號。

選路標記是為了指出外部網關協議存在的。

子網掩碼是應用在相應的IP地址上的。

下一站IP地址指明發往目的IP地址的報文該發向哪裡。該字段為0表示發往目的地址的報文應該發給發送RIP報文的系統。

RIP2還支持多播,以減少不收聽RIP2報文的主機的負載。

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