網絡由下往上分爲物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層web
對應到TCP/IP 屬於網絡層 ,http則是到應用層。編程
一、TCP/IP鏈接
tcp/ip是在這三個中是最底層的鏈接協議,規定服務器和和客戶端通信規則 :須要通過「三次握手」(TCP鏈接)json
第一次握手:客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時本身也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。
握手過程當中傳送的包裏不包含數據,三次握手完畢後,客戶端與服務器才正式開始傳送數據。理想狀態下,TCP鏈接一旦創建,在通訊雙方中的任何一
方主動關閉鏈接以前,TCP
鏈接都將被一直保持下去。斷開鏈接時服務器和客戶端都可以主動發起斷開TCP鏈接的請求,斷開過程須要通過「四次握手」(過程就不細寫了,就是服務器和客
戶端交互,最終肯定斷開).
二、http鏈接
http: 超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最爲普遍的一種網絡協議 網絡協議服務器
能夠理解爲http鏈接是以http爲通訊協議的tcp鏈接,本省仍是一個tcp鏈接網絡
HTTP鏈接最顯著的特色是客戶端發送的每次請求都須要服務器回送響應,在請求結束後,會主動釋放鏈接。從創建鏈接到關閉鏈接的過程稱爲「一次鏈接」socket
順便說說長鏈接和短鏈接的問題(webSocket)tcp
tcp鏈接自己屬性是不分長短的,是根據使用方式來決定的,舉個例子:工具
有一把不會損壞的刀(tcp鏈接),你砍一我的(請求一次)就扔了(斷開鏈接)就叫一次性砍刀(短鏈接),砍多我的(請求屢次)扔了就叫屢次性砍刀(長鏈接),這把刀自己的屬性並不包含長短,只是根據使用方法產生了不一樣的叫法。性能
http協議:能夠理解爲 和 json 同樣,json只是傳輸中的數據的一種格式,將json數據放在http請求或者http響應的body,客戶端js 和 服務端 規定了數據格式(json),天然清楚知道雙方說的是什麼了。spa
三、Socket
socket 能夠理解爲編程開發人員(語言級別)可以在本身語言的工具庫包中操做網絡鏈接一個調用接口(API),其能夠是tcp協議實現,也能夠是UDP協議實現。
![](http://static.javashuo.com/static/loading.gif)
什麼狀況下用socket 和http
好比:視頻,圖片,斷點續傳的狀況下要用socket
http的協議的無狀態性實現不了這個功能。
http適用於常見的web業務系統,作比較複雜業務邏輯數據的傳輸(權限,以及其餘)。至於怎樣選擇,仍是從實際的業務邏輯,性能,等因素出發。