'細說HTTP協議及其工作流程'

DNS 數據庫 HTML 瀏覽器 MySQL 鼠標 人生第一份工作 編程藝術思維 2019-09-09
"

在TCP/IP的模型圖中,讀者可以看到,HTTP協議位於最上層的應用層,它是互聯網上應用最為廣泛的一種網絡協議,所有的WWW文件都必須遵守這個協議。

HTTP是一個由請求和響應組成的、標準的客戶端/服務器端模型(B/S結構)。HTTP協議永遠是由客戶端發起請求,服務器端給予響應,如圖2-8所示。

"

在TCP/IP的模型圖中,讀者可以看到,HTTP協議位於最上層的應用層,它是互聯網上應用最為廣泛的一種網絡協議,所有的WWW文件都必須遵守這個協議。

HTTP是一個由請求和響應組成的、標準的客戶端/服務器端模型(B/S結構)。HTTP協議永遠是由客戶端發起請求,服務器端給予響應,如圖2-8所示。

細說HTTP協議及其工作流程


圖2-8 HTTP請求

HTTP是一種無狀態協議。無狀態是指客戶端和服務器端之間不需要建立持久的連接,客戶端發起一個請求,服務器端返回響應,這個連接就會被關閉,在服務器端不會保留該請求的有關信息。

HTTP的工作流程如下。

1.地址解析

HTTP協議是通過標準URL來請求指定的服務器中的指定服務的。一個標準的URL如下:

http://www.baidu.com:80/index.html?name=tom&age=18

下面來拆分一下URL,看看這些組成都是做什麼的:

(1)http:協議類型。這裡指的是要發送的是什麼協議,還可以是FTP等其他協議。而這裡請求的是服務器中的網頁,所以使用的是常見的HTTP協議。

(2)www.baidu.com:主機名。通過主機名,可以準確定位到要訪問的那臺服務器。而在前面說的網絡通信中,IP是可以唯一表示服務器地址的,但IP煩瑣複雜,很難記憶,所以人們就想了個辦法,通過熟悉的英文、數字等來表示一臺服務器的地址,稱為域名。這樣就需要一個文件(作為一個數據倉庫)把IP和域名一一對應起來。在很早的時候,我們確實是這麼做的,不過隨著IP越來越多,文件也變得越來越大,不堪負重。於是人們就想到了把這些一一對應的關係都放到一臺統一的服務器上,這臺服務器被稱為DNS域名解析系統,它會把域名解析成對應的IP。

(3)80:端口號。用戶已經可以通過域名或者IP訪問到一臺服務器了,但是一臺服務器裡有那麼多的服務和應用,怎樣才能準確找到用戶需要訪問的那個服務或應用呢?在服務器中,每個服務和應用都會開啟一個進程,都會有一個進程號(PID),如果對外提供服務,則還會有一個唯一的端口號,這讓外部應用可以直接通過這個端口號訪問到指定的服務和應用。端口號的範圍是0~65 535,一些常用的服務和應用都有默認的端口號,一般不能輕易更改,比如Web服務器的80端口、遠程連接SSH服務的22端口、數據庫MySQL的3306端口等等。因為80端口是Web服務器的默認端口,所以在寫HTTP請求的URL的時候,80端口一般是省略的。

(4)index.html:請求的文件名。用戶通過域名和端口號已經能訪問到Web服務器了,接下來就可以通過文件名來訪問指定的文件了。Web服務器一般都做好了路由,不同的路由所提供的訪問文件的形式可能不一樣,但核心都是一樣的。

(5)?name=tom&age=18:請求參數。即使同一個網頁,可能針對不同的用戶,服務器要返回給客戶端的信息也是不一樣的。而服務器就是通過URL中“?”後面攜帶的參數不同來響應不同的用戶或者同一個用戶的不同請求的。

2.封裝HTTP請求

這一步會把上面寫的URL以及本機的一些信息封裝成一個HTTP請求數據包,後面筆者會詳細說明。

3.封裝TCP包

第三步就是封裝TCP包,建立TCP連接,也就是常說的“三次握手”。由於HTTP位於最上層的應用層,所以HTTP在工作之前要先由TCP和IP協議建立網絡連接,這就是TCP/IP協議族,因此互聯網又被稱為TCP/IP網絡。

