1. 程式人生 > >網際網路協議學習筆記

網際網路協議學習筆記

互聯協議學習筆記

參考網際網路協議入門(一)網際網路協議入門(二)這兩篇文章還有一些其他的網路文章,整理出一個簡潔的框架,希望能夠一目瞭然方便今後的查閱與深入。

OSI模型

網際網路的實現,分成好幾層。每一層都有自己的功能,就像建築物一樣,每一層都靠下一層支援。

OSI模型

TCP/IP協議組的體系結構

TCP/IP協議組的體系結構

網際網路協議的通訊過程

為了簡化,將OSI模型中的5層、6層和7層合在一起稱為應用層。簡化後的通訊過程如下圖:

網際網路協議的通訊過程

下面一步一步來解釋。

設定上網引數

假設你新買了一臺電腦,插上網線,開機,開啟瀏覽器,這時候還不能訪問網頁,需要設定四個引數:

  • 本機的IP地址
  • 子網掩碼
  • 閘道器的IP地址
  • DNS的IP地址

這四個引數如何設定呢?有兩個方法:

靜態IP地址

在Windows作業系統下設定靜態IP地址,這樣每次上網都使用同樣的IP地址。

靜態IP地址設定

動態IP地址

電腦開機後使用DHCP協議自動分配IP地址,這樣每次上網都使用不同的IP地址。

DHCP協議規定,每一個子網路中,有一臺計算機負責管理本網路的所有IP地址,叫做DHCP伺服器。新的計算機加入網路,必須向DHCP伺服器傳送DHCP請求資料包,申請IP地址和相關網路引數。

DHCP應用層協議,建立在UDP協議之上。

乙太網標頭 設定發出方(本機)的MAC地址和接收方(DHCP伺服器)的MAC地址。前者就是本機網絡卡的MAC地址,後者這時不知道,就填入一個廣播地址:FF-FF-FF-FF-FF-FF。
IP標頭

設定發出方的IP地址和接收方的IP地址。這時,對於這兩者,本機都不知道。於是,發出方的IP地址就設為0.0.0.0,接收方的IP地址設為255.255.255.255。
UDP標頭 設定發出方的埠和接收方的埠。這一部分是DHCP協議規定好的,發出方是68埠,接收方是67埠。

這個資料包構造完成後,就可以發出了。乙太網是廣播發送,同一個子網路的每臺計算機都收到了這個包。因為接收方的MAC地址是FF-FF-FF-FF-FF-FF,看不出是發給誰的,所以每臺收到這個包的計算機,還必須分析這個包的IP地址,才能確定是不是發給自己的。當看到發出方IP地址是0.0.0.0,接收方是255.255.255.255,於是DHCP伺服器知道”這個包是發給我的”,而其他計算機就可以丟棄這個包。

接下來,DHCP伺服器讀出這個包的資料內容,分配好IP地址,傳送回去一個”DHCP響應”資料包。這個響應包的結構也是類似的,乙太網標頭的MAC地址是雙方的網絡卡地址,IP標頭的IP地址是DHCP伺服器的IP地址(發出方)和255.255.255.255(接收方),UDP標頭的埠是67(發出方)和68(接收方),分配給請求端的IP地址和本網路的具體引數則包含在Data部分。

新加入的計算機收到這個響應包,於是就知道了自己的IP地址、子網掩碼、閘道器地址、DNS伺服器等等引數。

HTTP請求資料(Data)

網路設定好了以後就可以開始訪問網頁了,開啟瀏覽器輸入網址www.google.com回車。這意味這要使用HTTP協議向Google傳送一個網頁請求資料(Data)。

HTTP請求資料的部分內容類似於下面這樣:

GET / HTTP/1.1
Host: www.google.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1) ......
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: ... ...

TCP段(Segments)

HTTP協議是建立在TCP協議之上的,所以要將網頁請求資料(Data)嵌入到TCP段(Segments)中。TCP標頭需要設定埠,HTTP埠預設是80,傳送方埠是一個隨機數字。

UDP段(Segments)的標頭為8位元組,總長度最大為65535位元組。
TCP段(Segments)的標頭為20位元組,總長度沒有長度限制。

IP包(Packets)

將TCP報文(Segments)嵌入到IP包(Packets)中。IP標頭需要設定雙方的IP地址,本機的IP地址已知,接收方的IP地址未知,此時需要通過DNS協議獲取接收方的IP地址。已知DNS伺服器的IP地址192.168.0.1,於是我們向這個地址傳送一個DNS資料(Data),然後DNS伺服器會返回Google的IP地址172.194.72.105。

DNS應用層協議,建立在UDP協議之上,埠預設是53。
IP包(Packets)的標頭為20位元組到60位元組,總長度最大為65535位元組。如果TCP段(Segments)過長,需要將TCP段(Segments)進行分割。

乙太網幀(Frames)

將IP包(Packets)嵌入到乙太網幀(Frames)中。乙太網標頭需要設定雙方的MAC地址,本機的MAC地址已知,接收方的MAC地址未知,此時先通過子網掩碼判斷接收方與本機是否在同一子網路,如果在同一子網路可直接設定接收方的MAC地址,如果不在同一子網路接收方的MAC地址需設定為閘道器的MAC地址。

已知子網掩碼255.255.255.0,本機的IP地址192.168.0.198,做一個二進位制的AND運算得出網路地址為192.168.0.0;Google的IP地址172.194.72.105,做一個二進位制的AND運算得出網路地址為172.194.72.0。

網路地址不同所以Google與本機不在同一個子網路。因此,我們要向Google傳送資料包必須通過閘道器的轉發,即在乙太網標頭中接收方的MAC地址設定為閘道器的MAC地址。閘道器的MAC地址通過ARP協議獲得。

ARP協議是網路層協議,可以獲取同一子網路中其他主機的MAC地址。根據乙太網協議,本機通過廣播的方式向同一子網路的所有主機發送ARP資料包,目標主機收到包後返回自己的MAC地址。

乙太網幀(Frames)的標頭固定為18位元組,資料為46位元組到1500位元組。如果IP包(Packets)過長,需要將IP包(Packets)進行分割。

傳送請求並接受HTTP響應

資料包準備好後,經過多個閘道器的轉發,Google的伺服器收到資料包。根據IP標頭的序號,Google將包拼起來,取出TCP報文(Segments),讀出裡面的HTTP請求資料(Data),接著做出HTTP響應,再用TCP協議發過來。本機瀏覽器收到HTTP響應後就可以將網頁顯示出來,至此網路通訊完成。