1. 程式人生 > >基礎才是王道——TCP/IP詳解學習筆記 這位仁兄寫得太好了

基礎才是王道——TCP/IP詳解學習筆記 這位仁兄寫得太好了

TCP/IP詳解學習筆記   這位仁兄寫得太好了.


http://blog.csdn.net/goodboy1881/category/204448.aspx


TCP/IP詳解學習筆記(13)-TCP堅持定時器,TCP保活定時器


TCP/IP詳解學習筆記(12)-TCP的超時與重傳

TCP/IP詳解學習筆記(11)-TCP互動資料流,成塊資料流

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

為什麼會有TCP/IP協議

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

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

TCP/IP協議分層

提到協議分層,我們很容易聯想到ISO-OSI的七層協議經典架構,但是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地址的服務。

·RFC

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

·埠號(port)

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

·應用程式設計介面

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

資料鏈路層有三個目的:

·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地址的資料均送到環回介面。

這一章還是很簡單的,一般作為了解知識也就足夠了,沒必要摳的那麼詳細。

TCP/IP詳解之IP協議ARP協議和RARP協議

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

1.IP協議

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

1.1.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資料包

  如果IP資料包的TTL(生命週期)以到,則該IP資料包就被拋棄。

  搜尋路由表,優先搜尋匹配主機,如果能找到和IP地址完全一致的目標主機,則將該包發向目標主機

  搜尋路由表,如果匹配主機失敗,則匹配同子網的路由器,這需要子網掩碼(1.3.)”的協助。如果找到路由器,則將該包發向路由器。

  搜尋路由表,如果匹配同子網路由器失敗,則匹配同網號(第一章有講解)路由器,如果找到路由器,則將該包發向路由器。

  搜尋陸游表,如果以上都失敗了,就搜尋預設路由,如果預設路由存在,則發包

  如果都失敗了,就丟掉這個包。

  這再一次證明了,ip包是不可靠的。因為它不保證送達。

1.3.子網定址

IP地址的定義是網路號+主機號。但是現在所有的主機都要求子網編址,也就是說,把主機號在細分成子網號+主機號。最終一個IP地址就成為 網路號碼+子網號+主機號。例如一個B類地址:210.30.109.134。一般情況下,這個IP地址的紅色部分就是網路號,而藍色部分就是子網號,綠色部分就是主機號。至於有多少位代表子網號這個問題上,這沒有一個硬性的規定,取而代之的則是子網掩碼,校園網相信大多數人都用過,在校園網的設定裡面有一個255.255.255.0的東西,這就是子網掩碼。子網掩碼是由32bit的二進位制數字序列,形式為是一連串的1和一連串的0,例如:255.255.255.0(二進位制就是11111111.11111111.11111111.00000000)對於剛才的那個B類地址,因為210.30是網路號,那麼後面的109.134就是子網號和主機號的組合,又因為子網掩碼只有後八bit0,所以主機號就是IP地址的後八個bit,就是134,而剩下的就是子網號碼--109

2. ARP協議

  還記得資料鏈路層的乙太網的協議中,每一個數據包都有一個MAC地址頭麼?我們知道每一塊乙太網卡都有一個MAC地址,這個地址是唯一的,那麼IP包是如何知道這個MAC地址的?這就是ARP協議的工作。

ARP(地址解析)協議是一種解析協議,本來主機是完全不知道這個IP對應的是哪個主機的哪個介面,當主機要傳送一個IP包的時候,會首先查一下自己的ARP快取記憶體(就是一個IP-MAC地址對應表快取),如果查詢的IP-MAC值對不存在,那麼主機就向網路傳送一個ARP協議廣播包,這個廣播包裡面就有待查詢的IP地址,而直接收到這份廣播的包的所有主機都會查詢自己的IP