天天看點

TCP/IP詳解學習筆記1

為什麼會有TCP/IP協定

在世界上各地,各種各樣的電腦運作着各自不同的作業系統為大家服務,這些電腦在表達同一種資訊的時候所使用的方法是千差萬别。就好像聖經中上帝打亂了各地人的口音,讓他們無法合作一樣。計算機使用者意識到,計算機隻是單兵作戰并不會發揮太大的作用。隻有把它們聯合起來,電腦才會發揮出它最大的潛力。于是人們就想方設法的用電線把電腦連接配接到了一起。

但是簡單的連到一起是遠遠不夠的,就好像語言不同的兩個人互相見了面,完全不能交流資訊。因而他們需要定義一些共通的東西來進行交流,TCP/IP就是為此而生。TCP/IP不是一個協定,而是一個協定族的統稱。裡面包括了IP協定,IMCP協定,TCP協定,以及我們更加熟悉的http、ftp、pop3協定等等。電腦有了這些,就好像學會了外語一樣,就可以和其他的計算機終端做自由的交流了。

TCP/IP協定分層

提到協定分層,我們很容易聯想到ISO-OSI的七層協定經典架構,但是TCP/IP協定族的結構則稍有不同。如圖所示

TCP/IP協定族按照層次由上到下,層層包裝。最上面的就是應用層了,這裡面有http,ftp,等等我們熟悉的協定。而第二層則是傳輸層,著名的TCP和UDP協定就在這個層次(不要告訴我你沒用過udp玩星際)。第三層是網絡層,IP協定就在這裡,它負責對資料加上IP位址和其他的資料(後面會講到)以确定傳輸的目标。第四層是叫資料鍊路層,這個層次為待傳送的資料加入一個以太網協定頭,并進行CRC編碼,為最後的資料傳輸做準備。再往下則是硬體層次了,負責網絡的傳輸,這個層次的定義包括網線的制式,網卡的定義等等(這些我們就不用關心了,我們也不做網卡),是以有些書并不把這個層次放在tcp/ip協定族裡面,因為它幾乎和tcp/ip協定的編寫者沒有任何的關系。發送協定的主機從上自下将資料按照協定封裝,而接收資料的主機則按照協定從得到的資料包解開,最後拿到需要的資料。這種結構非常有棧的味道,是以某些文章也把tcp/ip協定族稱為tcp/ip協定棧。

一些基本的常識

在學習協定之前,我們應該具備一些基本知識。

網際網路位址(ip位址)

網絡上每一個節點都必須有一個獨立的Internet位址(也叫做IP位址)。現在,通常使用的IP位址是一個32bit的數字,也就是我們常說的IPv4标準,這32bit的數字分成四組,也就是常見的255.255.255.255的樣式。IPv4标準上,位址被分為五類,我們常用的是B類位址。具體的分類請參考其他文檔。需要注意的是IP位址是網絡号+主機号的組合,這非常重要。

域名系統

域名系統是一個分布的資料庫,它提供将主機名(就是網址啦)轉換成IP位址的服務。

RFC

RFC是什麼?RFC就是tcp/ip協定的标準文檔,在這裡我們可以看到RFC那長長的定義清單,現在它一共有4000多個協定的定義,當然,我們所要學習的,也就是那麼十幾個協定而已。

端口号(port)

注意,這個号碼是用在TCP,UDP上的一個邏輯号碼,并不是一個硬體端口,我們平時說把某某端口封掉了,也隻是在IP層次把帶有這個号碼的IP包給過濾掉了而已。

應用程式設計接口

現在常用的程式設計接口有socket和TLI。而前面的有時候也叫做“Berkeley socket”,可見Berkeley對于網絡的發展有多大的貢獻。

資料鍊路層

資料鍊路層有三個目的:

為IP子產品發送和 接收IP資料報。

為ARP子產品發送ARP請求和接收ARP應答。

為RARP發送RARP請 求和接收RARP應答

