HTTP概述
Web瀏覽器、服務(wù)器和相關(guān)的Web應用程序都是通過(guò)HTTP相互通信。HTTP是現代全球因特網(wǎng)中使用的公共語(yǔ)言。
HTTP-因特網(wǎng)的多媒體信使
每天都有數億JPEG圖片、HTML頁(yè)面、文本文件、MPEG電影、WAV音頻文件、java小程序和其他資源在因特網(wǎng)游弋。HTTP可以從全世界的Web服務(wù)器上將這些信息迅速、便捷、可靠的傳輸到Web瀏覽器上。HTTP使用的是可靠的數據傳輸協(xié)議,它能夠確保數據在傳輸過(guò)程中不會(huì )被損壞或者產(chǎn)生混亂。對開(kāi)發(fā)人員來(lái)說(shuō),無(wú)需擔心HTTP通信會(huì )在傳輸過(guò)程中被破壞、復制或者產(chǎn)生畸變。開(kāi)發(fā)人員可以專(zhuān)注于程序特有細節的編寫(xiě),而不是考慮因特網(wǎng)中存在的一些缺陷和問(wèn)題。
Web客戶(hù)端和服務(wù)器
Web內容都是存儲在Web服務(wù)器上。Web服務(wù)器使用HTTP協(xié)議,因此還可以稱(chēng)為HTTP服務(wù)器。HTTP客戶(hù)端向服務(wù)器發(fā)出請求,服務(wù)器會(huì )在HTTP響應中回送所請求的數據。
最常見(jiàn)的HTTP客戶(hù)端就是瀏覽器。瀏覽器向服務(wù)器請求HTTP對象,并將對象顯示在屏幕上。
媒體類(lèi)型
因特網(wǎng)有很多的數據類(lèi)型,HTTP給每種要通過(guò)Web傳輸的對象都打上MIME類(lèi)型(MIME type)的數據格式標簽。最初設計MIME(Multipurpose Internet Mail Extension,多用途因特網(wǎng)郵件擴展)是為了解決不同電子郵件系統之家搬移報文時(shí)存在的問(wèn)題。Web服務(wù)器會(huì )為所有的HTTP對象數據附一個(gè)MIME類(lèi)型。當Web瀏覽器從服務(wù)器取回一個(gè)對象時(shí),會(huì )去查看相關(guān)的MIME類(lèi)型,看看它是否知道應該如何處理這個(gè)對象。大多數瀏覽器都可以處理上百種常見(jiàn)對象:顯示圖片、解析并格式化HTML文件、播放音頻文件、或者運行外部軟件來(lái)處理特殊格式數據。MIME類(lèi)型是一種文本標記,表示一種主要的對象類(lèi)型和一個(gè)特定的子類(lèi)型,中間由一條斜杠來(lái)分隔。例如:HTML格式的文本文檔 text/html類(lèi)型來(lái)標記。
URI
每個(gè)Web服務(wù)器都有一個(gè)名字,這樣客戶(hù)端就可以說(shuō)明它們感興趣的資源是什么。服務(wù)器資源名被統一稱(chēng)為統一資源標識符(Uniform Resource Identifier,URI)。URI有兩種形式:分別是URL和URN。
URL
統一資源定位符(URL,Uniform Resource Locator)是資源標識符最常見(jiàn)的形式。
大部分URL都遵循一種標準格式,這種格式包含三個(gè)部分。1.URL的第一部分稱(chēng)為方案(scheme),說(shuō)明訪(fǎng)問(wèn)資源所使用的協(xié)議類(lèi)型。這部分通常是HTTP或者HTTPS(http://)。2.第二部分給出了服務(wù)器的因特網(wǎng)地址(www.joes-hardware.com)。3.其余部分指定了Web服務(wù)器上的某個(gè)資源(比如,/specials/saw-blade.gif),F在幾乎所有的URI都是URL。 URN
URI的第二種形式就是URN(統一資源名)。URN是作為特定內容的唯一名稱(chēng)使用的,與目前的資源所在地無(wú)關(guān)。使用這些與>位置無(wú)關(guān)的URN,就可以將資源四處搬動(dòng)。通過(guò)URN,還可以用同一個(gè)名字通過(guò)多種網(wǎng)絡(luò )訪(fǎng)問(wèn)協(xié)議來(lái)訪(fǎng)問(wèn)資源。URN仍然處于試驗階段,還未大范圍使用。除非特殊說(shuō)明,否則這里的都是用URL來(lái)指定URI。
事務(wù)
一個(gè)HTTP事務(wù)由一條請求命令和一個(gè)響應結果組成。這種通信通過(guò)名為HTTP報文(HTTP message)的格式化數據塊進(jìn)行。
方法
HTTP支持幾種幾種不同的請求命令,這些命令被稱(chēng)為HTTP方法(HTTP method)。每條HTTP請求報文都包含一個(gè)方法。這個(gè)方法會(huì )告訴服務(wù)器要執行什么動(dòng)作(獲取一個(gè)Web頁(yè)面、運行一個(gè)網(wǎng)關(guān)程序、刪除一個(gè)文件等)。
常見(jiàn)的HTTP方法:
HTTP方法描述GET從服務(wù)器向客戶(hù)端發(fā)送命名資源PUT將來(lái)自客戶(hù)端的數據存儲到一個(gè)命名的資源服務(wù)器中DELETE從服務(wù)器中刪除命名資源POST將客戶(hù)端數據發(fā)送到一個(gè)服務(wù)器網(wǎng)關(guān)應用程序HEAD僅發(fā)送命名資源響應中的HTTP首部
- 狀態(tài)碼
每條HTTP響應報文返回時(shí)都會(huì )攜帶一個(gè)狀態(tài)碼。狀態(tài)碼是一個(gè)三位數字的代碼,告知客戶(hù)端請求是否成功,或者是否需要采取其他動(dòng)作。
常見(jiàn)的HTTP狀態(tài)碼:
HTTP狀態(tài)碼描述200OK, 文檔正確返回302Redirect(重定向)。到其他地方去獲取資源404Not Found(沒(méi)找到),無(wú)法找到這個(gè)資源
- Web頁(yè)面可以包含多個(gè)對象
應用程序完成一項任務(wù)時(shí)通常會(huì )發(fā)布多個(gè)HTTP事務(wù)。比如,Web瀏覽器會(huì )發(fā)布一系列的HTTP事務(wù)來(lái)獲取并顯示一個(gè)包含豐富圖片的Web頁(yè)面。瀏覽器會(huì )執行一個(gè)事務(wù)來(lái)獲取描述頁(yè)面布局的HTML”框架“,然后發(fā)布另外的HTTP事務(wù)來(lái)獲取每個(gè)嵌入式圖片、圖像面板、Java小程序等。這些嵌入式資源甚至可能位于不同的服務(wù)器。因此,一個(gè)Web頁(yè)面通常并不是單個(gè)資源,而是一組資源的集合。
報文
HTTP報文都是由一行行的簡(jiǎn)單字符串組成。HTTP報文都是純文本,不是二進(jìn)制代碼。
從Web客戶(hù)端發(fā)往Web服務(wù)器的HTTP報文稱(chēng)為請求報文(request message)。從服務(wù)器發(fā)往客戶(hù)端的報文稱(chēng)為響應報文(reponse message),此外沒(méi)有其他類(lèi)型的HTTP報文。請求報文和響應報文格式類(lèi)似。HTTP報文包括以下三部分:
起始行
報文的第一行就是起始行,在請求報文中用來(lái)說(shuō)明要做些什么,在響應報文中說(shuō)明出現了什么情況。
首部字段
起始行后面有0個(gè)或者多個(gè)首部字段。每個(gè)字段都包含一個(gè)名字和一個(gè)值,為了便于解析,兩者之間用冒號(:)分隔。首部以一個(gè)空行結束。添加一個(gè)首部字段和添加新行一樣簡(jiǎn)單。
主體
空行之后就是可選的報文主體了,其中包含了所有類(lèi)型的數據。請求主體中包括了要發(fā)給Web服務(wù)器的數據,響應主體中裝載了要返回給客戶(hù)端的數據。起始行和首部都是文本形式且都是結構化的,而主體則不同,主體可以包含任意的二進(jìn)制數據(圖片、視頻、音頻、軟件程序)。當然,主體還可以包含文本。
連接
TCP/IP
HTTP是個(gè)應用層協(xié)議。HTTP無(wú)需關(guān)心網(wǎng)絡(luò )通信的具體細節;它把聯(lián)網(wǎng)的細節都給了通用、可靠的因特網(wǎng)傳輸協(xié)議TCP/IP。TCP提供了:- 無(wú)差錯的數據傳輸。- 按序傳輸(數據總是按照發(fā)送的順序到達);- 分段的數據流(可以在任意時(shí)刻以任意大小將數據發(fā)送出去)。因特網(wǎng)自身是基于TCP/IP的,它是全世界計算機網(wǎng)絡(luò )常用的層次化分組交換網(wǎng)絡(luò )協(xié)議集。TCP/IP 隱藏了各種網(wǎng)絡(luò )和硬件的特點(diǎn)及弱點(diǎn),使各種類(lèi)型的計算機和網(wǎng)絡(luò )都能夠進(jìn)行可靠地通信。只要建立了TCP連接,客戶(hù)端和服務(wù)器之間的報文交換就不會(huì )丟失、被破壞、也不會(huì )出現接收時(shí)亂序。HTTP協(xié)議位于TCP的上層。HTTP使用TCP來(lái)傳輸其報文數據。
連接、IP地址及端口號
在HTTP客戶(hù)端向服務(wù)器發(fā)送報文之前,需要用網(wǎng)際協(xié)議(Internet Prococol,IP)地址和端口號在客戶(hù)端和服務(wù)器之間建立一條TCP/IP連接。建立一條TCP連接的過(guò)程與給公司辦公室的某個(gè)人打電話(huà)的過(guò)程類(lèi)似。首先,要撥打公司的電話(huà)號碼。這樣就能進(jìn)入正確的機構了。其次,撥打要聯(lián)系的那個(gè)人的分機號。最初怎么獲取服務(wù)器的IP地址呢?當然是通過(guò)URL。先看幾個(gè)URL:http://207.200.83.29:80/index.htmlhttp://www.netscape.com:80/index.htmlhttp://www.netscape.com/index.html第一個(gè) URL 使用了機器的 IP 地址,207.200.83.29 以及端口.第二個(gè) URL 沒(méi)有使用數字形式的 IP 地址,它使用的是文本形式的域名,或者稱(chēng)為主機名(www.netscape.com) 。主機名就是 IP 地址比較人性化的別稱(chēng)?梢酝ㄟ^(guò)一種稱(chēng)為域名服務(wù)(Domain Name Service,DNS)的機制方便地將主機名轉換為 IP地址,這樣所有問(wèn)題就都解決了。最后一個(gè) URL 沒(méi)有端口號。HTTP 的 URL 中沒(méi)有端口號時(shí),可以假設默認端口號是 80。有了 IP 地址和端口號,客戶(hù)端就可以很方便地通過(guò) TCP/IP 進(jìn)行通信了。
連接、IP地址及端口號
在HTTP客戶(hù)端向服務(wù)器發(fā)送報文之前,需要用網(wǎng)際協(xié)議(Internet Prococol,IP)地址和端口號在客戶(hù)端和服務(wù)器之間建立一條TCP/IP連接。建立一條TCP連接的過(guò)程與給公司辦公室的某個(gè)人打電話(huà)的過(guò)程類(lèi)似。首先,要撥打公司的電話(huà)號碼。這樣就能進(jìn)入正確的機構了。其次,撥打要聯(lián)系的那個(gè)人的分機號。最初怎么獲取服務(wù)器的IP地址呢?當然是通過(guò)URL。先看幾個(gè)URL:http://207.200.83.29:80/index.htmlhttp://www.netscape.com:80/index.htmlhttp://www.netscape.com/index.html第一個(gè) URL 使用了機器的 IP 地址,207.200.83.29 以及端口.第二個(gè) URL 沒(méi)有使用數字形式的 IP 地址,它使用的是文本形式的域名,或者稱(chēng)為主機名(www.netscape.com) 。主機名就是 IP 地址比較人性化的別稱(chēng)?梢酝ㄟ^(guò)一種稱(chēng)為域名服務(wù)(Domain Name Service,DNS)的機制方便地將主機名轉換為 IP地址,這樣所有問(wèn)題就都解決了。最后一個(gè) URL 沒(méi)有端口號。HTTP 的 URL 中沒(méi)有端口號時(shí),可以假設默認端口號是 80。有了 IP 地址和端口號,客戶(hù)端就可以很方便地通過(guò) TCP/IP 進(jìn)行通信了。
步驟如下:
(a) 瀏覽器從 URL 中解析出服務(wù)器的主機名;
(b) 瀏覽器將服務(wù)器的主機名轉換成服務(wù)器的 IP 地址;
(c) 瀏覽器將端口號(如果有的話(huà))從 URL 中解析出來(lái);
(d) 瀏覽器建立一條與 Web 服務(wù)器的 TCP 連接;
(e) 瀏覽器向服務(wù)器發(fā)送一條 HTTP 請求報文;
(f) 服務(wù)器向瀏覽器回送一條 HTTP 響應報文;
(g) 關(guān)閉連接,瀏覽器顯示文檔。
使用Telnet實(shí)例
Telnet程序可以將鍵盤(pán)連接到某個(gè)目標TCP端口,并將此TCP端口的輸出回送到顯示屏上。Telnet常用于遠程終端會(huì )話(huà),但它幾乎可以連接所有的TCP服務(wù)器,包括HTTP服務(wù)器?梢酝ㄟ^(guò)Telnet程序直接與Web服務(wù)器進(jìn)行對話(huà)。通過(guò)Telnet可以打開(kāi)一條到某臺機器上某個(gè)端口的TCP連接,然后直接向端口輸入一些字符。Web服務(wù)器會(huì )將Telnet程序作為一個(gè)Web客戶(hù)端來(lái)處理,然后回送給TCP連接的數據會(huì )顯示在屏幕上。實(shí)際例子:Telnet獲取URL http://www.joes-hardware.com:80/tools.html 所指向的文檔
Telnet 會(huì )查找主機名并打開(kāi)一條連接,連接到在 www.joes-hardware.com 的端口 80上監聽(tīng)的 Web 服務(wù)器。這條命令之后的三行內容是 Telnet 的輸出,告訴我們它已經(jīng)建立了連接。然后我們輸入最基本的請求命令 GET/tools.html HTTP/1.1 ,發(fā)送一個(gè)提供了源端主機名的 Host 首部,后面跟上一個(gè)空行,請求從服務(wù)器 www.joes-hardware.com 上獲取資源 tools.html。隨后,服務(wù)器會(huì )以一個(gè)響應行、幾個(gè)響應首部、一個(gè)空行和最后面的 HTML 文檔主體來(lái)應答。要明確的是,Telnet 可以很好地模擬 HTTP 客戶(hù)端,但不能作為服務(wù)器使用。而且對 Telnet 做腳本自動(dòng)化是很繁瑣乏味的。如果想要更靈活的工具,可以去看看 nc(netcat) 。通過(guò) nc 可以很方便地操縱基于 UDP 和 TCP 的流量(包括 HTTP) ,還可以為其編寫(xiě)腳本。更多細節參見(jiàn) http://www.bgw.org/tutorials/utilities/nc.php
協(xié)議版本
目前HTTP有幾個(gè)協(xié)議版本。 HTTP/0.9
HTTP 的 1991 原型版本稱(chēng)為 HTTP/0.9。這個(gè)協(xié)議有很多嚴重的設計缺陷,只應該用于與老客戶(hù)端的交互。HTTP/0.9 只支持 GET 方法,不支持多媒體內容的MIME 類(lèi)型、各種 HTTP 首部,或者版本號。HTTP/0.9 定義的初衷是為了獲取簡(jiǎn)單的 HTML 對象,它很快就被 HTTP/1.0 取代了。
HTTP/1.0
1.0 是第一個(gè)得到廣泛使用的 HTTP 版本。HTTP/1.0 添加了版本號、各種 HTTP首部、一些額外的方法,以及對多媒體對象的處理。HTTP/1.0 使得包含生動(dòng)圖片的 Web 頁(yè)面和交互式表格成為可能,而這些頁(yè)面和表格促使萬(wàn)維網(wǎng)為人們廣泛地接受。這個(gè)規范從未得到良好地說(shuō)明。在這個(gè) HTTP 協(xié)議的商業(yè)演進(jìn)和學(xué)術(shù)研究都在快速進(jìn)行的時(shí)代,它集合了一系列的最佳實(shí)踐。
HTTP/1.0+
在 20 世紀 90 年代中葉,很多流行的 Web 客戶(hù)端和服務(wù)器都在飛快地向 HTTP中添加各種特性,以滿(mǎn)足快速擴張且在商業(yè)上十分成功的萬(wàn)維網(wǎng)的需要。其中很多特性,包括持久的 keep-alive 連接、虛擬主機支持,以及代理連接支持都被加入到 HTTP 之中,并成為非官方的事實(shí)標準。這種非正式的 HTTP 擴展版本通常稱(chēng)為 HTTP/1.0+。
HTTP/1.1
HTTP/1.1 重點(diǎn)關(guān)注的是校正 HTTP 設計中的結構性缺陷,明確語(yǔ)義,引入重要的性能優(yōu)化措施,并刪除一些不好的特性。HTTP/1.1 還包含了對 20 世紀 90 年代末正在發(fā)展中的更復雜的 Web 應用程序和部署方式的支持。HTTP/1.1 是當前使用的 HTTP 版本。
HTTP-NG(又名 HTTP/2.0)
HTTP-NG 是 HTTP/1.1 后繼結構的原型建議,它重點(diǎn)關(guān)注的是性能的大幅優(yōu)化,以及更強大的服務(wù)邏輯遠程執行框架。HTTP-NG 的研究工作終止于 1998 年,編寫(xiě)本書(shū)時(shí),還沒(méi)有任何要用此建議取代 HTTP/1.1 的推廣計劃。
<h4 id="web結構組件">Web結構組件
前面重點(diǎn)介紹了Web應用程序(Web客戶(hù)端和Web服務(wù)器)是如何相互發(fā)送報文來(lái)實(shí)現基本事務(wù)處理的。因特網(wǎng)上還有一些其他的應用程序。下面一一介紹。
代理
代理位于客戶(hù)端和服務(wù)器之間的HTTP中間實(shí)體。接收所有客戶(hù)端的 HTTP 請求,并將這些請求轉發(fā)給服務(wù)器(可能會(huì )對請求進(jìn)行修改之后轉發(fā)) 。對用戶(hù)來(lái)說(shuō),這些應用程序就是一個(gè)代理,代表用戶(hù)訪(fǎng)問(wèn)服務(wù)器。
出于安全考慮,通常會(huì )將代理作為轉發(fā)所有 Web 流量的可信任中間節點(diǎn)使用。代理還可以對請求和響應進(jìn)行過(guò)濾。比如,在企業(yè)中對下載的應用程序進(jìn)行病毒檢測,或者對小學(xué)生屏蔽一些成人才能看的內容。
緩存
Web 緩存(Web cache)或代理緩存(proxy cache)是一種特殊的 HTTP 代理服務(wù)器,可以將經(jīng)過(guò)代理傳送的常用文檔復制保存起來(lái)。下一個(gè)請求同一文檔的客戶(hù)端就可以享受緩存的私有副本所提供的服務(wù)了.
客戶(hù)端從附近的緩存下載文檔會(huì )比從遠程 Web 服務(wù)器下載快得多。HTTP 定義了很多功能,使得緩存更加高效,并規范了文檔的新鮮度和緩存內容的隱私性。 網(wǎng)關(guān)
網(wǎng)關(guān)(gateway)是一種特殊的服務(wù)器,作為其他服務(wù)器的中間實(shí)體使用。通常用于將 HTTP 流量轉換成其他的協(xié)議。網(wǎng)關(guān)接受請求時(shí)就好像自己是資源的源端服務(wù)器一樣?蛻(hù)端可能并不知道自己正在與一個(gè)網(wǎng)關(guān)進(jìn)行通信。例如,一個(gè) HTTP/FTP 網(wǎng)關(guān)會(huì )通過(guò) HTTP 請求接收對 FTP URI 的請求,但通過(guò) FTP協(xié)議來(lái)獲取文檔 。得到的文檔會(huì )被封裝成一條 HTTP 報文,發(fā)送給客戶(hù)端。第 8 章將探討網(wǎng)關(guān)。
隧道
隧道(tunnel)是建立起來(lái)之后,就會(huì )在兩條連接之間對原始數據進(jìn)行盲轉發(fā)的HTTP 應用程序。HTTP 隧道通常用來(lái)在一條或多條 HTTP 連接上轉發(fā)非 HTTP 數據,轉發(fā)時(shí)不會(huì )窺探數據。HTTP 隧道的一種常見(jiàn)用途是通過(guò) HTTP 連接承載加密的安全套接字層(SSL,Secure Sockets Layer)流量,這樣 SSL 流量就可以穿過(guò)只允許 Web 流量通過(guò)的防火墻了。如圖所示,HTTP/SSL 隧道收到一條 HTTP 請求,要求建立一條到目的地址和端口的輸出連接,然后在 HTTP 信道上通過(guò)隧道傳輸加密的 SSL 流量,這樣就可以將其盲轉發(fā)到目的服務(wù)器上去了。
Agent代理
用戶(hù) Agent 代理(或者簡(jiǎn)稱(chēng)為 Agent 代理)是代表用戶(hù)發(fā)起 HTTP 請求的客戶(hù)端程序。所有發(fā)布 Web 請求的應用程序都是 HTTP Agent 代理。到目前為止,我們只提到過(guò)一種 HTTP Agent 代理:Web 瀏覽器,但用戶(hù) Agent 代理還有很多其他類(lèi)型。用fiddler抓包找頭部信息會(huì )發(fā)現類(lèi)似User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36比如,有些自己會(huì )在 Web 上閑逛的自動(dòng)用戶(hù) Agent 代理,可以在無(wú)人監視的情況下發(fā)布 HTTP 事務(wù)并獲取內容。這些自動(dòng)代理的名字通常都很生動(dòng),比如“網(wǎng)絡(luò )蜘蛛”(spiders)或者“Web 機器人” (Web robots) 。網(wǎng)絡(luò )蜘蛛會(huì )在 Web 上閑逛,搜集信息以構建有效的 Web 內容檔案,比如一個(gè)搜索引擎的數據庫或者為比較購物機器人生成的產(chǎn)品目錄。
URL和資源
因特網(wǎng)資源
URL是瀏覽器尋找信息所需的資源位置。URI是一類(lèi)更通用的資源標識符,URL是URI的一個(gè)子集。URI包括URL和URN。
URL語(yǔ)法
://:@:/;?#scheme訪(fǎng)問(wèn)服務(wù)器以獲取資源時(shí)要使用的協(xié)議 默認值 無(wú) user一些方案訪(fǎng)問(wèn)資源時(shí)需要的用戶(hù)名 默認值 匿名 password用戶(hù)名后面可能要包含密碼,中間由冒號分隔 默認值 host資源宿主服務(wù)器的主機名或點(diǎn)分IP地址 默認值 無(wú) port資源宿主服務(wù)器正在監聽(tīng)的端口號,很多方案都有默認端口號(HTTP默認端口號為80) 默認值 每個(gè)方案特有 path服務(wù)器上資源的本地名,由一個(gè)”/”將其與前面的URL組件分隔開(kāi)來(lái).路徑組件的語(yǔ)法與服務(wù)器和方案有關(guān) 默認值 無(wú) params一些方案會(huì )用這個(gè)組件指定輸入參數. 參數為名/值對. URL中可以包含多個(gè)參數字段,它們相互以及與路徑的其余部分之間用分號(;)分隔 默認值 無(wú) query一些方案會(huì )用這個(gè)組件傳遞參數以激活應用程序.查詢(xún)組件的內容沒(méi)有通用格式.用符號”?”將其與URL的其余部分分隔開(kāi)來(lái) 默認值 無(wú) frag一小片或一部分資源的名字.引用對象時(shí),不會(huì )將frag字段傳送給服務(wù)器。這個(gè)字段是在客戶(hù)端內部使用的.通過(guò)字符”#”將其與URL其余部分分隔開(kāi)來(lái) 默認值 無(wú)
http://www.joes-hardware.com/hammers;sale=false/index.html;graphic=ture這個(gè)例子就有兩個(gè)路徑段,hammers和index.html。hammers路徑段的參數是sale,值為false。index.html段有參數graphics,值為true。http://www.joes-hardware.com/inventory-check.cgi?item=12731問(wèn)號右邊的內容稱(chēng)為查詢(xún)組件。URL的查詢(xún)組件和標志網(wǎng)關(guān)資源的URL路徑組件一起被發(fā)送給網(wǎng)關(guān)資源;旧峡梢詫⒕W(wǎng)關(guān)當作訪(fǎng)問(wèn)其他應用程序的訪(fǎng)問(wèn)點(diǎn)。HTTP服務(wù)器只處理整個(gè)對象,而不是對象的片段,客戶(hù)端不能將片段傳送給服務(wù)器,瀏覽器獲得整個(gè)資源后,會(huì )根據片段來(lái)顯示你感興趣的內容。
TCP/IP的三次握手,四次分手
首先我們先來(lái)了解TCP報文段
重要的標志我在圖中也有標記,重點(diǎn)了解標志位ACK:確認序號有效RST:重置連接SYN:發(fā)起了一個(gè)新連接FIN:釋放一個(gè)連接
三次握手的過(guò)程(客戶(hù)端我們用A表示,服務(wù)器端用B表示)
前提:A主動(dòng)打開(kāi),B被動(dòng)打開(kāi)
在建立連接之前,B先創(chuàng )建TCB(傳輸控制塊),準備接受客戶(hù)進(jìn)程的連接請求,處于LISTEN(監聽(tīng))狀態(tài) A首先創(chuàng )建TCB,然后向B發(fā)出連接請求,SYN置1,同時(shí)選擇初始序號seq=x,進(jìn)入SYN-SEND(同步已發(fā)送)狀態(tài) B收到連接請求后向A發(fā)送確認,SYN置1,ACK置1,同時(shí)產(chǎn)生一個(gè)確認序號ack=x+1。同時(shí)隨機選擇初始序號seq=y,進(jìn)入SYN-RCVD(同步收到)狀態(tài) A收到確認連接請求后,ACK置1,確認號ack=y+1,seq=x+1,進(jìn)入到ESTABLISHED(已建立連接)狀態(tài)。向B發(fā)出確認連接,最后B也進(jìn)入到ESTABLISHED(已建立連接)狀態(tài)。
簡(jiǎn)單來(lái)說(shuō),就是1. 建立連接時(shí),客戶(hù)端發(fā)送SYN包(SYN=i)到服務(wù)器,并進(jìn)入到SYN-SEND狀態(tài),等待服務(wù)器確認2. 服務(wù)器收到SYN包,必須確認客戶(hù)的SYN(ack=i+1),同時(shí)自己也發(fā)送一個(gè)SYN包(SYN=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN-RECV狀態(tài)3. 客戶(hù)端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認報ACK(ack=k+1),此包發(fā)送完畢,客戶(hù)端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手
在此穿插一個(gè)知識點(diǎn)就是SYN攻擊,那么什么是SYN攻擊?發(fā)生的條件是什么?怎么避免?在三次握手過(guò)程中,Server發(fā)送SYN-ACK之后,收到Client的ACK之前的TCP連接稱(chēng)為半連接(half-open connect),此時(shí)Server處于SYN_RCVD狀態(tài),當收到ACK后,Server轉入ESTABLISHED狀態(tài)。SYN攻擊就是 Client在短時(shí)間內偽造大量不存在的IP地址,并向Server不斷地發(fā)送SYN包,Server回復確認包,并等待Client的確認,由于源地址 是不存在的,因此,Server需要不斷重發(fā)直至超時(shí),這些偽造的SYN包將產(chǎn)時(shí)間占用未連接隊列,導致正常的SYN請求因為隊列滿(mǎn)而被丟棄,從而引起網(wǎng) 絡(luò )堵塞甚至系統癱瘓。SYN攻擊時(shí)一種典型的DDOS攻擊,檢測SYN攻擊的方式非常簡(jiǎn)單,即當Server上有大量半連接狀態(tài)且源IP地址是隨機的,則可以斷定遭到SYN攻擊了,使用如下命令可以讓之現行:#netstat -nap | grep SYN_RECV
四次分手的過(guò)程(客戶(hù)端我們用A表示,服務(wù)器端用B表示)
由于TCP連接時(shí)是全雙工的,因此每個(gè)方向都必須單獨進(jìn)行關(guān)閉。這一原則是當一方完成數據發(fā)送任務(wù)后,發(fā)送一個(gè)FIN來(lái)終止這一方向的鏈接。收到一個(gè)FIN只是意味著(zhù)這一方向上沒(méi)有數據流動(dòng),既不會(huì )在收到數據,但是在這個(gè)TCP連接上仍然能夠發(fā)送數據,知道這一方向也發(fā)送了FIN,首先進(jìn)行關(guān)閉的一方將執行主動(dòng)關(guān)閉,而另一方則執行被動(dòng)關(guān)閉。
前提:A主動(dòng)關(guān)閉,B被動(dòng)關(guān)閉
有人可能會(huì )問(wèn),為什么連接的時(shí)候是三次握手,而斷開(kāi)連接的時(shí)候需要四次揮手?這是因為服務(wù)端在LISTEN狀態(tài)下,收到建立連接請求的SYN報文后,把ACK和SYN放在一個(gè)報文里發(fā)送給客戶(hù)端。而關(guān)閉連接時(shí),當收到對方的FIN 報文時(shí),僅僅表示對方不再發(fā)送數據了但是還能接收數據,己方也未必全部數據都發(fā)送給對方了,所以己方可以立即close,也可以發(fā)送一些數據給對方后,再 發(fā)送FIN報文給對方來(lái)表示同意現在關(guān)閉連接,因此,己方ACK和FIN一般都會(huì )分開(kāi)發(fā)送。
A發(fā)送一個(gè)FIN,用來(lái)關(guān)閉A到B的數據傳送,A進(jìn)入FIN_WAIT_1狀態(tài)。 B收到FIN后,發(fā)送一個(gè)ACK給A,確認序號為收到序號+1(與SYN相同,一個(gè)FIN占用一個(gè)序號),B進(jìn)入CLOSE_WAIT狀態(tài)。 B發(fā)送一個(gè)FIN,用來(lái)關(guān)閉B到A的數據傳送,B進(jìn)入LAST_ACK狀態(tài)。 A收到FIN后,A進(jìn)入TIME_WAIT狀態(tài),接著(zhù)發(fā)送一個(gè)ACK給B,確認序號為收到序號+1,B進(jìn)入CLOSED狀態(tài),完成四次揮手。
簡(jiǎn)單來(lái)說(shuō)就是1. 客戶(hù)端A發(fā)送一個(gè)FIN,用來(lái)關(guān)閉客戶(hù)A到服務(wù)器B的數據傳送(報文段4)。2. 服務(wù)器B收到這個(gè)FIN,它發(fā)回一個(gè)ACK,確認序號為收到的序號加1(報文段5)。和SYN一樣,一個(gè)FIN將占用一個(gè)序號。3. 服務(wù)器B關(guān)閉與客戶(hù)端A的連接,發(fā)送一個(gè)FIN給客戶(hù)端A(報文段6)。4. 客戶(hù)端A發(fā)回ACK報文確認,并將確認序號設置為收到序號加1(報文段7)。
A在進(jìn)入到TIME-WAIT狀態(tài)后,并不會(huì )馬上釋放TCP,必須經(jīng)過(guò)時(shí)間等待計時(shí)器設置的時(shí)間2MSL(最長(cháng)報文段壽命),A才進(jìn)入到CLOSED狀態(tài)。為什么?為了保證A發(fā)送的最后一個(gè)ACK報文段能夠到達B防止“已失效的連接請求報文段”出現在本連接中
OK~是不是很難懂的感覺(jué)?那我們來(lái)說(shuō)的“人性化點(diǎn)的”吧
三次握手流程1. 客戶(hù)端發(fā)個(gè)請求“開(kāi)門(mén)吶,我要進(jìn)來(lái)”給服務(wù)器2. 服務(wù)器發(fā)個(gè)“進(jìn)來(lái)吧,我去給你開(kāi)門(mén)”給客戶(hù)端3. 客戶(hù)端有很客氣的發(fā)個(gè)“謝謝,我要進(jìn)來(lái)了”給服務(wù)器
四次揮手流程1. 客戶(hù)端發(fā)個(gè)“時(shí)間不早了,我要走了”給服務(wù)器,等服務(wù)器起身送他2. 服務(wù)器聽(tīng)到了,發(fā)個(gè)“我知道了,那我送你出門(mén)吧”給客戶(hù)端,等客戶(hù)端走3. 服務(wù)器把門(mén)關(guān)上后,發(fā)個(gè)“我關(guān)門(mén)了”給客戶(hù)端,然后等客戶(hù)端走(尼瑪~矯情。4. 客戶(hù)端發(fā)個(gè)“我知道了,我走了”,之后自己就走了