LAMP預備知識

OSI七層參考模型與TCP協議棧的區別:OSI的七層參考模型只是參考模型,只是紙上談兵罷了,而TCP/IP是以OSI七層模式爲基礎演化而來的實際使用的模型,是實戰派。OSI七層參考模式的上三層是資源子網,而下四層爲通信子網。

主機與主機之間的通信:在linux的內核當中,下四層的通信功能都是在內核當中實現,主機與主機之間的通信依靠內核與內核就可以完成,也就是直接在內核空間就可以完成,根本用不上用戶空間的參與,事實上,的確有此種程序,這是一種結構。

還有另一種結構,把應用程序建立在用戶空間,用戶空間的程序想要完成通信的話就必須依靠內核空間當中通信子網,也就是說用戶空間的程序想要完成通信的話就必須依靠內核的通信子網。

套接字:套接字是爲了實現進程與進程之意的通信的一種機制,主要目的在於允許同一主機或者不同主機的不同進程之意進行通信。套接字其實有兩種類型。一般來講,一在個主機上,一個完整套接字由特定的IP+特定的端口組成,想要實現這種套接字需要內核當中的tcp/ip協議棧參與封裝報文,這只是一般來講,而事實上,套接字是分爲兩種類型的,第一種就是IP+端口的方式,這種類型的套接字主要是爲了完成主機之間的通信,IP用來標識不同的主機,而端口用來標識不同的服務。此外還有一種套接字,這種套接字叫做unix  sock,它存在的目的是爲了完成同一個主機上進程之間的通信,比如說可以把一個程序的輸出定向到一個文件當中,然後下一個程序去這個文件當中取出數據,這其實是通過文件系統實現的,而文件系統又是內核實現的,這種基於文件系統或者文件的套接字就被稱爲unix sock.

raw套接字:不基於tcp也不基於udp而是應用程序自行控制維護報文的傳輸,這種奇怪的應用程序是存在的,其實這就意味着有的應用程序可以繞過傳輸層,但是無論如此也繞不過網絡層。 這樣的話套接字就有了三種。

主機與主機之間傳輸文件的簡略過程:這個文件被用戶空間送入內核空間後,首先是由網絡層進行封裝,每一個數據包的總大小大不能超過16位,也就是65535個字節(B),而這65535個字節是包含IP首部,而IP的首部最少是20個字節,最大是60個字節,所以一個IP數據包除去首部之後要傳輸的數據大小範圍爲:65475B-----65515B之間,也就是說一個IP數據包要傳輸的文件大小範圍在0.65M左右。

這一個數據包到達下一層數據鏈路層的時候還要切片,鏈路層數據的最大傳輸單元是大於等於46字節小於等於1500個字節,加上幀頭與幀尾固定的18個字節,也就是一個數據幀的大小範圍是大於等於64個字節小於等於1518個字節,也就是一個數據幀的大小介於0.064KB到1.518KB之間。

等到到達目的主機之後根據標識標誌片偏移合併起來最終提交給用戶空間的應用層。

TCP與UDP:tcp的全稱是transmisson control protocol傳輸控制協議,也稱做是面向連接的協議。udp的全稱是user datagram protocol 用戶數據報協議,無連接,也稱做是不可靠的連接。它們兩個區別就是tcp在建立連接時需要首先建立虛連接(三四)。

物理層與數據鏈路層實際是由網絡硬件設備與其對應的驅動程序組成,比如一個網卡加上這個網卡的驅動程序就只可以實現物理層與鏈路層的功能,而驅動實際上又工作在內核空間當中,由內核直接調用,TCP/IP協議棧也在內核當中 ,所以我們說通信子網(下4層)實際上全部都是內核當中的。

