一個http請求發送到後端的詳細過程

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

首先http是一個應用層的協議,在這個層的協議,只是一種通信規範,也就是由於雙方要進行通信,你們要事先約定一個規範。web

1.鏈接 當咱們輸入這樣一個請求時,首先要創建一個socket鏈接,由於socket是經過ip和端口創建的,因此以前還有一個DNS解析過程,把www.mycompany.com變成ip,若是url裏不包含端口號,則會使用該協議的默認端口號。算法

DNS的過程是這樣的:首先咱們知道咱們本地的機器上在配置網絡時都會填寫DNS,這樣本機就會把這個url發給這個配置的DNS服務器,若是可以找到相應的url則返回其ip,不然該DNS將繼續將該解析請求發送給上級DNS,整個DNS能夠看作是一個樹狀結構,該請求將一直髮送到根直到獲得結果。如今已經擁有了目標ip和端口號,這樣咱們就能夠打開socket鏈接了。windows

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體信息的長度(字節)。socket


4.關閉鏈接:當應答結束後,Web瀏覽器與Web服務器必須斷開,以保證其它Web瀏覽器可以與Web服務器創建鏈接。tcp


下面咱們具體分析其中的數據包在網絡中漫遊的經歷函數

在網絡分層結構中,各層之間是嚴格單向依賴的。「服務」是描述各層之間關係的抽象概念,即網絡中各層向緊鄰上層提供的一組操做。下層是服務提供者,上層是請求服務的用戶。服務的表現形式是原語(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

相關文章
相關標籤/搜索