1. 程式人生 > >計算機網路——應用層(一)

計算機網路——應用層(一)

HTTP協議

HTTP全稱是超文字傳輸協議,字面意思上來看,就是用來傳輸超文字這個東西的。那麼,我們可能需要知道‘超文字’究竟是什麼東西呢?其實在WEB應用網路上傳輸的所有資料都可以被稱為超文字,在內容上可以是二進位制或者八進位制的資料,但在表現形式上可以是我們能夠理解的文字,比如英文或者中文。具體來講,可以分為請求報文和響應報文。因為這份協議是老外發明的,所有自然這兩份報文的表現格式就是用英文的形式。但我們可以在響應報文中的資料段中加入我們熟悉的中文。所謂的WEB應用網路並不是平常我們所說的網路,而是基於客戶端/伺服器端的應用網路,簡單來講,就是你用瀏覽器上網所使用的網路,而我們稱在這個網路中所傳輸的資料為超文字。

談到網路就肯定要涉及資料傳輸,如果一個網路中沒有進行資料傳輸,那麼這個網路是沒有意義的。HTTP協議乾的就是你在WEB應用網路上傳輸資料時所用遵循的一些規範。舉個例子,你是客戶端瀏覽器,你想要訪問某個頁面,比如‘www.baidu.com’這個頁面。當你在瀏覽器中輸入這個網址並按回車鍵之後,你的瀏覽器應用程式會生成一份報文,我們稱之為——請求報文。這份報文都會報些什麼東西呢?我們來看這樣一份報文:
GET /index.html HTTP/1.1
Host: www.baidu.com
Connection: close
User-agent: Mozilla/63.0
Accept-language: UTF-8
這份報文第一行我們稱之為請求行

,其餘行我們稱之為首部行
請求行顯示了我們的請求方法為‘GET’,請求的內容是‘index.html’,遵循的是HTTP/1.1協議
首部行中的Host顯示了我們要請求的主機域名;Connection為close則規定請求相應完成後伺服器可以自行關閉TCP連線;User-agent則說明了我們是使用哪個瀏覽器來訪問百度的,這裡代表的是火狐瀏覽器;Accept-language則規定我們想要得到什麼編碼格式的響應文件,這裡是UTF-8。

那麼我們可能會問,為什麼瀏覽器要生成這份報文呢?這份報文有什麼用呢?其實這就是HTTP協議起作用的地方。HTTP協議規定,你的客戶端瀏覽器如何想要和伺服器打交道,那就得有這麼一份報文才行,而且報文還得按它要求的格式來,就像上面的格式一樣。因為只有這樣伺服器才能知道你要幹嘛,如果大家的瀏覽器都不遵循同一個協議,今天你說你的請求方式叫GET,明天他說他的請求方式叫MAKE,後天又有個人說他的請求方式叫WANT,那豈不是亂套了。伺服器哪知道你們究竟都要幹嘛,所以大家都遵循一個協議,定個規矩,請求方法統一都叫GET,而這個協議我們就稱之為HTTP協議,當然HTTP協議中你的請求報文還包含很多其他的東西。

瀏覽器生成的這份報文通過套接字介面傳輸給伺服器,因為傳輸就跟HTTP協議沒什麼關係了,而是跟TCP協議有關。套接字介面就相當於HTTP到TCP的一扇門,通過這道門你才能把應用層的請求報文送到傳輸層中的TCP協議當中去。話不多說,傳輸層不是本文的重點。當伺服器通過網路接收到你的請求報文後,它同樣也會發回給你一份報文,我們稱之為響應報文。這份響應報文是怎麼寫的呢?我們來看:
HTTP/1.1 200 OK
Connection: close
Date: Fri 2 Nov 2018 13:22:20 GMT
Server: Apache/2.2.3
Content-Type: text/html
(data data data …)
這份報文第一行我們稱之為狀態行,接下來那幾行我們稱之為首部行,而最後面那個(data)我們稱之為實體或者響應體。而這些內容同樣也是HTTP協議規定的,關於具體內容的具體含義我這裡不展開講,有興趣可以查閱相關資料,其實看名字也能知道個大概。伺服器通過它那邊的套接字介面把這份報文傳輸給我們,然後我們的瀏覽器就可以解析這份報文,從而形成我們所能看到的網頁。這基本上就是我們按回車之後,在網路上瀏覽器和伺服器所發生的一切。

寫到這,我突然對我所定義的超文字持保留意見。可能超文字僅僅只是響應報文中響應體那部分或者請求報文中用POST方式所提交的請求體那部分,並不是整個請求報文或者響應報文。這裡我還不清晰,有興趣的朋友可以查閱有關資料。

講到這,我的HTTP協議講解就已經結束了,你可能還不是很清晰,因為我也不是很清晰,這只是目前為止我的理解而已,但如果這博文能稍微幫助到你對於該協議理解,我就很滿足了。一言以蔽之,HTTP協議是客戶端瀏覽器與伺服器打交道所必須遵循的協議,這份協議規定了你需要通過報文來進行相互應答,以及規定了你的報文所應當遵循的格式。