跨主機的通信 : 互聯網上絕大多數的跨主機通信都是c/s架構的。所謂的服務端的用戶空間的服務程序在啓動是會向內核註冊申請一個套接字,這種套接字通常是特定的IP+特定端口,當服務程序向內核申請註冊以後,內核就有一個“職責”,內核要時刻等待來訪問此套接字的數據,一旦識別數據包訪問的是此套接的話,內核就會根據其信息知道到底是哪個進程註冊了此套接字,進而會把此數據包提交給用戶空間的應用程序。

那麼內核是怎樣識別數據包訪問的是哪個進程呢?一個主機上有那多的進程,套接字有那麼多,內核是怎樣辦到的呢?TCP/IP協議棧就位於內核當中,當內核在解封裝的時候就會識別出來,通過網絡層識別訪問的主機,通過傳輸層識別訪問的是哪個進程。

主動與被動:服務端因爲是要提供服務的,相當於醫院當中醫生坐診,要等待用戶訪問,不能主動出去拉客,那麼這就是被動,而被動需要一個具體的地址等待客戶的請求,所以服務器要申請偵聽的套接字都是比較固定的。客戶端則不同,客戶端不需要等待別人訪問,所以客戶端也就沒有必要申請一個固定的套接字使用,只要選擇一個沒有被使用的端口即可。

客戶端的IP加上端口、服務端的IP加上端口,這四種元素就可以標識一個完整的連接,這四種元素只要變化其一種,就可以標識一種不同的連接。

應用層協議:假設一個ftp的客戶端要與smtp的服務端進行通信可以成功嗎?smtp可以識別ftp的請求嗎?當然是不可以的,這些程序在設計的時候都是遵守一定的規範來設計編寫,能識別的請求是特定的請求,其實也就是說只能識別按照某一種特定規範編寫的請求,那麼這種規範是什麼?其實這種規範就叫做應用層協議。舉個例子httpd程序是根據http協議設計編寫的,那麼它能識別的客戶端的請求也只能是根據http協議開發出的客戶端請求,如果一個ftp的客戶端去訪問httpd進程的話,httpd是不會識別的,因爲httpd服務只能根據根據http協議開發的程序發出的請求。

應用層的協議是特定的,而傳輸層的協議是通用的。內核當中的通信子網只是負責傳輸的,就像通用的軟件,各種應用都可以進行調用,因爲它只負責通信,所以它不管上層的應用是否能夠識別信息,能夠識別請求信息取決應用層協議。

image.png

何爲http ? hypertest  transport  protocol超文本傳輸協議。那麼什麼樣的文本就是超文本呢?遵守html格式編寫的語言就是超文本。什麼是html?hypertest  mark  language超文本標記語言。

 

URI和URL : URL(uniform resource locator)是統一資源定位符,而URI(uniform resorce identifier)是統一資源標識符,URI存在的意就是爲了標識資源的唯一性。URL是URI的子集,因爲URL只是實現了URI規定的一部分功能,一個完整的URL通過是這樣的:

http://www.magedu.com/image/logo.jpg[A3]               #完整的URL示例

Ø  http:// 是方案、我們通過將其理解成爲協議,其實就是通過哪個方式獲取資源,通過ftp也可以呀!

Ø  www是主機而不是域名

Ø  magedu.com這是是域名

Ø  /image/logo.jpg指的是訪問資源的路徑,這是絕對路徑。

客戶端和服務端:http的客戶端叫做browser(瀏覽器),服務端就是一個遵守http協議的應用程序。那麼客戶端是怎樣訪問服務端的呢?瀏覽器它會提供一個地址欄讓用戶輸入URL來獲取資源,常用的http的瀏覽器有兩種類型是GUI和CLI。

image.png

html :上面的標記語言是爲讓客戶端的瀏覽器方便顯示的,具體的效果,比如文本顏色和文本大小的微調需要css的參與纔可以,使用html和css開發的網頁都是靜態的網頁。此外還有動態網頁,所謂的動態網頁就是不僅有html和css組成,此外還有程序腳本。網頁程序腳本分爲兩種,一種是在客戶端執行,一種是在服務端執行,現在最常見的就是在服務器執行的腳本,因爲如果在客戶端執行腳本的話很不安全。當一個客戶端訪問一個提供動態網頁時的服務器時,服務器會在本地把腳本執行一下,然後通過html標記以後把結果返回給客戶端。

