本文轉(zhuǎn)載自 https://www.cnblogs.com/fengzanfeng/articles/1339347.html
感謝作者的總結(jié)税手。
為什么會有TCP/IP協(xié)議
在世界上各地,各種各樣的電腦運行著各自不同的操作系統(tǒng)為大家服務(wù)拯辙,這些電腦在表達(dá)同一種信息的時候所使用的方法是千差萬別。就好像圣經(jīng)中上帝打亂了各地人的口音,讓他們無法合作一樣吁脱。計算機使用者意識到,計算機只是單兵作戰(zhàn)并不會發(fā)揮太大的作用彬向。只有把它們聯(lián)合起來兼贡,電腦才會發(fā)揮出它最大的潛力。于是人們就想方設(shè)法的用電線把電腦連接到了一起娃胆。
但是簡單的連到一起是遠(yuǎn)遠(yuǎn)不夠的遍希,就好像語言不同的兩個人互相見了面,完全不能交流信息里烦。因而他們需要定義一些共通的東西來進行交流凿蒜,TCP/IP就是為此而生。TCP/IP不是一個協(xié)議胁黑,而是一個協(xié)議族的統(tǒng)稱废封。里面包括了IP協(xié)議,IMCP協(xié)議丧蘸,TCP協(xié)議漂洋,以及我們更加熟悉的http、ftp触趴、pop3協(xié)議等等氮发。電腦有了這些,就好像學(xué)會了外語一樣冗懦,就可以和其他的計算機終端做自由的交流了爽冕。
TCP/IP協(xié)議分層
提到協(xié)議分層,我們很容易聯(lián)想到ISO-OSI的七層協(xié)議經(jīng)典架構(gòu)披蕉,但是TCP/IP協(xié)議族的結(jié)構(gòu)則稍有不同颈畸。如圖所示
TCP/IP協(xié)議族按照層次由上到下乌奇,層層包裝。最上面的就是應(yīng)用層了眯娱,這里面有http礁苗,ftp,等等我們熟悉的協(xié)議。而第二層則是傳輸層徙缴,著名的TCP和UDP協(xié)議就在這個層次(不要告訴我你沒用過udp玩星際)试伙。第三層是網(wǎng)絡(luò)層,IP協(xié)議就在這里于样,它負(fù)責(zé)對數(shù)據(jù)加上IP地址和其他的數(shù)據(jù)(后面會講到)以確定傳輸?shù)哪繕?biāo)疏叨。第四層是叫數(shù)據(jù)鏈路層,這個層次為待傳送的數(shù)據(jù)加入一個以太網(wǎng)協(xié)議頭穿剖,并進行CRC編碼蚤蔓,為最后的數(shù)據(jù)傳輸做準(zhǔn)備。再往下則是硬件層次了糊余,負(fù)責(zé)網(wǎng)絡(luò)的傳輸秀又,這個層次的定義包括網(wǎng)線的制式,網(wǎng)卡的定義等等(這些我們就不用關(guān)心了贬芥,我們也不做網(wǎng)卡)吐辙,所以有些書并不把這個層次放在tcp/ip協(xié)議族里面,因為它幾乎和tcp/ip協(xié)議的編寫者沒有任何的關(guān)系誓军。發(fā)送協(xié)議的主機從上自下將數(shù)據(jù)按照協(xié)議封裝袱讹,而接收數(shù)據(jù)的主機則按照協(xié)議從得到的數(shù)據(jù)包解開,最后拿到需要的數(shù)據(jù)昵时。這種結(jié)構(gòu)非常有棧的味道捷雕,所以某些文章也把tcp/ip協(xié)議族稱為tcp/ip協(xié)議棧。
一些基本的常識
在學(xué)習(xí)協(xié)議之前壹甥,我們應(yīng)該具備一些基本知識救巷。
互聯(lián)網(wǎng)地址(ip地址)
網(wǎng)絡(luò)上每一個節(jié)點都必須有一個獨立的Internet地址(也叫做IP地址)。現(xiàn)在句柠,通常使用的IP地址是一個32bit的數(shù)字浦译,也就是我們常說的IPv4標(biāo)準(zhǔn),這32bit的數(shù)字分成四組溯职,也就是常見的255.255.255.255的樣式精盅。IPv4標(biāo)準(zhǔn)上,地址被分為五類谜酒,我們常用的是B類地址叹俏。具體的分類請參考其他文檔。需要注意的是IP地址是網(wǎng)絡(luò)號+主機號的組合僻族,這非常重要粘驰。
域名系統(tǒng)
域名系統(tǒng)是一個分布的數(shù)據(jù)庫屡谐,它提供將主機名(就是網(wǎng)址啦)轉(zhuǎn)換成IP地址的服務(wù)。
RFC
RFC是什么蝌数?RFC就是tcp/ip協(xié)議的標(biāo)準(zhǔn)文檔愕掏,在這里我們可以看到RFC那長長的定義列表,現(xiàn)在它一共有4000多個協(xié)議的定義顶伞,當(dāng)然饵撑,我們所要學(xué)習(xí)的,也就是那么十幾個協(xié)議而已枝哄。
端口號(port)
注意肄梨,這個號碼是用在TCP,UDP上的一個邏輯號碼挠锥,并不是一個硬件端口,我們平時說把某某端口封掉了侨赡,也只是在IP層次把帶有這個號碼的IP包給過濾掉了而已蓖租。
應(yīng)用編程接口
現(xiàn)在常用的編程接口有socket和TLI。而前面的有時候也叫做“Berkeley socket”羊壹,可見Berkeley對于網(wǎng)絡(luò)的發(fā)展有多大的貢獻蓖宦。
TCP/IP詳解學(xué)習(xí)筆記(2)-數(shù)據(jù)鏈路層
數(shù)據(jù)鏈路層有三個目的:
· 為IP模塊發(fā)送和 接收IP數(shù)據(jù)報。
· 為ARP模塊發(fā)送ARP請求和接收ARP應(yīng)答油猫。
· 為RARP發(fā)送RARP請 求和接收RARP應(yīng)答
ip大家都聽說過稠茂。至于ARP和RARP,ARP叫做地址解析協(xié)議情妖,是用IP地址換MAC地址的一種協(xié)議睬关,而RARP則叫做逆地址解析協(xié)議,在tcp/ip協(xié)議的后面章節(jié)會介紹它們(在局域網(wǎng)里面用ARP協(xié)議可以很容易的搞癱瘓網(wǎng)絡(luò)哦)
數(shù)據(jù)鏈路層的協(xié)議還是很多的毡证,有我們最常用的以太網(wǎng)(就是平時我們用的網(wǎng)卡)協(xié)議电爹,也有不太常見的令牌環(huán),還有FDDI料睛,當(dāng)然丐箩,還有國內(nèi)現(xiàn)在相當(dāng)普及的PPP協(xié)議(就是adsl寬帶),以及一個loopback協(xié)議恤煞。
聯(lián)系linux里面的ifconfig -a命令屎勘,這個命令通常會得到如下的結(jié)果
eth0 Link encap:Ethernet HWaddr 00:01:4A:03:5B:EDinet addr:192.168.11.2 Bcast:192.168.11.255 Mask:255.255.255.0inet6 addr: fe80::201:4aff:fe03:5bed/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:2819 errors:0 dropped:0 overruns:0 frame:0TX packets:76 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000RX bytes:241609 (235.9 KiB) TX bytes:9596 (9.3 KiB)
lo Link encap:Local Loopbackinet addr:127.0.0.1 Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING MTU:16436 Metric:1RX packets:2713 errors:0 dropped:0 overruns:0 frame:0TX packets:2713 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0RX bytes:3516032 (3.3 MiB) TX bytes:3516032 (3.3 MiB)
其中,eth0就是以太網(wǎng)接口居扒,而lo則是loopback接口概漱。這也說明這個主機在網(wǎng)絡(luò)鏈路層上至少支持loopback協(xié)議和以太網(wǎng)協(xié)議。
以太網(wǎng)(Ether-net)的定是指數(shù)字設(shè)備公司( Digital Equipment Corp.)苔货、英特爾公司(Intel Corp.)和Xerox公司在1982年聯(lián)合公布的一個標(biāo)準(zhǔn)犀概,這個標(biāo)準(zhǔn)里面使用了一種稱作CSMA/CD的接入方法立哑。而IEEE802提供的標(biāo)準(zhǔn)集802.3(還有一部分定義到了802.2中)也提供了一個CSMA/CD的標(biāo)準(zhǔn)。這兩個標(biāo)準(zhǔn)稍有不同姻灶,TCP/IP協(xié)議對這種情況的處理方式如下:
· 以太網(wǎng)的IP數(shù)據(jù)報封裝在RFC894中定義铛绰,而IEEE802網(wǎng)絡(luò)的IP數(shù)據(jù)報封裝在RFC1042中定義。
· 一臺主機一定要能發(fā)送和接收RFC894定義的數(shù)據(jù)報产喉。
· 一臺主機可以接收RFC894和RFC1042的封裝格式的混合數(shù)據(jù)報捂掰。
· 一臺主機也許能夠發(fā)送RFC1042數(shù)據(jù)報。曾沈。如果主機能同時發(fā)送兩種類型的分組數(shù) 據(jù)这嚣,那么發(fā)送的分組必須是可以設(shè)置的,而且默認(rèn)條件下必須是RFC 894分組塞俱。
可見姐帚,RFC1042在TCP/IP里面處于一個配角的地位。這兩種不同的數(shù)據(jù)報格式請參考教材障涯。
ppp(點對點協(xié)議)是從SLIP的替代品罐旗。他們都提供了一種低速接入的解決方案凸椿。而每一種數(shù)據(jù)鏈路層協(xié)議牺堰,都有一個MTU(最大傳輸單元)定義,在這個定義下面掂林,如果IP數(shù)據(jù)報過大粘我,則要進行分片(fragmentation)鼓蜒,使得每片都小于MTU,注意PPP的MTU并不是一個物理定義征字,而是指一個邏輯定義(個人認(rèn)為就是用程序控制)都弹。可以用netstat來打印出MTU的結(jié)果柔纵,比如鍵入netstat -in
Kernel Interface tableIface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flgeth0 1500 0 1774 0 0 0 587 0 0 0 BMRUlo 16436 0 2667 0 0 0 2667 0 0 0 LRU
就可以觀察到eth0的MTU是1500缔杉。而lo(環(huán)回接口)的MTU則是16436。
最后說說那個環(huán)回接口(loopback)搁料。平時我們用127.0.0.1來嘗試自己的機器服務(wù)器好使不好使或详。走的就是這個loopback接口。對于環(huán)回接口郭计,有如下三點值得注意:
·傳給環(huán)回地址(一般是127.0.0.1)的任何數(shù)據(jù)均作為I P輸入霸琴。
·傳給廣播地址或多播地址的數(shù)據(jù)報復(fù)制一份傳給環(huán)回接口,然后送到以太網(wǎng)上昭伸。這是 因為廣播傳送和多播傳送的定義包含主機本身梧乘。
·任何傳給該主機IP地址的數(shù)據(jù)均送到環(huán)回接口。
這一章還是很簡單的,一般作為了解知識也就足夠了选调,沒必要摳的那么詳細(xì)
TCP/IP詳解之IP協(xié)議ARP協(xié)議和RARP協(xié)議
把這三個協(xié)議放到一起學(xué)習(xí)是因為這三個協(xié)議處于同一層夹供,ARP協(xié)議用來找到目標(biāo)主機的Ethernet網(wǎng)卡Mac地址,IP則承載要發(fā)送的消息仁堪。數(shù)據(jù)鏈路層可以從ARP得到數(shù)據(jù)的傳送信息哮洽,而從IP得到要傳輸?shù)臄?shù)據(jù)信息。
1.IP協(xié)議
IP協(xié)議是TCP/IP協(xié)議的核心弦聂,所有的TCP鸟辅,UDP,IMCP莺葫,IGCP的數(shù)據(jù)都以IP數(shù)據(jù)格式傳輸匪凉。要注意的是,IP不是可靠的協(xié)議捺檬,這是說再层,IP協(xié)議沒有提供一種數(shù)據(jù)未傳達(dá)以后的處理機制--這被認(rèn)為是上層協(xié)議--TCP或UDP要做的事情。所以這也就出現(xiàn)了TCP是一個可靠的協(xié)議欺冀,而UDP就沒有那么可靠的區(qū)別树绩。這是后話,暫且不提
1.1.IP協(xié)議頭
挨個解釋它是教科書的活計隐轩,我感興趣的只是那八位的TTL字段,還記得這個字段是做什么的么?這個字段規(guī)定該數(shù)據(jù)包在穿過多少個路由之后才會被拋棄(這里就體現(xiàn)出來IP協(xié)議包的不可靠性渤早,它不保證數(shù)據(jù)被送達(dá))职车,某個ip數(shù)據(jù)包每穿過一個路由器,該數(shù)據(jù)包的TTL數(shù)值就會減少1鹊杖,當(dāng)該數(shù)據(jù)包的TTL成為零悴灵,它就會被自動拋棄。這個字段的最大值也就是255骂蓖,也就是說一個協(xié)議包也就在路由器里面穿行255次就會被拋棄了积瞒,根據(jù)系統(tǒng)的不同,這個數(shù)字也不一樣登下,一般是32或者是64茫孔,Tracerouter這個工具就是用這個原理工作的,tranceroute的-m選項要求最大值是255被芳,也就是因為這個TTL在IP協(xié)議里面只有8bit缰贝。
現(xiàn)在的ip版本號是4,所以也稱作IPv4∨媳簦現(xiàn)在還有IPv6剩晴,而且運用也越來越廣泛了。
1.2.IP路由選擇
當(dāng)一個IP數(shù)據(jù)包準(zhǔn)備好了的時候,IP數(shù)據(jù)包(或者說是路由器)是如何將數(shù)據(jù)包送到目的地的呢?它是怎么選擇一個合適的路徑來"送貨"的呢?
最特殊的情況是目的主機和主機直連赞弥,那么主機根本不用尋找路由毅整,直接把數(shù)據(jù)傳遞過去就可以了。至于是怎么直接傳遞的绽左,這就要靠ARP協(xié)議了悼嫉,后面會講到。
稍微一般一點的情況是妇菱,主機通過若干個路由器(router)和目的主機連接承粤。那么路由器就要通過ip包的信息來為ip包尋找到一個合適的目標(biāo)來進行傳遞,比如合適的主機闯团,或者合適的路由辛臊。路由器或者主機將會用如下的方式來處理某一個IP數(shù)據(jù)包
如果IP數(shù)據(jù)包的TTL(生命周期)以到,則該IP數(shù)據(jù)包就被拋棄房交。
搜索路由表彻舰,優(yōu)先搜索匹配主機,如果能找到和IP地址完全一致的目標(biāo)主機候味,則將該包發(fā)向目標(biāo)主機
搜索路由表刃唤,如果匹配主機失敗,則匹配同子網(wǎng)的路由器白群,這需要“子網(wǎng)掩碼(1.3.)”的協(xié)助尚胞。如果找到路由器,則將該包發(fā)向路由器帜慢。
搜索路由表笼裳,如果匹配同子網(wǎng)路由器失敗,則匹配同網(wǎng)號(第一章有講解)路由器粱玲,如果找到路由器躬柬,則將該包發(fā)向路由器。
搜索陸游表抽减,如果以上都失敗了允青,就搜索默認(rèn)路由,如果默認(rèn)路由存在卵沉,則發(fā)包
如果都失敗了颠锉,就丟掉這個包。
這再一次證明了偎箫,ip包是不可靠的木柬。因為它不保證送達(dá)。
1.3.子網(wǎng)尋址
IP地址的定義是網(wǎng)絡(luò)號+主機號淹办。但是現(xiàn)在所有的主機都要求子網(wǎng)編址眉枕,也就是說,把主機號在細(xì)分成子網(wǎng)號+主機號。最終一個IP地址就成為 網(wǎng)絡(luò)號碼+子網(wǎng)號+主機號速挑。例如一個B類地址:210.30.109.134谤牡。一般情況下,這個IP地址的紅色部分就是網(wǎng)絡(luò)號姥宝,而藍(lán)色部分就是子網(wǎng)號翅萤,綠色部分就是主機號。至于有多少位代表子網(wǎng)號這個問題上腊满,這沒有一個硬性的規(guī)定套么,取而代之的則是子網(wǎng)掩碼,校園網(wǎng)相信大多數(shù)人都用過碳蛋,在校園網(wǎng)的設(shè)定里面有一個255.255.255.0的東西胚泌,這就是子網(wǎng)掩碼。子網(wǎng)掩碼是由32bit的二進制數(shù)字序列,形式為是一連串的1和一連串的0肃弟,例如:255.255.255.0(二進制就是11111111.11111111.11111111.00000000)對于剛才的那個B類地址玷室,因為210.30是網(wǎng)絡(luò)號,那么后面的109.134就是子網(wǎng)號和主機號的組合笤受,又因為子網(wǎng)掩碼只有后八bit為0穷缤,所以主機號就是IP地址的后八個bit,就是134箩兽,而剩下的就是子網(wǎng)號碼--109津肛。
2. ARP協(xié)議
還記得數(shù)據(jù)鏈路層的以太網(wǎng)的協(xié)議中,每一個數(shù)據(jù)包都有一個MAC地址頭么?我們知道每一塊以太網(wǎng)卡都有一個MAC地址汗贫,這個地址是唯一的快耿,那么IP包是如何知道這個MAC地址的?這就是ARP協(xié)議的工作。
ARP(地址解析)協(xié)議是一種解析協(xié)議芳绩,本來主機是完全不知道這個IP對應(yīng)的是哪個主機的哪個接口,當(dāng)主機要發(fā)送一個IP包的時候撞反,會首先查一下自己的ARP高速緩存(就是一個IP-MAC地址對應(yīng)表緩存)妥色,如果查詢的IP-MAC值對不存在,那么主機就向網(wǎng)絡(luò)發(fā)送一個ARP協(xié)議廣播包遏片,這個廣播包里面就有待查詢的IP地址嘹害,而直接收到這份廣播的包的所有主機都會查詢自己的IP地址,如果收到廣播包的某一個主機發(fā)現(xiàn)自己符合條件吮便,那么就準(zhǔn)備好一個包含自己的MAC地址的ARP包傳送給發(fā)送ARP廣播的主機笔呀,而廣播主機拿到ARP包后會更新自己的ARP緩存(就是存放IP-MAC對應(yīng)表的地方)。發(fā)送廣播的主機就會用新的ARP緩存數(shù)據(jù)準(zhǔn)備好數(shù)據(jù)鏈路層的的數(shù)據(jù)包發(fā)送工作髓需。
一個典型的arp緩存信息如下许师,在任意一個系統(tǒng)里面用“arp -a”命令:
Interface: 192.168.11.3 --- 0x2
Internet Address Physical Address Type
192.168.11.1 00-0d-0b-43-a0-2e dynamic
192.168.11.2 00-01-4a-03-5b-ed dynamic
都會得到這樣的結(jié)果。
這樣的高速緩存是有時限的,一般是20分鐘(伯克利系統(tǒng)的衍生系統(tǒng))微渠。
TCP/IP詳解學(xué)習(xí)筆記(4)-ICMP協(xié)議搭幻,ping和Traceroute
1.IMCP協(xié)議介紹
前面講到了,IP協(xié)議并不是一個可靠的協(xié)議逞盆,它不保證數(shù)據(jù)被送達(dá)檀蹋,那么,自然的云芦,保證數(shù)據(jù)送達(dá)的工作應(yīng)該由其他的模塊來完成俯逾。其中一個重要的模塊就是ICMP(網(wǎng)絡(luò)控制報文)協(xié)議。
當(dāng)傳送IP數(shù)據(jù)包發(fā)生錯誤--比如主機不可達(dá)舅逸,路由不可達(dá)等等桌肴,ICMP協(xié)議將會把錯誤信息封包,然后傳送回給主機堡赔。給主機一個處理錯誤的機會识脆,這 也就是為什么說建立在IP層以上的協(xié)議是可能做到安全的原因。ICMP數(shù)據(jù)包由8bit的錯誤類型和8bit的代碼和16bit的校驗和組成善已。而前 16bit就組成了ICMP所要傳遞的信息灼捂。書上的圖6-3清楚的給出了錯誤類型和代碼的組合代表的意思。
盡管在大多數(shù)情況下换团,錯誤的包傳送應(yīng)該給出ICMP報文悉稠,但是在特殊情況下,是不產(chǎn)生ICMP錯誤報文的艘包。如下
ICMP差錯報文不會產(chǎn)生ICMP差錯報文(出IMCP查詢報文)(防止IMCP的無限產(chǎn)生和傳送)
目的地址是廣播地址或多播地址的IP數(shù)據(jù)報的猛。
作為鏈路層廣播的數(shù)據(jù)報。
不是IP分片的第一片想虎。
源地址不是單個主機的數(shù)據(jù)報卦尊。這就是說,源地址不能為零地址舌厨、環(huán)回地址岂却、廣播地 址或多播地址。
雖然里面的一些規(guī)定現(xiàn)在還不是很明白裙椭,但是所有的這一切規(guī)定躏哩,都是為了防止產(chǎn)生ICMP報文的無限傳播而定義的。
ICMP協(xié)議大致分為兩類揉燃,一種是查詢報文扫尺,一種是差錯報文。其中查詢報文有以下幾種用途:
1.ping查詢(不要告訴我你不知道ping程序)
2.子網(wǎng)掩碼查詢(用于無盤工作站在初始化自身的時候初始化子網(wǎng)掩碼)
- 時間戳查詢(可以用來同步時間)
而差錯報文則產(chǎn)生在數(shù)據(jù)傳送發(fā)生錯誤的時候炊汤。就不贅述了正驻。
2.ICMP的應(yīng)用--ping
ping可以說是ICMP的最著名的應(yīng)用弊攘,當(dāng)我們某一個網(wǎng)站上不去的時候。通常會ping一下這個網(wǎng)站拨拓。ping會回顯出一些有用的信息肴颊。一般的信息如下:
Reply from 10.4.24.1: bytes=32 time<1ms TTL=255Reply from 10.4.24.1: bytes=32 time<1ms TTL=255Reply from 10.4.24.1: bytes=32 time<1ms TTL=255Reply from 10.4.24.1: bytes=32 time<1ms TTL=255Ping statistics for 10.4.24.1: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms
ping這個單詞源自聲納定位,而這個程序的作用也確實如此渣磷,它利用ICMP協(xié)議包來偵測另一個主機是否可達(dá)婿着。原理是用類型碼為0的ICMP發(fā)請 求,受到請求的主機則用類型碼為8的ICMP回應(yīng)醋界。ping程序來計算間隔時間竟宋,并計算有多少個包被送達(dá)。用戶就可以判斷網(wǎng)絡(luò)大致的情況形纺。我們可以看到丘侠, ping給出來了傳送的時間和TTL的數(shù)據(jù)。我給的例子不太好逐样,因為走的路由少蜗字,有興趣地可以ping一下國外的網(wǎng)站比如sf.net,就可以觀察到一些 丟包的現(xiàn)象脂新,而程序運行的時間也會更加的長挪捕。ping還給我們一個看主機到目的主機的路由的機會。這是因為争便,ICMP的ping請求數(shù)據(jù)報在每經(jīng)過一個路由器的時候级零,路由器都會把自己的ip放到該數(shù) 據(jù)報中。而目的主機則會把這個ip列表復(fù)制到回應(yīng)icmp數(shù)據(jù)包中發(fā)回給主機滞乙。但是奏纪,無論如何,ip頭所能紀(jì)錄的路由列表是非常的有限斩启。如果要觀察路由序调, 我們還是需要使用更好的工具,就是要講到的Traceroute(windows下面的名字叫做tracert)兔簇。
3.ICMP的應(yīng)用--Traceroute
Traceroute是用來偵測主機到目的主機之間所經(jīng)路由情況的重要工具炕置,也是最便利的工具。前面說到男韧,盡管ping工具也可以進行偵測,但是默垄,因為ip頭的限制此虑,ping不能完全的記錄下所經(jīng)過的路由器。所以Traceroute正好就填補了這個缺憾口锭。
Traceroute的原理是非常非常的有意思朦前,它受到目的主機的IP后介杆,首先給目的主機發(fā)送一個TTL=1(還記得TTL是什么嗎?)的UDP(后面就 知道UDP是什么了)數(shù)據(jù)包韭寸,而經(jīng)過的第一個路由器收到這個數(shù)據(jù)包以后春哨,就自動把TTL減1,而TTL變?yōu)?以后恩伺,路由器就把這個包給拋棄了赴背,并同時產(chǎn)生 一個主機不可達(dá)的ICMP數(shù)據(jù)報給主機。主機收到這個數(shù)據(jù)報以后再發(fā)一個TTL=2的UDP數(shù)據(jù)報給目的主機晶渠,然后刺激第二個路由器給主機發(fā)ICMP數(shù)據(jù) 報凰荚。如此往復(fù)直到到達(dá)目的主機。這樣褒脯,traceroute就拿到了所有的路由器ip便瑟。從而避開了ip頭只能記錄有限路由IP的問題。
有人要問番川,我怎么知道UDP到?jīng)]到達(dá)目的主機呢到涂?這就涉及一個技巧的問題,TCP和UDP協(xié)議有一個端口號定義颁督,而普通的網(wǎng)絡(luò)程序只監(jiān)控少數(shù)的幾個號碼較 小的端口践啄,比如說80,比如說23,等等。而traceroute發(fā)送的是端口號>30000(真變態(tài))的UDP報适篙,所以到達(dá)目的主機的時候往核,目的 主機只能發(fā)送一個端口不可達(dá)的ICMP數(shù)據(jù)報給主機。主機接到這個報告以后就知道嚷节,主機到了聂儒,所以,說Traceroute是一個騙子一點也不為過:)
Traceroute程序里面提供了一些很有用的選項硫痰,甚至包含了IP選路的選項衩婚,請察看man文檔來了解這些,這里就不贅述了效斑。
TCP/IP詳解學(xué)習(xí)筆記(5)-IP選路非春,動態(tài)選路,和一些細(xì)節(jié)
1.靜態(tài)IP選路
1.1.一個簡單的路由表
選路是IP層最重要的一個功能之一缓屠。前面的部分已經(jīng)簡單的講過路由器是通過何種規(guī)則來根據(jù)IP數(shù)據(jù)包的IP地址來選擇路由奇昙。這里就不重復(fù)了。首先來看看一個簡單的系統(tǒng)路由表敌完。
Destination Gateway Genmask Flags Metric Ref Use Iface192.168.11.0 * 255.255.255.0 U 0 0 0 eth0169.254.0.0 * 255.255.0.0 U 0 0 0 eth0default 192.168.11.1 0.0.0.0 UG 0 0 0 eth0
對于一個給定的路由器储耐,可以打印出五種不同的flag。
U表明該路由可用滨溉。
G表明該路由是到一個網(wǎng)關(guān)什湘。如果沒有這個標(biāo)志长赞,說明和Destination是直連的,而相應(yīng)的Gateway應(yīng)該直接給出Destination的地址闽撤。
H表明該路由是到一個主機得哆,如果沒有該標(biāo)志,說明Destination是一個網(wǎng)絡(luò)哟旗,換句話說Destination就應(yīng)該寫成一個網(wǎng)絡(luò)號和子網(wǎng)號的組合贩据,而不包括主機號(主機號碼處為0),例如 192.168.11.0
D表明該路由是為重定向報文創(chuàng)建的
M該路由已經(jīng)被重定向報文修改
U沒啥可說的热幔,G說明這是一個網(wǎng)關(guān)乐设,如果你要發(fā)數(shù)據(jù)給Destination,IP頭應(yīng)該寫Destination的IP地址绎巨,而數(shù)據(jù)鏈路層的MAC地址就應(yīng)該是GateWay的Mac地址了近尚;反之,如果沒有G標(biāo)志场勤,那么數(shù)據(jù)鏈路層和IP層的地址應(yīng)該是對應(yīng)的戈锻。H說明了Destination的性質(zhì),如果是H的和媳,則說明該地址是一個完整的地址格遭,既有網(wǎng)絡(luò)號又有主機號,那么再匹配的時候就既要匹配網(wǎng)絡(luò)號留瞳,又要匹配主機號拒迅;反之,Destination就代表一個網(wǎng)絡(luò)她倘,在匹配的時候只要匹配一下網(wǎng)絡(luò)號就可以了璧微。
這樣,IP選路的方式就可以更加具體化了硬梁。如下
首先用IP地址來匹配那些帶H標(biāo)志的DestinationIP地址前硫。
如果1失敗就匹配那些網(wǎng)絡(luò)地址。
如果2失敗就發(fā)送到Default網(wǎng)關(guān)
順便提一下那個GenMask(還記得子網(wǎng)掩碼么)荧止,它指定了目的地址的子網(wǎng)號屹电,例如第一條的子網(wǎng)就是11。
1.2.其他有關(guān)路由表的知識
一般跃巡,我們在配置好一個網(wǎng)絡(luò)接口的時候危号,一個路由就被直接創(chuàng)建好了。當(dāng)然我們也可以手動添加路由素邪。用route add命令就可以了葱色。
而當(dāng)一個IP包在某一個路由器的時候發(fā)現(xiàn)沒有路由可走,那么該路由器就會給源主機發(fā)送“主機不可達(dá)”或者“網(wǎng)絡(luò)不可達(dá)”的ICMP包來報錯娘香。
注意苍狰,一般的操作系統(tǒng)默認(rèn)是沒有路由功能的,這需要自己配置烘绽。這些歷史原因就不細(xì)說了淋昭,
1.3.ICMP的IP重定向報文和路由發(fā)現(xiàn)報文
當(dāng)IP包在某一個地方轉(zhuǎn)向的時候,都回給發(fā)送IP報的源主機一個ICMP重定向報文安接,而源主機就可以利用這個信息來更新自己的路由表翔忽,這樣,隨著網(wǎng)絡(luò)通信的逐漸增多盏檐,路由表也就越來越完備歇式,數(shù)據(jù)轉(zhuǎn)發(fā)的速度也會越來越快。我們需要注意的是:
重定向報文只能由路由器發(fā)出胡野。
重定向報文為主機所用材失,而不是為路由器所用。
在主機引導(dǎo)的時候硫豆,一般會發(fā)送在網(wǎng)內(nèi)廣播一個路由請求的ICMP報文龙巨,而多個路由器則會回應(yīng)一個路由通告報文。而且熊响,路由其本身不定期的在網(wǎng)絡(luò)內(nèi)發(fā)布路由通告報文旨别,這樣,根據(jù)這些報文汗茄,每一個主機都會有機會建立自己的路由表而實現(xiàn)網(wǎng)絡(luò)通信秸弛。路由器在一份通告報文中可以通告多個地址,并且給出每一個地址的優(yōu)先等級洪碳,這個優(yōu)先等級是該IP作為默認(rèn)路由的等級递览,至于怎么算的就不深究了。
路由器一般會在450-600秒的時間間隔內(nèi)發(fā)布一次通告偶宫,而一個給定的通告報文的壽命是30分鐘非迹。而主機在引導(dǎo)的時候會每三秒發(fā)送一次請求報文,一旦接受到一個有效的通告報文纯趋,就停止發(fā)送請求報文憎兽。
在TCP/IP詳解編寫的時候,只有Solaris2.x支持這兩種報文吵冒,大多數(shù)系統(tǒng)還不支持這兩種報文纯命。(后面還會講到一些有用的路由報文)
動態(tài)選路協(xié)議
前面的選路方法叫做靜態(tài)選路,簡要地說就是在配置接口的時候痹栖,以默認(rèn)的方式生成路由表項亿汞。并通過route來增加表項,或者通過ICMP報文來更新表項(通常在默認(rèn)方式出錯的情況下)揪阿。 而如果上訴三種方法都不能滿足疗我,那么我們就使用動態(tài)選路咆畏。
動態(tài)選路協(xié)議是用于動態(tài)選路的重要組成部分,但是他們只是使用在路由器之間吴裤,相鄰路由器之間互相通信旧找。系統(tǒng)(路有選擇程序)選擇比較合適的路有放到核心路由表中,然后系統(tǒng)就可以根據(jù)這個核心路有表找到最合適的網(wǎng)路麦牺。也就是說钮蛛,動態(tài)選路是在系統(tǒng)核心網(wǎng)絡(luò)外部進行的,它只是用一些選路的策略影響路由表剖膳,而不會影響到最后通過路由表選擇路由的那一部分魏颓。選路協(xié)議有一大類常用的叫做內(nèi)部網(wǎng)關(guān)協(xié)議(IGP),而在IGP中吱晒,RIP就是其中最重要的協(xié)議甸饱。一種新的IGP協(xié)議叫做開放最短路經(jīng)優(yōu)先(OSPF)協(xié)議,其意在取代RIP枕荞。另一種最早用在網(wǎng)路骨干網(wǎng)上的IGP協(xié)議--HELLO柜候,現(xiàn)在已經(jīng)不用了。
如今躏精,任何支持動態(tài)選路的路由器都必須同時支持OSPF和RIP渣刷,還可以選擇性的支持其他的IGP協(xié)議。
2.1.Unix選路程序
Unix系統(tǒng)上面通常都有路由守護程序--routed矗烛。還有一個叫做gate辅柴。gate所支持的協(xié)議要比routed多,routed只是支持RIPv1版本瞭吃。而gate則支持RIPv1碌嘀、v2,BGPv1 等等歪架。
2.1.RIP:選路信息協(xié)議
它的定義可以在RFC1058內(nèi)找到股冗,這種協(xié)議使用UDP作為載體(也就是UDP的上層協(xié)議)。我們最關(guān)心的就是RIP其中的一個段和蚪,叫做度量的段止状,這是一個以hop作為計數(shù)器(就是以走過多少路由為計數(shù)器)的段(IP協(xié)議里面也有一個TTL不是么)。這個度量段將最終影響到路由表的建立攒霹。參考圖:
一般說來routed要承擔(dān)如下的工作:
給每一個已知的路由器發(fā)送rip請求報文怯疤,要求其他路由器給出完整的路由表。這種報文的命令字段為1催束,地址字段為0集峦,度量地段為16(相當(dāng)于無窮大)。
接受請求,如果接收到剛才的那個請求塔淤,就把自己的完整的路由表交給請求者摘昌。如果沒有,就處理IP請求表項高蜂,把表項中自己有的部分添上跳數(shù)第焰,沒有的部分添上16。然后發(fā)給請求者妨马。
接受回應(yīng)。更新自己的路由表杀赢。使用hop數(shù)小的規(guī)則烘跺。
定期更新路由表,一般是30s(真頻繁)給相鄰的路有啟發(fā)一次自己的路由表脂崔。這種形式可以使廣播形式的滤淳。
這個協(xié)議看起來會工作的很好,但是砌左,這里面其實有很多隱藏的憂患脖咐,比如說RIP沒有子網(wǎng)的概念,比如說環(huán)路的危險汇歹。而且hop數(shù)的上限也限制了網(wǎng)絡(luò)的大小屁擅。
因此,出現(xiàn)了很多RIPv1的替代品产弹,比如說RIPv2,比如說OSPF派歌。他們都是通過某種策略來影響路由表,所以就不說了痰哨。