⑴ HTTP的請求響應的執行過程
HTTP其實就攔寬是一個客戶端與伺服器之間的一種通信協議,http客戶端發起請求,就會在服務端創建一個埠,而http伺服器就在埠監聽客戶端的請求,HTTP伺服器返回狀態和內容。
http整體執行流程如下(以chrome為例):
TCP連接請求會經歷層層的路由,防火牆,最後到達網卡,然後到達內核的TCP/IP協議棧,還有可能經過防火牆的過濾,最終到達web服務端。森衡殲接下來就要經歷經典的TCP「三次握手」
TCP/IP連接建立起來後此沖,瀏覽器就可以向伺服器發送HTTP請求了,比如,使用了HTTP的GET方法請求一個根域名里的一個域名等等。
⑵ http 請求過程
HTTP通信機制是在一次完整的HTTP通信過程中,Web瀏覽器與Web伺服器之間將完成下列7個步驟:
1. 建立TCP連接
在HTTP工作開始之前,Web瀏覽器首先要通過網路與Web伺服器建立連接,該連接是通過TCP來完成的,該協議與IP協議共同構建Internet,即著喊缺舉名的TCP/IP協議族,因此Internet又被稱作是TCP/IP網路。HTTP是比TCP更高層次的應用層協議,根據規則,只有低層協議建立之後才能,才能進行更層協議的連接,因此,首先要建立TCP連接,一般TCP連接的埠號是80。
2. Web瀏覽器向Web伺服器發送請求命令
一旦建立了TCP連接,Web瀏覽器就會向Web伺服器發送請求命令。例如:GET/sample/hello.jsp HTTP/1.1。
3. Web瀏覽器發送請求頭信息
瀏覽器發送其請求命令之後,還要以頭信息的形式向鄭碧Web伺服器發送一些別的信息,之後瀏覽器發送了一空白行來通知伺服器,它已經結束了該頭信息的發送。
4. Web伺服器應答扮陵
客戶機向伺服器發出請求後,伺服器會客戶機回送應答, HTTP/1.1 200 OK ,應答的第一部分是協議的版本號和應答狀態碼。
5. Web伺服器發送應答頭信息
正如客戶端會隨同請求發送關於自身的信息一樣,伺服器也會隨同應答向用戶發送關於它自己的數據及被請求的文檔。
6. Web伺服器向瀏覽器發送數據
Web伺服器向瀏覽器發送頭信息後,它會發送一個空白行來表示頭信息的發送到此為結束,接著,它就以Content-Type應答頭信息所描述的格式發送用戶所請求的實際數據。
7. Web伺服器關閉TCP連接
一般情況下,一旦Web伺服器向瀏覽器發送了請求數據,它就要關閉TCP連接,然後如果瀏覽器或者伺服器在其頭信息加入了這行代碼:
Connection:keep-alive
TCP連接在發送後將仍然保持打開狀態,於是,瀏覽器可以繼續通過相同的連接發送請求。保持連接節省了為每個請求建立新連接所需的時間,還節約了網路帶寬。
⑶ http請求的基本過程是什麼
http請求的基本過程是連接、請求、應答、關閉連接。
⑷ 一次完整的http請求過程
一個完整的HTTP過程包括建立連接、數據傳輸、斷開連接等七個步驟。
下面茄陸詳細介紹一下每一步
1、TCP建立連接
HTTP協議是基於TCP協議來實現的,因此首先就是要通過TCP三次握手與伺服器端建立連接,一般HTTP默認的埠號為80;
2、瀏覽器發送請求命令
在與伺服器建立連接後,Web瀏覽器會想伺服器發送請求命令
3、瀏覽器發送請求頭消息
在瀏覽器發送請求命令後,還會發送一些其它信息,最後以一行空白內容告知伺服器已經完成頭信息的發送;
4、伺服器應答
在收到瀏覽器發送的請薯納鏈求後,伺服器會對其進行回應,應答的第一部分是協議的版本號和應答狀態碼;
5、伺服器回應頭信息
與瀏覽器端同理,伺服器端也會將自身的信息發送一份至瀏覽器
6、伺服器發送數據
在完成所有應答後,會以Content-Type應答頭信息所描述的格式發送用戶所需求的數數孫據信息
7、斷開TCP連接
在完成此次數據通信後,伺服器會通過TCP四次揮手主動斷開連接。但若此次連接為長連接,那麼瀏覽器或伺服器的頭信息會加入keep-alive的信息,會保持此連接狀態,在有其它數據發送時,可以節省建立連接的時間;
⑸ 請說一下http請求的基本過程
首先http是一個應用層的協議,在這個層的協議,只是一種通訊規范,也就是因為雙方要進行通訊,大家要事先約定一個規范。
1.連接 當我們輸入這樣一個請求時,首先要建立一個socket連接,因為socket是通過ip和埠建立的,所以之前還有一個DNS解析過程,把www.mycompany.com變成ip,如果url里不包含埠號,則會使用該協議的默認埠號。
DNS的過程是這樣的:首先我們知道我們本地的機器上在配置網路時都會填寫DNS,這樣本機就會把這個url發給這個配置的DNS伺服器,如果能夠
找到相應的url則返回其ip,否則該DNS將繼續將該解析請求發送給上級DNS,整個DNS可以看做是一個樹狀結構,該請求將一直發送到根直到得到結
果。現在已經擁有了目標ip和埠號,這樣我們就可以打開socket連接了。
2.請求 連接成功建立後,開始向web伺服器發送請求,這個請求一般是GET或POST命令(POST用於FORM參數的傳遞)。GET命令的格式為:GET 路徑/文件名 HTTP/1.0
文件名指出所訪問的文件,HTTP/1.0指出Web瀏覽器使用的HTTP版本。現在可以發送GET命令:
GET /mydir/index.html HTTP/1.0,
3.應答 web伺服器收到這個請求,進行處理。從它的文檔空間中搜索子目錄mydir的文件index.html。如果找到該文件,Web伺服器把該文件內容傳送給相應的Web瀏覽器。
為了告知瀏覽器,,Web伺服器首先傳送一些HTTP頭信息,然後傳送具體內容(即HTTP體信息),HTTP頭信息和HTTP體信息之間用一個空行分開。
常用的HTTP頭信息有:
① HTTP 1.0 200 OK 這是Web伺服器應答的第一行,列出伺服器正在運行的HTTP版本號和應答代碼。代碼"200 OK"表示請求完成。
② MIME_Version:1.0它指示MIME類型的版本。
③ content_type:類型這個頭信息非常重要,它指示HTTP體信息的MIME類型。如:content_type:text/html指示傳送的數據是HTML文檔。
④ content_length:長度值它指示HTTP體信息的長度(位元組)。
4.關閉連接:當應答結束後,Web瀏覽器與Web伺服器必須斷開,以保證其它Web瀏覽器能夠與Web伺服器建立連接。
下面我們具體分析其中的數據包在網路中漫遊的經歷
在網路分層結構中,各層之間是嚴格單向依賴的。「服務」是描述各層之間關系的抽象概念,即網路中各層向緊鄰上層提供的一組操作。下層是服務提供者,
上層是請求服務的用戶。服務的表現形式是腔褲原語(primitive),如系統調用或庫函數。系統調用是操作系統內核向網路應用程序或高層協議提供的服務原
語。網路中的n層總要向n+1層提供比n-1層更完備的服務,否則n層就沒有存在的價值。
傳輸層實現的是「端到端」通信,引進網間進程通信概念,同時也要解決差錯控制,流量控制,數據排序(報文排序),連接管理等問題,為此提供不同的服
務方式。通常傳輸層的服務通過系統調用的方式提供,以socket的方式。對於客戶端,要想建立一個socket連接,需要調用這樣一些函數socket
() bind() connect(),然後就可以通過send()進行數據發送。
現在看數據包在網路中的穿行過程:
應用層
首先我們可以看到在應用層,根據當前的需求和動作,結合應用層的協議,有我們確定發送的數據內容,我們把這些數據放到一個緩沖區內,然後形成了應用層的報文data。
傳輸層
這些數據通過傳輸層發送,比如tcp協議。所以它們會被送到傳輸層處理,在這里報文打上了傳輸頭的包頭,主要包含埠號,以及tcp的各種制信息,這些信息是直接得到的,因為介面中需要指定埠。這樣就組成了tcp的數據傳送單位segment。tcp
是一種端到端的協議,利用這些信息,比如tcp首部中的序號確認序號,根據這些數字,發送的一方不斷的進行發送等待確認,發送一個數據段後,會開啟一個計
數器,只有當收手鋒到確認後才會發送下一個,如果超過計數時間仍未收到確認則進行重發,在接受端如果收到錯誤數據,則將其丟棄,這將導致發送端超時重發。通過
tcp協議,控制了數據包的發送序列的產生,不斷的調整發送序列,實現流控和數據完整。
網畢圓晌絡層
然後待發送的數據段送到網路層,在網路層被打包,這樣封裝上了網路層的包頭,包頭內部含有源及目的的ip地址,該層數據發送單位被稱為packet。網路層開始負責將這樣的數據包在網路上傳輸,如何穿過路由器,最終到達目的地址。在這里,根據目的ip地址,就需要查找下一跳路由的地址。首先在本機,要查找本機的路由表,在windows上運行route print就可以看到當前路由表內容,有如下幾項:
Active Routes Default Route Persistent Route.
整個查找過程是這樣的:
(1)根據目的地址,得到目的網路號,如果處在同一個內網,則可以直接發送。
(2)如果不是,則查詢路由表,找到一個路由。
(3)如果找不到明確的路由,此時在路由表中還會有默認網關,也可稱為預設網關,IP用預設的網關地址將一個數據傳送給下一個指定的路由器,所以網關也可能是路由器,也可能只是內網向特定路由器傳輸數據的網關。
(4)
路由器收到數據後,它再次為遠程主機或網路查詢路由,若還未找到路由,該數據包將發送到該路由器的預設網關地址。而數據包中包含一個最大路由跳數,如果超
過這個跳數,就會丟棄數據包,這樣可以防止無限傳遞。路由器收到數據包後,只會查看網路層的包裹數據,目的ip。所以說它是工作在網路層,傳輸層的數據對
它來說則是透明的。
如果上面這些步驟都沒有成功,那麼該數據報就不能被傳送。如果不能傳送的數據報來自本機,那麼一般會向生成數據報的應用程序返回一個「主機不可達」或 「網路不可達」的錯誤。
以windows下主機的路由表為例,看路由的查找過程
======================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.1.2 192.168.1.101 10
127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1
192.168.1.0 255.255.255.0 192.168.1.101 192.168.1.101 10
192.168.1.101 255.255.255.255 127.0.0.1 127.0.0.1 10
192.168.1.255 255.255.255.255 192.168.1.101 192.168.1.101 10
224.0.0.0 240.0.0.0 192.168.1.101 192.168.1.101 10
255.255.255.255 255.255.255.255 192.168.1.101 192.168.1.101 1
Default Gateway: 192.168.1.2
Network Destination 目的網段
Netmask 子網掩碼
Gateway 下一跳路由器入口的ip,路由器通過interface和gateway定義一調到下一個路由器的鏈路,通常情況下,interface和gateway是同一網段的。
Interface 到達該目的地的本路由器的出口ip(對於我們的個人pc來說,通常由機算機A的網卡,用該網卡的IP地址標識,當然一個pc也可以有多個網卡)。
網關這個概念,主要用於不同子網間的交互,當兩個子網內主機A,B要進行通訊時,首先A要將數據發送到它的本地網關,然後網關再將數據發送給B所在的網關,然後網關再發送給B。
默認網關,當一個數據包的目的網段不在你的路由記錄中,那麼,你的路由器該把那個數據包發送到哪裡!預設路由的網關是由你的連接上的default gateway決定的,也就是我們通常在網路連接里配置的那個值。
通常interface和gateway處在一個子網內,對於路由器來說,因為可能具有不同的interface,當數據包到達時,根據
Network
Destination尋找匹配的條目,如果找到,interface則指明了應當從該路由器的那個介面出去,gateway則代表了那個子網的網關地
址。
第一條 0.0.0.0 0.0.0.0 192.168.1.2 192.168.1.101 10
0.0.0.0
代表了預設路由。該路由記錄的意思是:當我接收到一個數據包的目的網段不在我的路由記錄中,我會將該數據包通過192.168.1.101這個介面發送到
192.168.1.2這個地址,這個地址是下一個路由器的一個介面,這樣這個數據包就可以交付給下一個路由器處理,與我無關。該路由記錄的線路質量
10。當有多個條目匹配時,會選擇具有較小Metric值的那個。
第三條 192.168.1.0 255.255.255.0 192.168.1.101 192.168.1.101 10
直
聯網段的路由記錄:當路由器收到發往直聯網段的數據包時該如何處理,這種情況,路由記錄的interface和gateway是同一個。當我接收到一個數
據包的目的網段是192.168.1.0時,我會將該數據包通過192.168.1.101這個介面直接發送出去,因為這個埠直接連接著
192.168.1.0這個網段,該路由記錄的線路質量
10 (因interface和gateway是同一個,表示數據包直接傳送給目的地址,不需要再轉給路由器)。
一般就分這兩種情況,目的地址與當前路由器介面是否在同一子網。如果是則直接發送,不需再轉給路由器,否則還需要轉發給下一個路由器繼續進行處理。
查找到下一跳ip地址後,還需要知道它的mac地址,這個地址要作為鏈路層數據裝進鏈路層頭部。這時需要arp協議,具體過程是這樣的,查找arp
緩沖,windows下運行arp
-a可以查看當前arp緩沖內容。如果裡面含有對應ip的mac地址,則直接返回。否則需要發生arp請求,該請求包含源的ip和mac地址,還有目的地
的ip地址,在網內進行廣播,所有的主機會檢查自己的ip與該請求中的目的ip是否一樣,如果剛好對應則返回自己的mac地址,同時將請求者的ip
mac保存。這樣就得到了目標ip的mac地址。
鏈路層
將mac地址及鏈路層控制信息加到數據包里,形成Frame,Frame在鏈路層協議下,完成了相鄰的節點間的數據傳輸,完成連接建立,控制傳輸速度,數據完整。
物理層
物理線路則只負責該數據以bit為單位從主機傳輸到下一個目的地。
下一個目的地接受到數據後,從物理層得到數據然後經過逐層的解包 到 鏈路層 到 網路層,然後開始上述的處理,在經網路層 鏈路層 物理層將數據封裝好繼續傳往下一個地址。
在上面的過程中,可以看到有一個路由表查詢過程,而這個路由表的建立則依賴於路由演算法。也就是說路由演算法實際上只是用來路由器之間更新維護路由表,
真正的數據傳輸過程並不執行這個演算法,只查看路由表。這個概念也很重要,需要理解常用的路由演算法。而整個tcp協議比較復雜,跟鏈路層的協議有些相似,其
中有很重要的一些機制或者概念需要認真理解,比如編號與確認,流量控制,重發機制,發送接受窗口。
tcp/ip基本模型及概念
物理層
設備,中繼器(repeater),集線器(hub)。對於這一層來說,從一個埠收到數據,會轉發到所有埠。
鏈路層
協議:SDLC(Synchronous Data Link Control)HDLC(High-level Data Link
Control)
ppp協議獨立的鏈路設備中最常見的當屬網卡,網橋也是鏈路產品。集線器MODEM的某些功能有人認為屬於鏈路層,對此還有些爭議認為屬於物理層設備。除
此之外,所有的交換機都需要工作在數據鏈路層,但僅工作在數據鏈路層的僅是二層交換機。其他像三層交換機、四層交換機和七層交換機雖然可對應工作在OSI
的三層、四層和七層,但二層功能仍是它們基本的功能。
因為有了MAC地址表,所以才充分避免了沖突,因為交換機通過目的MAC地址知道應該把這個數據轉發到哪個埠。而不會像HUB一樣,會轉發到所有滴埠。所以,交換機是可以劃分沖突域滴。
網路層
四個主要的協議:
網際協議IP:負責在主機和網路之間定址和路由數據包。
地址解析協議ARP:獲得同一物理網路中的硬體主機地址。
網際控制消息協議ICMP:發送消息,並報告有關數據包的傳送錯誤。
互聯組管理協議IGMP:被IP主機拿來向本地多路廣播路由器報告主機組成員。
該層設備有三層交換機,路由器。
傳輸層
兩個重要協議 TCP 和 UDP 。
埠概念:TCP/UDP 使用 IP 地址標識網上主機,使用埠號來標識應用進程,即 TCP/UDP 用主機 IP
地址和為應用進程分配的埠號來標識應用進程。埠號是 16 位的無符號整數, TCP 的埠號和 UDP
的埠號是兩個獨立的序列。盡管相互獨立,如果 TCP 和 UDP
同時提供某種知名服務,兩個協議通常選擇相同的埠號。這純粹是為了使用方便,而不是協議本身的要求。利用埠號,一台主機上多個進程可以同時使用
TCP/UDP 提供的傳輸服務,並且這種通信是端到端的,它的數據由 IP 傳遞,但與 IP
數據報的傳遞路徑無關。網路通信中用一個三元組可以在全局唯一標志一個應用進程:(協議,本地地址,本地埠號)。
也就是說tcp和udp可以使用相同的埠。
可以看到通過(協議,源埠,源ip,目的埠,目的ip)就可以用來完全標識一組網路連接。
應用層
基於tcp:Telnet FTP SMTP DNS HTTP
基於udp:RIP NTP(網落時間協議)和DNS (DNS也使用TCP)SNMP TFTP
⑹ 如何針對http的get請求進行處理與響應
1、HTTP請求概述
在前面有一篇文章對HTTP協議有詳細的描述,這里就不再過多的做說明,只是簡單的作為這篇文章的引子。
HTTP協議又被稱為超文本傳輸協議,它的的設計目的是保證客戶機與伺服器之間的通信。HTTP 的工作方式是客戶端與伺服器之間的請求-應答協議。在客戶端和伺服器之間進行請求-響應時,有兩個最基本的請求方式:GET 和 POST。
其中,GET請求表示從指定的資源請求數據,POST請求表示向指定的資源提交要被處理的數鋒伍臘據。
2、HTTP請橘含求格式
在HTTP請求中,首先是請求行,注意這里的請求行一定要放在最前面;其次,是請求頭,英文表示為header;然後會空一行,緊接著就可以是請求的具體內容了,一般稱之為請求體,request-body。給出一個圖示如下:
3、GET請求與POST請求對比
GET請求與POST請求有一些異同點,主要有以下幾點問題:
(1)、GET請求和POST請求都是客戶端與伺服器之間交互,請求--應答模式的協議
(2)、GET請求是通過URL直接請求數據,數據信息可以在URL中直接看到,比如瀏覽器訪問;而POST請求是放在請求頭中的,我們是無法直接看到的;
(3)、GET提交有數據大小的限制,一般是不超過1024個位元組,而這種說法也不完全准確,HTTP協議並沒有設定URL位元組長度的上限,而是瀏
覽器做了些處理,所以長度依據瀏覽器的不同有所不同;POST請求在HTTP協議中也沒有做說明,一般來說是沒有設置限制的,但是實際上瀏覽器也有默認
值。總體來說,少量的數據使用GET,大量的數據使用POST。
(4)銀滑、GET請求因為數據參數是暴露在URL中的,所以安全性比較低,比如密碼是不能暴露的,就不能使用GET請求;POST請求中,請求參數信息是放在請求頭的,所以安全性較高,可以使用。在實際中,涉及到登錄操作的時候,盡量使用HTTPS請求,安全性更好。
下面給出一副圖示,說明一下HTTP中GET與POST請求的差異:
4、使用步驟:
在Android中使用HTTP請求,主要步驟如下:
(1)、實例化一個HttpGet(或HttpPost)對象,將請求的URL地址通過構造方法傳給HttpGet(或HttpPost)對象;
(2)、使用DefaultHttpClient類的execute方法發送GET或POST 請求,並返回HttpResponse對象;
(3)、通過HttpResponse介面的getEntity方法返回響應信息。
5、實例代碼
給出一個在實際應用中的一個POST請求的代碼片段:
[java] view plain print?
params = new LinkedList<BasicNameValuePair>();
params.add(new BasicNameValuePair("param1", "Post方法"));
params.add(new BasicNameValuePair("param2", "第二個參數"));
try {
HttpPost post = new HttpPost(baseUrl);
post.setEntity(new UrlEncodedFormEntity(params, "utf-8")); //將參數填入POST Entity中
HttpResponse response = httpClient.execute(post); //執行POST方法
resCode = response.getStatusLine().getStatusCode()); //獲取響應碼
result = EntityUtils.toString(response.getEntity(), "utf-8")); //獲取響應內容
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
6、HTTP請求狀態碼意義
HTTP請求中,主要有這樣幾個類型:1XX:表示信息提示,2XX:表示成功,3XX:表示重定向,4XX:表示客戶端請求錯誤,5XX:表示伺服器錯誤。常見的幾個HTTP請求狀態碼意義如下:
200 OK: 找到了該資源,並且一切正常。
304 NOT MODIFIED: 該資源在上次請求之後沒有任何修改。這通常用於瀏覽器的緩存機制。
401 UNAUTHORIZED: 客戶端無權訪問該資源。這通常會使得瀏覽器要求用戶輸入用戶名和密碼,以登錄到伺服器。
403 FORBIDDEN: 客戶端未能獲得授權。這通常是在401之後輸入了不正確的用戶名或密碼。
404 NOT FOUND: 在指定的位置不存在所申請的資源。
505 NOT SUPPORTED:伺服器不支持請求中所指明的HTTP版本
⑺ 用戶請求一張圖片,http在響應的時候是只返回圖片給瀏覽器還是返回一個html給瀏覽器
呃,你這個說法比較糊塗,但按你的意思理解應該是後者。