ip大家都聽說過。至于ARP和RARP,ARP叫做位址解析協定,是用IP位址換MAC位址的一種協定,而RARP則叫做逆位址解析協定,在tcp/ip協定的後面章節會介紹它們(在區域網路裡面用ARP協定可以很容易的搞癱瘓網絡哦)

資料鍊路層的協定還是很多的,有我們最常用的以太網(就是平時我們用的網卡)協定,也有不太常見的令牌環,還有FDDI,當然,還有國内現在相當普及的PPP協定(就是adsl寬帶),以及一個loopback協定。

聯系linux裡面的ifconfig -a指令,這個指令通常會得到如下的結果

eth0 Link encap:Ethernet HWaddr 00:01:4A:03:5B:ED

inet addr:192.168.11.2 Bcast:192.168.11.255 Mask:255.255.255.0

inet6 addr: fe80::201:4aff:fe03:5bed/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:2819 errors:0 dropped:0 overruns:0 frame:0

TX packets:76 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:241609 (235.9 KiB) TX bytes:9596 (9.3 KiB)

lo Link encap:Local Loopback

inet addr:127.0.0.1 Mask:255.0.0.0

inet6 addr: ::1/128 Scope:Host

UP LOOPBACK RUNNING MTU:16436 Metric:1

RX packets:2713 errors:0 dropped:0 overruns:0 frame:0

TX packets:2713 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:3516032 (3.3 MiB) TX bytes:3516032 (3.3 MiB)

其中,eth0就是以太網接口,而lo則是loopback接口。這也說明這個主機在網絡鍊路層上至少支援loopback協定和以太網協定。

以太網(Ether-net)的定是指數字裝置公司( Digital Equipment Corp.)、英特爾公司(Intel Corp.)和Xerox公司在1982年聯合公布的一個标準,這個标準裡面使用了一種稱作CSMA/CD的接入方法。而IEEE802提供的标準集802.3(還有一部分定義到了802.2中)也提供了一個CSMA/CD的标準。這兩個标準稍有不同,TCP/IP協定對這種情況的處理方式如下:

以太網的IP資料報封裝在RFC894中定義,而IEEE802網絡的IP資料報封裝在RFC1042中定義。

一台主機一定要能發送和接收RFC894定義的資料報。

一台主機可以接收RFC894和RFC1042的封裝格式的混合資料報。

一台主機也許能夠發送RFC1042資料報。。如果主機能同時發送兩種類型的分組數 據,那麼發送的分組必須是可以設定的,而且預設條件下必須是RFC 894分組。

可見,RFC1042在TCP/IP裡面處于一個配角的地位。這兩種不同的資料報格式請參考教材。

ppp(點對點協定)是從SLIP的替代品。他們都提供了一種低速接入的解決方案。而每一種資料鍊路層協定,都有一個MTU(最大傳輸單元)定義,在這個定義下面,如果IP資料報過大,則要進行分片(fragmentation),使得每片都小于MTU,注意PPP的MTU并不是一個實體定義,而是指一個邏輯定義(個人認為就是用程式控制)。可以用netstat來列印出MTU的結果,比如鍵入

netstat -in

Kernel Interface table

Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg

eth0       1500   0     1774      0      0      0      587      0      0      0 BMRU

lo        16436   0     2667      0      0      0     2667      0      0      0 LRU

就可以觀察到eth0的MTU是1500。而lo(環回接口)的MTU則是16436。

最後說說那個環回接口(loopback)。平時我們用127.0.0.1來嘗試自己的機器伺服器好使不好使。走的就是這個loopback接口。對于環回接口,有如下三點值得注意:

傳給環回位址(一般是127.0.0.1)的任何資料均作為I P輸入。

傳給廣播位址或多點傳播位址的資料報複制一份傳給環回接口,然後送到以太網上。這是 因為廣播傳送和多點傳播傳送的定義包含主機本身。

任何傳給該主機IP位址的資料均送到環回接口。