摘自:http://www.cnblogs.com/artech/p/restful-web-api-01.htmlhtml
TCP/IP是以IP和TCP協議爲核心的一整套網絡協議的總稱,因此有時候咱們也稱其爲TCP/IP協議簇。絕不誇張地說,TCP/IP支撐着整個互聯網,由於它就是互聯網採用的網絡協議。TCP/IP協議簇劃分爲如右圖所示的4個層次[2](應用層、傳輸層、網絡層和鏈路層),構成整個協議簇的各個子協議處於相應層次中。web
既然將整個協議簇命名爲TCP/IP,那麼IP和TCP天然就是其中最爲核心的兩個協議了。處於網絡層的IP協議提供的IP數據報傳輸是不可靠的,由於它只承諾儘量地將數據報發送出去,但不能保證發送的數據報可以成功地抵達目的地。IP協議的不可靠性還體如今它不能檢測數據在傳輸過程當中是否發生了改變,也就是說數據的完整性得不到保證。IP協議是一個無鏈接(Connectionless)的網絡協議,每次數據報的處理對它來講均是獨立的,所以IP協議也不能提供針對有序傳輸(數據接收的順序與發送的順序一致)的保證。api
雖然IP協議只能提供不可靠的數據傳輸,同時有序傳輸也得不到保證,可是創建在它之上的傳輸層協議TCP有效地解決了這兩個問題。TCP是一個基於鏈接的協議,數據交換雙方在進行報文傳輸以前須要創建鏈接,報文傳輸結束以後須要關閉鏈接。這是一個雙工(Duplex)鏈接,數據交換的雙工都可以利用它向對方發送數據。瀏覽器
TCP利用「接收確認」和「超時重傳」機制確保了數據可以成功抵達目的地。具體來講,接收方在成功接收到數據以後會回覆一個確認消息。發送方在本地具備一個存放還沒有獲得確認的已發消息的緩衝區,若是發送方在一個設定的時限內沒有接收到針對某個已發報文的確認消息,它會從該緩存區中選擇對應的報文進行從新發送。在接收到確認以後,相應的報文會從緩存區中移除。緩存
爲了解決有序傳輸的問題,發送方會爲每一個報文進行編號,報文的序號體現了它們被髮送的順序。接收端在接收到某個報文以後,它會利用此序號判斷是否具備還沒有成功接收的已發報文,若是有的話,該報文會被存放到本地的緩衝區中。等到以前發送的報文所有被接收以後,接收方按照序號對接收的報文依次向上(應用層)遞交,成功遞交的報文會被從緩存區中移除。除了接收到「失序」的報文以外,接收方還有可能接收到重複的報文,由於沒有報文均具備一個惟一的序號,若是該序號小於已經成功遞交或者添加到緩存區中的報文序號,它會被認爲是重複接收的報文而被丟棄。安全
因爲每一個TCP報文段都具備一個16位的檢驗和(Checksum),因此接收方能夠根據它確認數據在傳輸過程當中是否被篡改。除此以外,TCP還提供了「流量控制」功能避免了雙方因緩存區大小不一致而致使報文丟失。具體來講,若是發送方的緩衝區大於接收方的緩存區,會致使接收方在緩衝區已滿的狀況下沒法處理後續接收的報文,因此接收方會將本身緩存區剩餘的大小及時通知給發送端,後者據此控制報文發送「流量」。服務器
HTTP(Hypertext Transfer Protocol),全稱爲「超文本傳輸協議」,是TCP/IP協議簇的一部分。從圖1-1能夠看出,這是一個位於應用層的網絡協議,在它之下的就是TCP協議。因爲TCP協議是一個「可靠」的協議,HTTP天然也能提供可靠數據傳輸功能。restful
IP協議利用IP地址來定位數據報發送的目的地,而利用域名系統(DNS)能夠實現域名與IP地址之間的轉換。TCP協議利用端口號標識應用程序,因此某個應用程序在使用TCP協議進行通訊的時候必須指定目標應用的IP地址(或者域名)和端口號。HTTP默認採用的端口號爲80,而HTTPS(利用TLS/SSL爲HTTP提供傳輸安全保障)的默認端口號則爲443,固然在網絡可達的前提下,咱們能夠指定任意的端口。網絡
針對客戶端向Web服務器發送的任意一個HTTP請求,不論在何種狀況下獲得一個響應,每一個響應均具備一個由3位數字表示的狀態碼和相應的描述文字。不一樣數值的狀態碼體現了不一樣類型的響應狀態,W3C對響應狀態碼的範圍做了以下的規範。app
客戶端和Web服務器在一次HTTP事務中交換的消息被稱爲HTTP報頭,客戶端發送給服務器的請求消息被稱爲請求報文,服務器返回給客戶端的響應消息被稱爲響應報頭。請求報文和響應報頭採用純文本編碼,由一行行簡單的字符串組成。一個完整的HTTP報文由以下三個部分構成。
接下來咱們看看一個具體HTTP報文具備怎樣的結構。下面這個文本片斷反映的是咱們經過Chrome瀏覽器訪問微軟的官網(www.microsoft. com)對應的HTTP請求,起始行體現了HTTP請求的三個基本屬性,即HTTP方法(GET)、目標資源(http://www.microsoft.com/en-us/default.aspx)和協議版本(HTTP/1.1)。
1: GET http://www.microsoft.com/en-us/default.aspx HTTP/1.1
2: Host: www.microsoft.com
3: Connection: keep-alive
4: Cache-Control: max-age=0
5: User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.75 Safari/535.7
6: Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
7: Accept-Encoding: gzip,deflate,sdch
8: Accept-Language: en-US,en;q=0.8
9: Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
10: Cookie: ...
上述這個請求報文不具備主體,因此起始行以外的全部內容均爲報頭集合,咱們們能夠根據這些報頭得到主機名稱、採用的緩存策略、瀏覽器相關信息、以及客戶端支持的媒體類型(Media Type)、編碼方式、語言和字符集等。
前面的HTTP請求經過瀏覽器發送給服務端以後會接收到具備以下結構的響應報文,咱們能夠此從它的起始行獲得採用的HTTP版本(HTTP/1.1)和響應狀態碼(「200 OK」,表示請求被正常接收處理)。響應的內容被封裝到響應報文的主體部分,其媒體類型的經過報頭「Content-Type」表示。因爲該響應報文的主體內容是一個HTML文檔,因此「Content-Type」報頭表示的媒體類型爲「text/html」。
1: HTTP/1.1 200 OK
2: Cache-Control: no-cache
3: Pragma: no-cache
4: Content-Type: text/html; charset=utf-8
5: Content-Encoding: gzip
6: Expires: -1
7: Vary: Accept-Encoding
8: Server: Microsoft-IIS/7.5
9: X-AspNet-Version: 2.0.50727
10: VTag: 791897542300000000
11: P3P: CP="ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI"
12: X-Powered-By: ASP.NET
13: Date: Wed, 18 Jan 2012 07:06:25 GMT
14: Content-Length: 34237
15:
16: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
17: <html>…</html>
[1]超文本/超媒體(HyperText/HyperMedia):超文本是一份呈現文本內容的電子文檔,其核心在於能夠利用內嵌的「超連接(Hyperlink)」直接訪問引用的另外一份文檔。超媒體對超文本做了簡單的擴展以呈現多媒體內容(好比圖片、音頻和視頻等)。HTML文檔是咱們常見的最爲典型的超文本/超媒體文件。
[2] 除了採用這種4個層次的劃分方法以外,還具備另外兩種典型的劃分方式。其中一種在鏈路層下面添加一個基於物理網絡硬件的物理層,這種劃分方法與此沒有本質的區別。另一種則是將TCP/IP協議簇劃分爲包括應用層、表示層、會話層、傳輸層、網絡層、鏈路層和物理層在內的7個層次