http請求的詳細(xì)過程 【推薦】
對于一個(gè)做程序開發(fā)的人員來說基礎(chǔ)知識非常重要,而在工作中常常忽略掉這些基本功的熟練掌握,無意看到這篇文章,覺得不錯(cuò),特來轉(zhuǎn)載,由于原創(chuàng)地址不明,在此不作標(biāo)注,希望作者能理解。
http://www.yuanma.org/data/2009/1009/article_3949.htm
一個(gè)http請求的詳細(xì)過程
我們來看當(dāng)我們在瀏覽器輸入http://www.mycompany.com:8080/mydir/index.html,幕后所發(fā)生的一切。
首先http是一個(gè)應(yīng)用層的協(xié)議,在這個(gè)層的協(xié)議,只是一種通訊規(guī)范,也就是因?yàn)殡p方要進(jìn)行通訊,大家要事先約定一個(gè)規(guī)范。
1.連接 當(dāng)我們輸入這樣一個(gè)請求時(shí),首先要建立一個(gè)socket連接,因?yàn)閟ocket是通過ip和端口建立的,所以之前還有一個(gè)DNS解析過程,把www.mycompany.com變成ip,如果url里不包含端口號,則會(huì)使用該協(xié)議的默認(rèn)端口號。
DNS的過程是這樣的:首先我們知道我們本地的機(jī)器上在配置網(wǎng)絡(luò)時(shí)都會(huì)填寫DNS,這樣本機(jī)就會(huì)把這個(gè)url發(fā)給這個(gè)配置的DNS服務(wù)器,如果能夠找到相應(yīng)的url則返回其ip,否則該DNS將繼續(xù)將該解析請求發(fā)送給上級DNS,整個(gè)DNS可以看做是一個(gè)樹狀結(jié)構(gòu),該請求將一直發(fā)送到根直到得到結(jié)果。現(xiàn)在已經(jīng)擁有了目標(biāo)ip和端口號,這樣我們就可以打開socket連接了。
2.請求 連接成功建立后,開始向web服務(wù)器發(fā)送請求,這個(gè)請求一般是GET或POST命令(POST用于FORM參數(shù)的傳遞)。GET命令的格式為: GET 路徑/文件名 HTTP/1.0
文件名指出所訪問的文件,HTTP/1.0指出Web瀏覽器使用的HTTP版本。現(xiàn)在可以發(fā)送GET命令:
GET /mydir/index.html HTTP/1.0,
3.應(yīng)答 web服務(wù)器收到這個(gè)請求,進(jìn)行處理。從它的文檔空間中搜索子目錄mydir的文件index.html。如果找到該文件,Web服務(wù)器把該文件內(nèi)容傳送給相應(yīng)的Web瀏覽器。
為了告知瀏覽器,,Web服務(wù)器首先傳送一些HTTP頭信息,然后傳送具體內(nèi)容(即HTTP體信息),HTTP頭信息和HTTP體信息之間用一個(gè)空行分開。
常用的HTTP頭信息有:
① HTTP 1.0 200 OK 這是Web服務(wù)器應(yīng)答的第一行,列出服務(wù)器正在運(yùn)行的HTTP版本號和應(yīng)答代碼。代碼"200 OK"表示請求完成。
② MIME_Version:1.0 它指示MIME類型的版本。
③ content_type:類型 這個(gè)頭信息非常重要,它指示HTTP體信息的MIME類型。如:content_type:text/html指示傳送的數(shù)據(jù)是HTML文檔。
④ content_length:長度值 它指示HTTP體信息的長度(字節(jié))。
4.關(guān)閉連接:當(dāng)應(yīng)答結(jié)束后,Web瀏覽器與Web服務(wù)器必須斷開,以保證其它Web瀏覽器能夠與Web服務(wù)器建立連接。
下面我們具體分析其中的數(shù)據(jù)包在網(wǎng)絡(luò)中漫游的經(jīng)歷
在網(wǎng)絡(luò)分層結(jié)構(gòu)中,各層之間是嚴(yán)格單向依賴的。“服務(wù)”是描述各層之間關(guān)系的抽象概念,即網(wǎng)絡(luò)中各層向緊鄰上層提供的一組操作。下層是服務(wù)提供者,上層是請求服務(wù)的用戶。服務(wù)的表現(xiàn)形式是原語(primitive),如系統(tǒng)調(diào)用或庫函數(shù)。系統(tǒng)調(diào)用是操作系統(tǒng)內(nèi)核向網(wǎng)絡(luò)應(yīng)用程序或高層協(xié)議提供的服務(wù)原語。網(wǎng)絡(luò)中的n層總要向n+1層提供比n-1層更完備的服務(wù),否則n層就沒有存在的價(jià)值。
傳輸層實(shí)現(xiàn)的是“端到端”通信,引進(jìn)網(wǎng)間進(jìn)程通信概念,同時(shí)也要解決差錯(cuò)控制,流量控制,數(shù)據(jù)排序(報(bào)文排序),連接管理等問題,為此提供不同的服務(wù)方式。通常傳輸層的服務(wù)通過系統(tǒng)調(diào)用的方式提供,以socket的方式。對于客戶端,要想建立一個(gè)socket連接,需要調(diào)用這樣一些函數(shù)socket() bind() connect(),然后就可以通過send()進(jìn)行數(shù)據(jù)發(fā)送。
現(xiàn)在看數(shù)據(jù)包在網(wǎng)絡(luò)中的穿行過程:
應(yīng)用層
首先我們可以看到在應(yīng)用層,根據(jù)當(dāng)前的需求和動(dòng)作,結(jié)合應(yīng)用層的協(xié)議,有我們確定發(fā)送的數(shù)據(jù)內(nèi)容,我們把這些數(shù)據(jù)放到一個(gè)緩沖區(qū)內(nèi),然后形成了應(yīng)用層的報(bào)文data。
傳輸層
這些數(shù)據(jù)通過傳輸層發(fā)送,比如tcp協(xié)議。所以它們會(huì)被送到傳輸層處理,在這里報(bào)文打上了傳輸頭的包頭,主要包含端口號,以及tcp的各種制信息,這些信息是直接得到的,因?yàn)榻涌谥行枰付ǘ丝凇_@樣就組成了tcp的數(shù)據(jù)傳送單位segment。tcp是一種端到端的協(xié)議,利用這些信息,比如tcp首部中的序號確認(rèn)序號,根據(jù)這些數(shù)字,發(fā)送的一方不斷的進(jìn)行發(fā)送等待確認(rèn),發(fā)送一個(gè)數(shù)據(jù)段后,會(huì)開啟一個(gè)計(jì)數(shù)器,只有當(dāng)收到確認(rèn)后才會(huì)發(fā)送下一個(gè),如果超過計(jì)數(shù)時(shí)間仍未收到確認(rèn)則進(jìn)行重發(fā),在接受端如果收到錯(cuò)誤數(shù)據(jù),則將其丟棄,這將導(dǎo)致發(fā)送端超時(shí)重發(fā)。通過tcp協(xié)議,控制了數(shù)據(jù)包的發(fā)送序列的產(chǎn)生,不斷的調(diào)整發(fā)送序列,實(shí)現(xiàn)流控和數(shù)據(jù)完整。
網(wǎng)絡(luò)層
然后待發(fā)送的數(shù)據(jù)段送到網(wǎng)絡(luò)層,在網(wǎng)絡(luò)層被打包,這樣封裝上了網(wǎng)絡(luò)層的包頭,包頭內(nèi)部含有源及目的的ip地址,該層數(shù)據(jù)發(fā)送單位被稱為packet。網(wǎng)絡(luò)層開始負(fù)責(zé)將這樣的數(shù)據(jù)包在網(wǎng)絡(luò)上傳輸,如何穿過路由器,最終到達(dá)目的地址。在這里,根據(jù)目的ip地址,就需要查找下一跳路由的地址。首先在本機(jī),要查找本機(jī)的路由表,在windows上運(yùn)行route print就可以看到當(dāng)前路由表內(nèi)容,有如下幾項(xiàng):
Active Routes Default Route Persistent Route.
整個(gè)查找過程是這樣的:
(1)根據(jù)目的地址,得到目的網(wǎng)絡(luò)號,如果處在同一個(gè)內(nèi)網(wǎng),則可以直接發(fā)送。
(2)如果不是,則查詢路由表,找到一個(gè)路由。
(3)如果找不到明確的路由,此時(shí)在路由表中還會(huì)有默認(rèn)網(wǎng)關(guān),也可稱為缺省網(wǎng)關(guān),IP用缺省的網(wǎng)關(guān)地址將一個(gè)數(shù)據(jù)傳送給下一個(gè)指定的路由器,所以網(wǎng)關(guān)也可能是路由器,也可能只是內(nèi)網(wǎng)向特定路由器傳輸數(shù)據(jù)的網(wǎng)關(guān)。
(4)路由器收到數(shù)據(jù)后,它再次為遠(yuǎn)程主機(jī)或網(wǎng)絡(luò)查詢路由,若還未找到路由,該數(shù)據(jù)包將發(fā)送到該路由器的缺省網(wǎng)關(guān)地址。而數(shù)據(jù)包中包含一個(gè)最大路由跳數(shù),如果超過這個(gè)跳數(shù),就會(huì)丟棄數(shù)據(jù)包,這樣可以防止無限傳遞。路由器收到數(shù)據(jù)包后,只會(huì)查看網(wǎng)絡(luò)層的包裹數(shù)據(jù),目的ip。所以說它是工作在網(wǎng)絡(luò)層,傳輸層的數(shù)據(jù)對它來說則是透明的。
如果上面這些步驟都沒有成功,那么該數(shù)據(jù)報(bào)就不能被傳送。如果不能傳送的數(shù)據(jù)報(bào)來自本機(jī),那么一般會(huì)向生成數(shù)據(jù)報(bào)的應(yīng)用程序返回一個(gè)“主機(jī)不可達(dá)”或 “網(wǎng)絡(luò)不可達(dá)”的錯(cuò)誤。
以windows下主機(jī)的路由表為例,看路由的查找過程
======================================================================
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 目的網(wǎng)段
Netmask 子網(wǎng)掩碼
Gateway 下一跳路由器入口的ip,路由器通過interface和gateway定義一調(diào)到下一個(gè)路由器的鏈路,通常情況下,interface和gateway是同一網(wǎng)段的。
Interface 到達(dá)該目的地的本路由器的出口ip(對于我們的個(gè)人pc來說,通常由機(jī)算機(jī)A的網(wǎng)卡,用該網(wǎng)卡的IP地址標(biāo)識,當(dāng)然一個(gè)pc也可以有多個(gè)網(wǎng)卡)。
網(wǎng)關(guān)這個(gè)概念,主要用于不同子網(wǎng)間的交互,當(dāng)兩個(gè)子網(wǎng)內(nèi)主機(jī)A,B要進(jìn)行通訊時(shí),首先A要將數(shù)據(jù)發(fā)送到它的本地網(wǎng)關(guān),然后網(wǎng)關(guān)再將數(shù)據(jù)發(fā)送給B所在的網(wǎng)關(guān),然后網(wǎng)關(guān)再發(fā)送給B。
默認(rèn)網(wǎng)關(guān),當(dāng)一個(gè)數(shù)據(jù)包的目的網(wǎng)段不在你的路由記錄中,那么,你的路由器該把那個(gè)數(shù)據(jù)包發(fā)送到哪里!缺省路由的網(wǎng)關(guān)是由你的連接上的default gateway決定的,也就是我們通常在網(wǎng)絡(luò)連接里配置的那個(gè)值。
通常interface和gateway處在一個(gè)子網(wǎng)內(nèi),對于路由器來說,因?yàn)榭赡芫哂胁煌膇nterface,當(dāng)數(shù)據(jù)包到達(dá)時(shí),根據(jù)Network Destination尋找匹配的條目,如果找到,interface則指明了應(yīng)當(dāng)從該路由器的那個(gè)接口出去,gateway則代表了那個(gè)子網(wǎng)的網(wǎng)關(guān)地址。
第一條 0.0.0.0 0.0.0.0 192.168.1.2 192.168.1.101 10
0.0.0.0代表了缺省路由。該路由記錄的意思是:當(dāng)我接收到一個(gè)數(shù)據(jù)包的目的網(wǎng)段不在我的路由記錄中,我會(huì)將該數(shù)據(jù)包通過192.168.1.101這個(gè)接口發(fā)送到192.168.1.2這個(gè)地址,這個(gè)地址是下一個(gè)路由器的一個(gè)接口,這樣這個(gè)數(shù)據(jù)包就可以交付給下一個(gè)路由器處理,與我無關(guān)。該路由記錄的線路質(zhì)量 10。當(dāng)有多個(gè)條目匹配時(shí),會(huì)選擇具有較小Metric值的那個(gè)。
第三條 192.168.1.0 255.255.255.0 192.168.1.101 192.168.1.101 10
直聯(lián)網(wǎng)段的路由記錄:當(dāng)路由器收到發(fā)往直聯(lián)網(wǎng)段的數(shù)據(jù)包時(shí)該如何處理,這種情況,路由記錄的interface和gateway是同一個(gè)。當(dāng)我接收到一個(gè)數(shù)據(jù)包的目的網(wǎng)段是192.168.1.0時(shí),我會(huì)將該數(shù)據(jù)包通過192.168.1.101這個(gè)接口直接發(fā)送出去,因?yàn)檫@個(gè)端口直接連接著192.168.1.0這個(gè)網(wǎng)段,該路由記錄的線路質(zhì)量 10 (因interface和gateway是同一個(gè),表示數(shù)據(jù)包直接傳送給目的地址,不需要再轉(zhuǎn)給路由器)。
一般就分這兩種情況,目的地址與當(dāng)前路由器接口是否在同一子網(wǎng)。如果是則直接發(fā)送,不需再轉(zhuǎn)給路由器,否則還需要轉(zhuǎn)發(fā)給下一個(gè)路由器繼續(xù)進(jìn)行處理。
查找到下一跳ip地址后,還需要知道它的mac地址,這個(gè)地址要作為鏈路層數(shù)據(jù)裝進(jìn)鏈路層頭部。這時(shí)需要arp協(xié)議,具體過程是這樣的,查找arp緩沖,windows下運(yùn)行arp -a可以查看當(dāng)前arp緩沖內(nèi)容。如果里面含有對應(yīng)ip的mac地址,則直接返回。否則需要發(fā)生arp請求,該請求包含源的ip和mac地址,還有目的地的ip地址,在網(wǎng)內(nèi)進(jìn)行廣播,所有的主機(jī)會(huì)檢查自己的ip與該請求中的目的ip是否一樣,如果剛好對應(yīng)則返回自己的mac地址,同時(shí)將請求者的ip mac保存。這樣就得到了目標(biāo)ip的mac地址。
鏈路層
將mac地址及鏈路層控制信息加到數(shù)據(jù)包里,形成Frame,F(xiàn)rame在鏈路層協(xié)議下,完成了相鄰的節(jié)點(diǎn)間的數(shù)據(jù)傳輸,完成連接建立,控制傳輸速度,數(shù)據(jù)完整。
物理層
物理線路則只負(fù)責(zé)該數(shù)據(jù)以bit為單位從主機(jī)傳輸?shù)较乱粋€(gè)目的地。
下一個(gè)目的地接受到數(shù)據(jù)后,從物理層得到數(shù)據(jù)然后經(jīng)過逐層的解包 到 鏈路層 到 網(wǎng)絡(luò)層,然后開始上述的處理,在經(jīng)網(wǎng)絡(luò)層 鏈路層 物理層將數(shù)據(jù)封裝好繼續(xù)傳往下一個(gè)地址。
在上面的過程中,可以看到有一個(gè)路由表查詢過程,而這個(gè)路由表的建立則依賴于路由算法。也就是說路由算法實(shí)際上只是用來路由器之間更新維護(hù)路由表,真正的數(shù)據(jù)傳輸過程并不執(zhí)行這個(gè)算法,只查看路由表。這個(gè)概念也很重要,需要理解常用的路由算法。而整個(gè)tcp協(xié)議比較復(fù)雜,跟鏈路層的協(xié)議有些相似,其中有很重要的一些機(jī)制或者概念需要認(rèn)真理解,比如編號與確認(rèn),流量控制,重發(fā)機(jī)制,發(fā)送接受窗口。
tcp/ip基本模型及概念
物理層
設(shè)備,中繼器(repeater),集線器(hub)。對于這一層來說,從一個(gè)端口收到數(shù)據(jù),會(huì)轉(zhuǎn)發(fā)到所有端口。
鏈路層
協(xié)議:SDLC(Synchronous Data Link Control)HDLC(High-level Data Link Control) ppp協(xié)議獨(dú)立的鏈路設(shè)備中最常見的當(dāng)屬網(wǎng)卡,網(wǎng)橋也是鏈路產(chǎn)品。集線器MODEM的某些功能有人認(rèn)為屬于鏈路層,對此還有些爭議認(rèn)為屬于物理層設(shè)備。除此之外,所有的交換機(jī)都需要工作在數(shù)據(jù)鏈路層,但僅工作在數(shù)據(jù)鏈路層的僅是二層交換機(jī)。其他像三層交換機(jī)、四層交換機(jī)和七層交換機(jī)雖然可對應(yīng)工作在OSI的三層、四層和七層,但二層功能仍是它們基本的功能。
因?yàn)橛辛薓AC地址表,所以才充分避免了沖突,因?yàn)榻粨Q機(jī)通過目的MAC地址知道應(yīng)該把這個(gè)數(shù)據(jù)轉(zhuǎn)發(fā)到哪個(gè)端口。而不會(huì)像HUB一樣,會(huì)轉(zhuǎn)發(fā)到所有滴端口。所以,交換機(jī)是可以劃分沖突域滴。
網(wǎng)絡(luò)層
四個(gè)主要的協(xié)議:
網(wǎng)際協(xié)議IP:負(fù)責(zé)在主機(jī)和網(wǎng)絡(luò)之間尋址和路由數(shù)據(jù)包。
地址解析協(xié)議ARP:獲得同一物理網(wǎng)絡(luò)中的硬件主機(jī)地址。
網(wǎng)際控制消息協(xié)議ICMP:發(fā)送消息,并報(bào)告有關(guān)數(shù)據(jù)包的傳送錯(cuò)誤。
互聯(lián)組管理協(xié)議IGMP:被IP主機(jī)拿來向本地多路廣播路由器報(bào)告主機(jī)組成員。
該層設(shè)備有三層交換機(jī),路由器。
傳輸層
兩個(gè)重要協(xié)議 TCP 和 UDP 。
端口概念:TCP/UDP 使用 IP 地址標(biāo)識網(wǎng)上主機(jī),使用端口號來標(biāo)識應(yīng)用進(jìn)程,即 TCP/UDP 用主機(jī) IP 地址和為應(yīng)用進(jìn)程分配的端口號來標(biāo)識應(yīng)用進(jìn)程。端口號是 16 位的無符號整數(shù), TCP 的端口號和 UDP 的端口號是兩個(gè)獨(dú)立的序列。盡管相互獨(dú)立,如果 TCP 和 UDP 同時(shí)提供某種知名服務(wù),兩個(gè)協(xié)議通常選擇相同的端口號。這純粹是為了使用方便,而不是協(xié)議本身的要求。利用端口號,一臺主機(jī)上多個(gè)進(jìn)程可以同時(shí)使用 TCP/UDP 提供的傳輸服務(wù),并且這種通信是端到端的,它的數(shù)據(jù)由 IP 傳遞,但與 IP 數(shù)據(jù)報(bào)的傳遞路徑無關(guān)。網(wǎng)絡(luò)通信中用一個(gè)三元組可以在全局唯一標(biāo)志一個(gè)應(yīng)用進(jìn)程:(協(xié)議,本地地址,本地端口號)。
也就是說tcp和udp可以使用相同的端口。
可以看到通過(協(xié)議,源端口,源ip,目的端口,目的ip)就可以用來完全標(biāo)識一組網(wǎng)絡(luò)連接。
應(yīng)用層
基于tcp:Telnet FTP SMTP DNS HTTP
基于udp:RIP NTP(網(wǎng)落時(shí)間協(xié)議)和DNS (DNS也使用TCP)SNMP TFTP
參考文獻(xiàn):
讀懂本機(jī)路由表 http://hi.baidu.com/thusness/blog/item/9c18e5bf33725f0818d81f52.html
Internet 傳輸層協(xié)議 http://www.cic.tsinghua.edu.cn/jdx/book6/3.htm
計(jì)算機(jī)網(wǎng)絡(luò) 謝希仁
posted on 2009-12-01 16:47 都市淘沙者 閱讀(383) 評論(0) 編輯 收藏 所屬分類: Java Basic/Lucene/開源資料