這裡介紹一下TCP/IP協議的“三次握手”。首先由客戶端發送建立連接的請求,客戶端發送一個syn包,等待服務器端的響應;服務器端收到SYN包之後,返回給客戶端一個表示確認的SYN包;最後客戶端收到確認SYN包之後向服務器端發送ACK包,發送完之後開始建立連接,如圖2-9所示。

"

在TCP/IP的模型圖中,讀者可以看到,HTTP協議位於最上層的應用層,它是互聯網上應用最為廣泛的一種網絡協議,所有的WWW文件都必須遵守這個協議。

HTTP是一個由請求和響應組成的、標準的客戶端/服務器端模型(B/S結構)。HTTP協議永遠是由客戶端發起請求,服務器端給予響應,如圖2-8所示。

細說HTTP協議及其工作流程


圖2-8 HTTP請求

HTTP是一種無狀態協議。無狀態是指客戶端和服務器端之間不需要建立持久的連接,客戶端發起一個請求,服務器端返回響應,這個連接就會被關閉,在服務器端不會保留該請求的有關信息。

HTTP的工作流程如下。

1.地址解析

HTTP協議是通過標準URL來請求指定的服務器中的指定服務的。一個標準的URL如下:

http://www.baidu.com:80/index.html?name=tom&age=18

下面來拆分一下URL,看看這些組成都是做什麼的:

(1)http:協議類型。這裡指的是要發送的是什麼協議,還可以是FTP等其他協議。而這裡請求的是服務器中的網頁,所以使用的是常見的HTTP協議。

(2)www.baidu.com:主機名。通過主機名,可以準確定位到要訪問的那臺服務器。而在前面說的網絡通信中,IP是可以唯一表示服務器地址的,但IP煩瑣複雜,很難記憶,所以人們就想了個辦法,通過熟悉的英文、數字等來表示一臺服務器的地址,稱為域名。這樣就需要一個文件(作為一個數據倉庫)把IP和域名一一對應起來。在很早的時候,我們確實是這麼做的,不過隨著IP越來越多,文件也變得越來越大,不堪負重。於是人們就想到了把這些一一對應的關係都放到一臺統一的服務器上,這臺服務器被稱為DNS域名解析系統,它會把域名解析成對應的IP。

(3)80:端口號。用戶已經可以通過域名或者IP訪問到一臺服務器了,但是一臺服務器裡有那麼多的服務和應用,怎樣才能準確找到用戶需要訪問的那個服務或應用呢?在服務器中,每個服務和應用都會開啟一個進程,都會有一個進程號(PID),如果對外提供服務,則還會有一個唯一的端口號,這讓外部應用可以直接通過這個端口號訪問到指定的服務和應用。端口號的範圍是0~65 535,一些常用的服務和應用都有默認的端口號,一般不能輕易更改,比如Web服務器的80端口、遠程連接SSH服務的22端口、數據庫MySQL的3306端口等等。因為80端口是Web服務器的默認端口,所以在寫HTTP請求的URL的時候,80端口一般是省略的。

(4)index.html:請求的文件名。用戶通過域名和端口號已經能訪問到Web服務器了,接下來就可以通過文件名來訪問指定的文件了。Web服務器一般都做好了路由,不同的路由所提供的訪問文件的形式可能不一樣,但核心都是一樣的。

(5)?name=tom&age=18:請求參數。即使同一個網頁,可能針對不同的用戶,服務器要返回給客戶端的信息也是不一樣的。而服務器就是通過URL中“?”後面攜帶的參數不同來響應不同的用戶或者同一個用戶的不同請求的。

2.封裝HTTP請求

這一步會把上面寫的URL以及本機的一些信息封裝成一個HTTP請求數據包,後面筆者會詳細說明。

3.封裝TCP包

第三步就是封裝TCP包,建立TCP連接,也就是常說的“三次握手”。由於HTTP位於最上層的應用層,所以HTTP在工作之前要先由TCP和IP協議建立網絡連接,這就是TCP/IP協議族,因此互聯網又被稱為TCP/IP網絡。

這裡介紹一下TCP/IP協議的“三次握手”。首先由客戶端發送建立連接的請求,客戶端發送一個syn包,等待服務器端的響應;服務器端收到SYN包之後,返回給客戶端一個表示確認的SYN包;最後客戶端收到確認SYN包之後向服務器端發送ACK包,發送完之後開始建立連接,如圖2-9所示。

