前方高能!!!html
因爲協議自己比較枯燥,本篇文章原理概述內容可能會比較多,若是感到不適請繞行(〃'▽'〃)TCP/IP是Internet最基本的協議、Internet國際互聯網絡的基礎,由網絡層的IP協議和傳輸層的TCP協議組成。程序員
TCP/IP 定義了電子設備如何連入因特網,以及數據如何在它們之間傳輸的標準。協議採用了4層的層級結構,每一層都呼叫它的下一層所提供的協議來完成本身的需求。編程
通俗而言:TCP負責發現傳輸的問題,一有問題就發出信號,要求從新傳輸,直到全部數據安全正確地傳輸到目的地。而IP是給因特網的每一臺聯網設備規定一個地址。瀏覽器
TCP/IP協議不是單純的兩個協議,是一組不一樣層次上的多個協議的組合,常稱爲TCP/IP協議簇或者互聯網協議簇。緩存
TCP/IP層次組合很難用OSI的七層模型來套用,它是OSI模型的濃縮,將原來的七層模型合併爲四層協議的體系結構,自頂向下分別是應用層、傳輸層、網絡層和網絡接口層,沒有OSI參考模型的會話層和表示層,通常認爲TCP/IP的會話和表示功能是在傳輸層或應用層上完成的。安全
下面的圖表試圖顯示不一樣的TCP/IP和其餘的協議在最初OSI模型中的位置:服務器
層數 | 名稱 | 舉例 |
---|---|---|
7 | 應用層 | HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP |
6 | 表示層 | XDR、ASN.一、SMB、AFP、NCP |
5 | 會話層 | ASAP、TLS、SSH、ISO 8327 / CCITT X.22五、RPC、NetBIOS、ASP、Winsock、BSD sockets |
4 | 傳輸層 | TCP、UDP、RTP、SCTP、SPX、ATP、IL |
3 | 網絡層 | IP、ICMP、IGMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、 X.25 |
2 | 數據鏈路層 | 以太網、令牌環、HDLC、幀中繼、ISDN、ATM、IEEE 802.十一、FDDI、PPP |
1 | 物理層 | 線路、無線電、光纖、信鴿 |
TCP/IP不是一個單獨的協議,而是一個協議簇,是一組不一樣層次上的多個協議的組合。上面給出了OSI與TCP/IP模型對比、TCP/IP不一樣層次的協議。網絡
嚴格來說,分層模型的動機就是將各層的功能儘可能獨立,每層的功能對另外一層來講是透明的,只對通訊的另外一端負責,爲編程和診斷提供良好的層次隔離,然而實際狀況並不是如此,首先軟件編程上徹底按照分層模型來作編程效率會下降,與其分層,不如按功能實現來模塊化。其次,對於許多功能實現來講,必須實現兩層子間的交互,這又違背了當初的出發點,好比鏈路層在成幀時須要接收端的物理地址,該地址必須由網絡層處理ARP地址解析才行,簡單地將ARP放在那一層都有些牽強。因此說,分層模型對於理解網絡的抽象性是有益處的,它有助於指導網絡入門,但並非網絡的精髓,只有結合具體的系統分析纔有實際意義。併發
TCP是面向鏈接的傳輸層協議,所謂面向鏈接就是在真正的數據傳輸開始前要完成鏈接創建的過程,不然不會進入真正的數據傳輸階段。app
TCP的鏈接創建過程一般被稱爲三次握手(three-way handshake),過程以下:
斷開鏈接:一個TCP鏈接是全雙工(即數據在兩個方向上能同時傳遞),所以每一個方向必須單獨進行關閉。當一方完成它的數據發送任務後就發送一個FIN來終止這個方向鏈接。當一端收到一個FIN,它必須通知應用層另外一端已經終止了那個方向的數據傳送。因此TCP終止鏈接的過程須要四個過程,稱之爲四次握手過程。
HTTP協議即超文本傳送協議(Hypertext Transfer Protocol ),是Web聯網的基礎,也是手機聯網經常使用的協議之一,HTTP協議是創建在TCP協議之上的一種應用。
HTTP鏈接最顯著的特色是客戶端發送的每次請求都須要服務器回送響應,在請求結束後,會主動釋放鏈接。從創建鏈接到關閉鏈接的過程稱爲「一次鏈接」。
http請求由三部分組成,分別是:請求行、消息報頭、請求正文
一、請求行以一個方法符號開頭,以空格分開,後面跟着請求的URI和協議的版本,格式以下:
Method Request-URI HTTP-Version CRLF
請求方法(全部方法全爲大寫)有多種:
應用舉例:
GET方法:在瀏覽器的地址欄中輸入網址的方式訪問網頁時,瀏覽器採用GET方法向服務器獲取資源
eg:GET /form.html HTTP/1.1 (CRLF)
POST方法要求被請求服務器接受附在請求後面的數據,經常使用於提交表單。
eg:POST /reg.jsp HTTP/ (CRLF)
Accept:image/gif,image/x-xbit,... (CRLF)
...
HOST:www.guet.edu.cn (CRLF)
Content-Length:22 (CRLF)
Connection:Keep-Alive (CRLF)
Cache-Control:no-cache (CRLF)
(CRLF) //該CRLF表示消息報頭已經結束,在此以前爲消息報頭
user=jeffrey&pwd=1234 //此行如下爲提交的數據
HEAD方法與GET方法幾乎是同樣的,對於HEAD請求的迴應部分來講,它的HTTP頭部中包含的信息與經過GET請求所獲得的信息是相同的。利用這個方法,沒必要傳輸整個資源內容,就能夠獲得Request-URI所標識的資源的信息。該方法經常使用於測試超連接的有效性,是否能夠訪問,以及最近是否更新。
在接收和解釋請求消息後,服務器返回一個HTTP響應消息。
HTTP響應也是由三個部分組成,分別是:狀態行、消息報頭、響應正文
一、狀態行格式以下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服務器HTTP協議的版本;Status-Code表示服務器發回的響應狀態代碼;Reason-Phrase表示狀態代碼的文本描述。
狀態代碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值:
1xx:指示信息--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進行更進一步的操做
4xx:客戶端錯誤--請求有語法錯誤或請求沒法實現
5xx:服務器端錯誤--服務器未能實現合法的請求
常見狀態代碼、狀態描述、說明:
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized //請求未經受權,這個狀態代碼必須和WWW-Authenticate報頭域一塊兒使用
403 Forbidden //服務器收到請求,可是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常
eg:HTTP/1.1 200 OK (CRLF)
HTTP消息由客戶端到服務器的請求和服務器到客戶端的響應組成。請求消息和響應消息都是由開始行(對於請求消息,開始行就是請求行,對於響應消息,開始行就是狀態行),消息報頭(可選),空行(只有CRLF的行),消息正文(可選)組成。
HTTP消息報頭包括普通報頭
、請求報頭
、響應報頭
、實體報頭
。 每個報頭域都是由名字+「:」+空格+值 組成,消息報頭域的名字是大小寫無關的。
在普通報頭中,有少數報頭域用於全部的請求和響應消息,但並不用於被傳輸的實體,只用於傳輸的消息。
eg:
eg:爲了指示IE瀏覽器(客戶端)不要緩存頁面,服務器端的JSP程序能夠編寫以下:
response.sehHeader("Cache-Control","no-cache");
//response.setHeader("Pragma","no-cache");//做用至關於上述代碼,一般二者合用
這句代碼將在發送的響應消息中設置普通報頭域:Cache-Control:no-cache
請求報頭容許客戶端向服務器端傳遞請求的附加信息以及客戶端自身的信息。
Accept
Accept請求報頭域用於指定客戶端接受哪些類型的信息。
eg:Accept:image/gif,代表客戶端但願接受GIF圖象格式的資源;
Accept:text/html,代表客戶端但願接受html文本。
Accept-Charset
Accept-Encoding
Accept-Language
Authorization
Host(發送請求時,該報頭域是必需的)
咱們在瀏覽器中輸入:http://www.guet.edu.cn/index.html 瀏覽器發送的請求消息中,就會包含Host請求報頭域: Host:www.guet.edu.cn 此處使用缺省端口號80,若指定了端口號,則變成:Host:www.guet.edu.cn:指定端口號
User-Agent
咱們上網登錄論壇的時候,每每會看到一些歡迎信息,其中列出了你的操做系統的名稱和版本,你所使用的瀏覽器的名稱和版本,這每每讓不少人感到很神奇,實際上,服務器應用程序就是從User-Agent這個請求報頭域中獲取到這些信息。User-Agent請求報頭域容許客戶端將它的操做系統、瀏覽器和其它屬性告訴服務器。不過,這個報頭域不是必需的,若是咱們本身編寫一個瀏覽器,不使用User-Agent請求報頭域,那麼服務器端就沒法得知咱們的信息了。請求報頭舉例:
響應報頭容許服務器傳遞不能放在狀態行中的附加響應信息,以及關於服務器的信息和對Request-URI所標識的資源進行下一步訪問的信息。
Location
Server
請求和響應消息均可以傳送一個實體。一個實體由實體報頭域和實體正文組成,但並非說實體報頭域和實體正文要在一塊兒發送,能夠只發送實體報頭域。實體報頭定義了關於實體正文(eg:有無實體正文)和請求所標識的資源的元信息。
Content-Encoding實體報頭域被用做媒體類型的修飾符,它的值指示了已經被應用到實體正文的附加內容的編碼,於是要得到Content-Type報頭域中所引用的媒體類型,必須採用相應的解碼機制。Content-Encoding這樣用於記錄文檔的壓縮方法,eg:Content-Encoding:gzip
Content-Language實體報頭域描述了資源所用的天然語言。沒有設置該域則認爲實體內容將提供給全部的語言閱讀 者。eg:Content-Language:da
Content-Length實體報頭域用於指明實體正文的長度,以字節方式存儲的十進制數字來表示。
Content-Type實體報頭域用語指明發送給接收者的實體正文的媒體類型。
eg:Content-Type:text/html;charset=ISO-8859-1
Content-Type:text/html;charset=GB2312
Last-Modified實體報頭域用於指示資源的最後修改日期和時間。
Expires實體報頭域給出響應過時的日期和時間。爲了讓代理服務器或瀏覽器在一段時間之後更新緩存中(再次訪問曾訪問過的頁面時,直接從緩存中加載,縮短響應時間和下降服務器負載)的頁面,咱們可使用Expires實體報頭域指定頁面過時的時間。
eg:Expires:Thu,15 Sep 2006 16:23:12 GMT
網絡上的兩個程序經過一個雙向的通訊鏈接實現數據的交換,這個鏈接的一端稱爲一個socket。
創建網絡通訊鏈接至少要一對端口號(socket)。socket本質是編程接口(API),對TCP/IP的封裝,TCP/IP也要提供可供程序員作網絡開發所用的接口,這就是Socket編程接口;HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網絡通訊的能力。
套接字(socket)是通訊的基石,是支持TCP/IP協議的網絡通訊的基本操做單元。它是網絡通訊過程當中端點的抽象表示,包含進行網絡通訊必須的五種信息:鏈接使用的協議,本地主機的IP地址,本地進程的協議端口,遠地主機的IP地址,遠地進程的協議端口。
應用層經過傳輸層進行數據通訊時,TCP會遇到同時爲多個應用程序進程提供併發服務的問題。多個TCP鏈接或多個應用程序進程可能須要經過同一個 TCP協議端口傳輸數據。爲了區別不一樣的應用程序進程和鏈接,許多計算機操做系統爲應用程序與TCP/IP協議交互提供了套接字(Socket)接口。應 用層能夠和傳輸層經過Socket接口,區分來自不一樣應用程序進程或網絡鏈接的通訊,實現數據傳輸的併發服務。
創建Socket鏈接至少須要一對套接字,其中一個運行於客戶端,稱爲ClientSocket ,另外一個運行於服務器端,稱爲ServerSocket 。
套接字之間的鏈接過程分爲三個步驟:服務器監聽,客戶端請求,鏈接確認。
服務器監聽:服務器端套接字並不定位具體的客戶端套接字,而是處於等待鏈接的狀態,實時監控網絡狀態,等待客戶端的鏈接請求。
客戶端請求:指客戶端的套接字提出鏈接請求,要鏈接的目標是服務器端的套接字。爲此,客戶端的套接字必須首先描述它要鏈接的服務器的套接字,指出服務器端套接字的地址和端口號,而後就向服務器端套接字提出鏈接請求。
鏈接確認:當服務器端套接字監聽到或者說接收到客戶端套接字的鏈接請求時,就響應客戶端套接字的請求,創建一個新的線程,把服務器端套接字的描 述發給客戶端,一旦客戶端確認了此描述,雙方就正式創建鏈接。而服務器端套接字繼續處於監聽狀態,繼續接收其餘客戶端套接字的鏈接請求。