1. 程式人生 > >完全認識計算機網路之TCP/IP

完全認識計算機網路之TCP/IP

原文的連結:非常感謝仁兄的作品,本文在此基礎上加上了一些參考

TCP/IP詳解學習筆記(1)-基本概念

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

但是簡單的連到一起是遠遠不夠的,就好像語言不同的兩個人互相見了面,完全不能交流資訊。因而他們需要定義一些共通的東西來進行交流,TCP/IP就是為此而生。

TCP/IP不是一個協議,而是一個協議族的統稱。裡面包括了IP協議,IMCP協議,TCP協議,以及我們更加熟悉的httpftppop3協議等等。電腦有了這些,就好像學會了外語一樣,就可以和其他的計算機終端做自由的交流了。

TCP/IP協議分層

提到協議分層,我們很容易聯想到ISO-OSI的七層協議經典架構(應用層HTTP/HTTPS,FTP,POP3,DNS;表示層主要是解釋通訊資料的意義,如程式碼轉換、格式變換等,使不同的終端可以表示。 還包括加密與解密、壓縮與解壓縮等;會話層主要內容是通過會話進行身份驗證、會話管理和確定通訊方式。一旦建立連線,會話層的任務就是管理會話;傳輸層

提供端到端的服務。可以實現流量控制、負載均衡。傳輸層資訊包含埠、控制字和校驗和。傳輸層協議主要是TCP和UDP。傳輸層位於OSI的第四層,這層使用的裝置是主機本身;網路層管理連線方式和路由選擇。連線方式:虛電路(Virtual Circuits)和資料報(Datagram)服務。虛電路是面向連線的(Connection-Oriented),資料通訊一次路由,通過會話建立的一條通路。資料報是非連線的(Connectionless-Oriented),每個資料報都有路由能力。網路層的資料單位是包,使用的是IP地址,典型裝置是路由器Router。這一層可以進行流量控制,但流量控制更多的是使用第二層或第四層;鏈路層
遮蔽傳輸介質的物理特徵,使資料可靠傳送。內容包括介質訪問控制、連線控制、順序控制、流量控制、差錯控制和仲裁協議等。鏈路層協議有:協議有面向字元的通訊協議(PPP)和麵向位的通訊協議(HDLC)。仲裁協議:802.3、802.4、802.5,即:CSMA/CD(Carrier Sense Multiple Access with Collision Detection)、Token Bus、Token Ring鏈路層資料單位是幀,實現對MAC地址的訪問,典型裝置是交換機Switch;物理層機械效能:介面的型狀,尺寸的大小,引腳的數目和排列方式等。電氣效能:介面規定訊號的電壓、電流、阻抗、波形、速率及平衡特性等。工程規範:介面引腳的意義、特性、標準。工作方式:確定資料位流的傳輸方式,如:單工、半雙工或全雙工。
物理層協議有:美國電子工業協會(EIA)的RS232,RS422,RS423,RS485等;國際電報電話諮詢委員會(CCITT)的X.25、X.21等;物理層的資料單位是位(BIT),典型裝置是集線器HUB。這層主要和硬體有關,與軟體關係不大),但是TCP/IP協議族的結構則稍有不同。如圖所示