細說HTTP協議及其工作流程


圖2-9 TCP/IP三次握手

4.客戶端發送請求命令

第四步就是在連接建立之後,客戶端發送HTTP請求到服務器端,與請求相關的信息都會包含在請求頭和請求體中發送給服務器端。

5.服務器端響應

服務器在收到請求之後,根據客戶端的請求發送給客戶端相應的信息。相關的響應信息都會放在響應頭和響應體中。

6.關閉連接

服務器端在發送完響應之後,就會關閉連接。如果客戶端的請求的頭信息中有Connection-alive,那麼服務器端在響應完這個請求之後不會關閉連接,直到該客戶端的所有請求都響應完畢,才會關閉連接,這樣大大節省了帶寬和I/O資源。

請求和響應

HTTP請求由兩部分組成:HTTP消息頭和HTTP消息體。消息頭告訴服務器該請求是做什麼的,消息體告訴服務器怎麼做。比如訪問一個頁面,頭信息可以到瀏覽器中的調試心去看,而消息體需要用戶單擊鼠標右鍵查看源碼,那些HTML代碼就是服務器返回給客戶端的消息體。

HTTP中的請求頭由三部分組成:請求行、請求頭和請求正文,如圖2-10所示。

"

在TCP/IP的模型圖中,讀者可以看到,HTTP協議位於最上層的應用層,它是互聯網上應用最為廣泛的一種網絡協議,所有的WWW文件都必須遵守這個協議。

HTTP是一個由請求和響應組成的、標準的客戶端/服務器端模型(B/S結構)。HTTP協議永遠是由客戶端發起請求,服務器端給予響應,如圖2-8所示。

細說HTTP協議及其工作流程


圖2-8 HTTP請求

HTTP是一種無狀態協議。無狀態是指客戶端和服務器端之間不需要建立持久的連接,客戶端發起一個請求,服務器端返回響應,這個連接就會被關閉,在服務器端不會保留該請求的有關信息。

HTTP的工作流程如下。

1.地址解析

HTTP協議是通過標準URL來請求指定的服務器中的指定服務的。一個標準的URL如下:

http://www.baidu.com:80/index.html?name=tom&age=18

下面來拆分一下URL,看看這些組成都是做什麼的:

(1)http:協議類型。這裡指的是要發送的是什麼協議,還可以是FTP等其他協議。而這裡請求的是服務器中的網頁,所以使用的是常見的HTTP協議。

(2)www.baidu.com:主機名。通過主機名,可以準確定位到要訪問的那臺服務器。而在前面說的網絡通信中,IP是可以唯一表示服務器地址的,但IP煩瑣複雜,很難記憶,所以人們就想了個辦法,通過熟悉的英文、數字等來表示一臺服務器的地址,稱為域名。這樣就需要一個文件(作為一個數據倉庫)把IP和域名一一對應起來。在很早的時候,我們確實是這麼做的,不過隨著IP越來越多,文件也變得越來越大,不堪負重。於是人們就想到了把這些一一對應的關係都放到一臺統一的服務器上,這臺服務器被稱為DNS域名解析系統,它會把域名解析成對應的IP。

(3)80:端口號。用戶已經可以通過域名或者IP訪問到一臺服務器了,但是一臺服務器裡有那麼多的服務和應用,怎樣才能準確找到用戶需要訪問的那個服務或應用呢?在服務器中,每個服務和應用都會開啟一個進程,都會有一個進程號(PID),如果對外提供服務,則還會有一個唯一的端口號,這讓外部應用可以直接通過這個端口號訪問到指定的服務和應用。端口號的範圍是0~65 535,一些常用的服務和應用都有默認的端口號,一般不能輕易更改,比如Web服務器的80端口、遠程連接SSH服務的22端口、數據庫MySQL的3306端口等等。因為80端口是Web服務器的默認端口,所以在寫HTTP請求的URL的時候,80端口一般是省略的。

(4)index.html:請求的文件名。用戶通過域名和端口號已經能訪問到Web服務器了,接下來就可以通過文件名來訪問指定的文件了。Web服務器一般都做好了路由,不同的路由所提供的訪問文件的形式可能不一樣,但核心都是一樣的。