前端語言:前端語言就是指開發網頁時編寫腳本的語言,最常用的前端語言有php,asp.net,jsp這是三種最常見的,php用於中小型網站的開發,而大型網站要通過jsp開發,當然只要是遵守CGI(common geteway interface通用網關接口協議)的語言都可以開發網頁,比如:C,C++,python等其實都可以可以的,比如C也可以開發網頁,而且開發出來的網頁跑的賊快!普通的語言需要解釋器,而C不用解釋器可以直接運行,但是爲什麼不用C呢?因爲C的主要還是用來開發操作系統的,開發網頁並不是太好用,開發和維護的成本相較於專門開發網頁腳本的PHP要大的多。

值得一提的是:flash動畫與動態網站是沒有一分錢的關係的。

一個網頁文件可能是有多個對象存在的。還是以上一個html爲例子,客戶端通過browser請求此html文件,當把此文件請求下來之後,客戶端的瀏覽器會發現<img src=”abc.jpg”>還要加載一個圖片於是還要再次向服務器發送請求,把此圖片再請求下來,總而言之,當我們請求一個網頁時並不是只請求一次就夠的,圖片與html是兩個文件,並不是一個文件。網頁當中的對象可以是服務器本地的資源,比如圖片,而且還可以是別的服務器或者別的網站的圖片,只要客戶端的瀏覽器能夠請求到都可以被顯示。明文這一點非常的重要。舉個例子,淘寶網頁上的圖上非常之多,難道這些圖片都存在放服務器的本地之下嗎?並不是這樣的,這些圖片可能分散到多臺服務器,這樣很多用戶進行請求的時候就不會對單臺服務器產生太大的壓力,而谷歌和百度的界面並不是太花,因爲要保證用戶的體驗儘可能的快,明白此理論對以後的調優意義重大。

超文本是通過http協議傳輸的文本,http是超文本傳輸協議,並不是超圖片傳輸協議,那麼網頁當中的圖片是通過怎樣的方式傳遞到客戶端的呢?當然是通過超鏈接鏈過去的,那麼這個圖片是通過什麼協議加載到客戶端的本地的呢?圖片是二進制編碼格式,而http協議只能傳輸超文本,總不能把圖片的二進制當成是文本通過http傳輸給客戶端吧!這樣肯定不行,因爲到了客戶端那邊是不能夠還原的,客戶端會看到一堆的亂碼。怎樣辦呢?在解開這個謎團之前我們要先了解了一下http的版本。

http的版本 :http於1991研製成功之後發展至今有三個版本。

l  0.9版本,此版本爲第一版,僅僅支持html文檔,真心是不能傳輸圖片。

l  1.0版本,此版本爲第二版,不僅支持html文檔,還支持多媒體數據的傳輸,當然,不僅是增加此一項功能,這裏並不多講,http發展到這一個版本就其實就可以傳輸圖片了。那麼它是怎樣實現的呢?說是http多媒體的實現不得不提的是smtp(簡單的郵件傳輸協議),引協議早先也只能傳輸文件,後來爲了擴展功能加入了傳輸多媒體的機制:MIME:multpurpose  internet mail extension,此中機制通過base64的編碼,實現了將二進制數據編碼當成文本發送,並能夠讓接收方還原回來的格式,而http1.0的版本也借用此機制。在1.0的版本上,還引入了緩存的機制,能夠保持連接(keep-alive),使得用戶體驗更加順暢。

l  1.1版本在1.0基礎上再次完善,更精確的緩存控制,更多的請求方法,原生支持持久連接。成爲至今使用最爲廣泛的版本。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章