TCP/IP協議族按照層次由上到下,層層包裝。最上面的就是應用層了,這裡面有httpftp,等等我們熟悉的協議。而第二層則是傳輸層,著名的TCPUDP協議就在這個層次(不要告訴我你沒用過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地址分為A,B,C,D,E五類。

網路號:用於識別主機所在的網路;
主機號:用於識別該網路中的主機。

其中A類分配給政府機關使用,B類地址給大中型企業使用,C類地址給個人使用。這三種是主要的。

IP地址分為五類,A類保留給政府機構,B類分配給中等規模的公司,C類分配給任何需要的人,D類用於組播,E類用於實驗,各類可容納的地址數目不同。

其中A類、B類、和C類這三類地址用於TCP/IP節點,其它兩類D類和E類被用於特殊用途。
A、B、C三類IP地址的特徵:當將IP地址寫成二進位制形式時,A類地址的第一位總是O,B類地址的前兩位總是10,C類地址的前三位總是110。


1. A類地址
⑴ A類地址第1位元組為網路地址,其它3個位元組為主機地址。
⑵ A類地址範圍:1.0.0.1—126.155.255.254
⑶ A類地址中的私有地址和保留地址:
10.X.X.X是私有地址(所謂的私有地址就是在網際網路上不使用,而被用在區域網絡中的地址)。
127.X.X.X是保留地址,用做迴圈測試用的。

2. B類地址
⑴ B類地址第1位元組和第2位元組為網路地址,其它2個位元組為主機地址。
⑵ B類地址範圍:128.0.0.1—191.255.255.254
⑶ B類地址的私有地址和保留地址
172.16.0.0—172.31.255.255是私有地址
169.254.X.X是保留地址。如果你的IP地址是自動獲取IP地址,而你在網路上又沒有找到可用的DHCP伺服器。就會得到其中一個IP。

3. C類地址
⑴ C類地址第1位元組、第2位元組和第3個位元組為網路地址,第4個個位元組為主機地址。另外第1個位元組的前三位固定為110。
⑵ C類地址範圍:192.0.0.1—223.255.255.254
⑶ C類地址中的私有地址:
192.168.X.X是私有地址。

4. D類地址
⑴ D類地址不分網路地址和主機地址,它的第1個位元組的前四位固定為1110。
⑵ D類地址範圍:224.0.0.1—239.255.255.254

5. E類地址
⑴ E類地址也不分網路地址和主機地址,它的第1個位元組的前五位固定為11110。
⑵ E類地址範圍:240.0.0.1—255.255.255.254

·域名系統

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

·RFC

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

·埠號(port)

注意,這個號碼是用在TCPUDP上的一個邏輯號碼,並不是一個硬體埠,我們平時說把某某埠封掉了,也只是在IP層次把帶有這個號碼的IP包給過濾掉了而已。

·應用程式設計介面

現在常用的程式設計介面有socketTLI。而前面的有時候也叫做“Berkeley socket”,可見Berkeley對於網路的發展有多大的貢獻。

·資料的封裝

當應用程式用TCP傳送資料時,資料被送入協議棧中,然後逐個通過每一層,直接到當作一串位元流送入網路。其中每一層對收到的資料都要加一些首部資訊(有時還要增加尾部資訊)





資料鏈路層有三個目的:

·IP模組傳送和 接收IP資料報。

·ARP模組傳送ARP請求和接收ARP應答。

·RARP傳送RARP 求和接收RARP應答

ip大家都聽說過。至於ARPRARPARP叫做地址解析協議,是用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定義的資料報。

·一臺主機可以接收RFC894RFC1042的封裝格式的混合資料報。

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

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

ppp(點對點協議)是從SLIP的替代品。他們都提供了一種低速接入的解決方案。而每一種資料鏈路層協議,都有一個MTU(最大傳輸單元)定義,在這個定義下面,如果IP資料報過大,則要進行分片(fragmentation),使得每片都小於MTU,注意PPPMTU並不是一個物理定義,而是指一個邏輯定義(個人認為就是用程式控制)。可以用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

就可以觀察到eth0MTU1500。而lo(環回介面)的MTU則是16436

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

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

·傳給廣播地址或多播地址的資料報復制一份傳給環回介面,然後送到乙太網上。這是 因為廣播傳送和多播傳送的定義包含主機本身。

·任何傳給該主機IP地址的資料均送到環回介面。


把這三個協議放到一起學習是因為這三個協議處於同一層,ARP協議用來找到目標主機的Ethernet網絡卡Mac地址,IP則承載要傳送的訊息。資料鏈路層可以從ARP得到資料的傳送資訊,而從IP得到要傳輸的資料資訊。

1.IP協議

IP協議是TCP/IP協議的核心,所有的TCPUDPIMCPIGCP的資料都以IP資料格式傳輸。要注意的是,IP不是可靠的協議,這是說,IP協議沒有提供一種資料未傳達以後的處理機制--這被認為是上層協議--TCPUDP要做的事情。所以這也就出現了TCP是一個可靠的協議,而UDP就沒有那麼可靠的區別。這是後話,暫且不提

1.1.IP協議頭

  如圖所示

  

ip協議報頭

  挨個解釋它是教科書的活計,我感興趣的只是那八位的TTL欄位,還記得這個欄位是做什麼的麼?這個欄位規定該資料包在穿過多少個路由之後才會被拋棄(這裡就體現出來IP協議包的不可靠性,它不保證資料被送達),某個ip資料包每穿過一個路由器,該資料包的TTL數值就會減少1,當該資料包的TTL成為零,它就會被自動拋棄。這個欄位的最大值也就是255,也就是說一個協議包也就在路由器裡面穿行255次就會被拋棄了,根據系統的不同,這個數字也不一樣,一般是32或者是64Tracerouter這個工具就是用這個原理工作的,tranceroute-m選項要求最大值是255,也就是因為這個TTLIP協議裡面只有8bit

  現在的ip版本號是4,所以也稱作IPv4。現在還有IPv6,而且運用也越來越廣泛了。

1.2.IP路由選擇

  當一個IP資料包準備好了的時候,IP資料包(或者說是路由器)是如何將資料包送到目的地的呢?它是怎麼選擇一個合適的路徑來"送貨"的呢?

  最特殊的情況是目的主機和主機直連,那麼主機根本不用尋找路由,直接把資料傳遞過去就可以了。至於是怎麼直接傳遞的,這就要靠ARP協議了,後面會講到。

  稍微一般一點的情況是,主機通過若干個路由器(router)和目的主機連線。那麼路由器就要通過ip包的資訊來為ip包尋找到一個合適的目標來進行傳遞,比如合適的主機,或者合適的路由。路由器或者主機將會用如下的方式來處理某一個IP資料包