天天看點

在浏覽器中簡單輸入一個網址,解密其後發生的一切(http請求的詳細過程)

在浏覽器中簡單輸入一個網址,解密其後發生的一切(http請求的詳細過程)

原文連結:http://www.360doc.com/content/14/1117/10/16948208_425717940.shtml

一個http請求的詳細過程

http://canann.iteye.com/blog/1851361

三次握手http://www.cnblogs.com/hnrainll/archive/2011/10/14/2212415.html

我們來看當我們在浏覽器輸入http://www.mycompany.com:8080/mydir/index.html,幕後所發生的一切。

首先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