(5)?name=tom&age=18:請求參數。即使同一個網頁,可能針對不同的用戶,服務器要返回給客戶端的信息也是不一樣的。而服務器就是通過URL中“?”後面攜帶的參數不同來響應不同的用戶或者同一個用戶的不同請求的。

2.封裝HTTP請求

這一步會把上面寫的URL以及本機的一些信息封裝成一個HTTP請求數據包,後面筆者會詳細說明。

3.封裝TCP包

第三步就是封裝TCP包,建立TCP連接,也就是常說的“三次握手”。由於HTTP位於最上層的應用層,所以HTTP在工作之前要先由TCP和IP協議建立網絡連接,這就是TCP/IP協議族,因此互聯網又被稱為TCP/IP網絡。

這裡介紹一下TCP/IP協議的“三次握手”。首先由客戶端發送建立連接的請求,客戶端發送一個syn包,等待服務器端的響應;服務器端收到SYN包之後,返回給客戶端一個表示確認的SYN包;最後客戶端收到確認SYN包之後向服務器端發送ACK包,發送完之後開始建立連接,如圖2-9所示。

細說HTTP協議及其工作流程


圖2-9 TCP/IP三次握手

4.客戶端發送請求命令

第四步就是在連接建立之後,客戶端發送HTTP請求到服務器端,與請求相關的信息都會包含在請求頭和請求體中發送給服務器端。

5.服務器端響應

服務器在收到請求之後,根據客戶端的請求發送給客戶端相應的信息。相關的響應信息都會放在響應頭和響應體中。

6.關閉連接

服務器端在發送完響應之後,就會關閉連接。如果客戶端的請求的頭信息中有Connection-alive,那麼服務器端在響應完這個請求之後不會關閉連接,直到該客戶端的所有請求都響應完畢,才會關閉連接,這樣大大節省了帶寬和I/O資源。

請求和響應

HTTP請求由兩部分組成:HTTP消息頭和HTTP消息體。消息頭告訴服務器該請求是做什麼的,消息體告訴服務器怎麼做。比如訪問一個頁面,頭信息可以到瀏覽器中的調試心去看,而消息體需要用戶單擊鼠標右鍵查看源碼,那些HTML代碼就是服務器返回給客戶端的消息體。

HTTP中的請求頭由三部分組成:請求行、請求頭和請求正文,如圖2-10所示。

細說HTTP協議及其工作流程


1.請求行

請求的第一行是請求行,裡面有請求方法、URL、協議版本等。比如圖2-10,請求的方法是GET,請求的URL是/ ,協議版本是HTTP/1.1。

常見的請求方式有GET和POST。GET方式主要用於獲取網絡資源,POST方式主要用於表單提交。由於GET方式的參數是在地址欄中的,所以總是可見的,不是很安全,而且長度也有限制。而POST方式的參數是封裝成實體之後發送給服務器的,是不可見的,相對比較安全,用戶的敏感信息一般採用POST方式提交。

2.請求頭

每個頭域都由一個頭域名、冒號和值域組成。下面介紹一些常見的頭域。

(1)Connetion:表示是否需要持久連接。如果服務器看到它的值為keep-alive,或者請求協議使用的是HTTP/1.1(默認使用持久連接),同一個頁面如果包含多個資源,則只會使用一個連接,如Connection:keep-alive。如果設置了Connetion:close,則每一個請求結束都會關閉連接,新的請求又會重新建立連接。一個網頁至少有幾十個資源請求,這樣很浪費帶寬和時間。

(2)Host:這個是必需的,表示請求的服務器地址是什麼,是從URL中提取出來的。比如http://www.baidu.com/的Host就是www.baidu.com。這裡是80端口,默認省略;如果是其他端口,比如http://www.baidu.com:8080,則Host是www.baidu.com:8080。

(3)Accept:瀏覽器可以接受的媒體類型(MIME類型),如Accept:text/html代表瀏覽器可以接受HTML文檔。“*”代表接受任何類型,如Accept:*/*。

(4)Accept-Encoding:瀏覽器申明自己接受的編碼方法,通常指定壓縮方法、是否支持壓縮、支持什麼格式的壓縮。

3.請求正文

也叫請求數據,在使用POST請求提交表單數據的時候,這些表單數據就會被放在HTTP請求的請求正文中,以加密的形式向服務器傳輸。

"

相關推薦

推薦中...