http的七層協議
socket(套接字)是通訊的基石,是支援TCP/IP協議的網路通訊的基本操作單元,包含進行網路通訊必須的五種資訊:連線使用的協議,本地主機的IP地址,本地程序的協議埠,遠地主機的IP地址,遠地程序的協議埠。
多個TCP連線或多個應用程式程序可能需要通過同一個TCP協議埠傳輸資料。為了區別不同的應用程式程序和連線,計算機作業系統為應用程式與TCP/IP協議互動提供了套接字(Socket)介面。應用層可以和傳輸層通過Socket介面,區分來自不同應用程式程序或網路連線的通訊,實現資料傳輸的併發服務。
建立Socket連線至少需要一對套接字,其中一個運行於客戶端,稱為ClientSocket,另一個運行於伺服器端,稱為ServerSocket。套接字之間的連線過程分為三個步驟:伺服器監聽,客戶端請求,連線確認。
Socket可以支援不同的傳輸層協議(TCP或UDP),當使用TCP協議進行連線時,該Socket連線就是一個TCP連線,UDP連線同理。
網路七層協議
網路七層協議由下往上分別為物理層、資料鏈路層、網路層、傳輸層、會話層、表示層和應用層。其中物理層、資料鏈路層和網路層通常被稱作媒體層,是網路工程師所研究的物件;傳輸層、會話層、表示層和應用層則被稱作主機層,是使用者所面向和關心的內容。
HTTP協議對應於應用層,TCP協議對應於傳輸層,IP協議對應於網路層,HTTP協議是基於TCP連線的,三者本質上沒有可比性。 TCP/IP是傳輸層協議,主要解決資料如何在網路中傳輸;而HTTP是應用層協議,主要解決如何包裝資料。Socket是應用層與TCP/IP協議族通訊的中間軟體抽象層,是它的一組介面。
網路七層協議
TCP/IP五層模型
TCP/IP五層模型的協議分為:應用層、傳輸層、網路層、資料鏈路層和物理層。中繼器、集線器、還有我們通常說的雙絞線也工作在物理層;網橋(現已很少使用)、乙太網交換機(二層交換機)、網絡卡(其實網絡卡是一半工作在物理層、一半工作在資料鏈路層)在資料鏈路層;路由器、三層交換機在網路層;傳輸層主要是四層交換機、也有工作在四層的路由器。
TCP/IP協議中的應用層處理七層模型中的第五層、第六層和第七層的功能。TCP/IP協議中的傳輸層並不能總是保證在傳輸層可靠地傳輸資料包,而七層模型可以做到。TCP/IP協議還提供一項名為UDP(使用者資料報協議)的選擇。UDP不能保證可靠的資料包傳輸。
對應關係
-
TCP:面向連線、傳輸可靠(保證資料正確性,保證資料順序)、用於傳輸大量資料(流模式)、速度慢,建立連線需要開銷較多(時間,系統資源)。
-
UDP:面向非連線、傳輸不可靠、用於傳輸少量資料(資料包模式)、速度快。
TCP是一種流模式的協議,UDP是一種資料報模式的協議。
在傳輸資料時,可以只使用傳輸層(TCP/IP),但是那樣的話,由於沒有應用層,便無法識別資料內容,如果想要使傳輸的資料有意義,則必須使用應用層協議(HTTP、FTP、TELNET等),也可以自己定義應用層協議。
WEB使用HTTP作傳輸層協議,以封裝HTTP文字資訊,然後使用TCP/IP做傳輸層協議將它傳送到網路上。Socket是對TCP/IP協議的封裝,Socket本身並不是協議,而是一個呼叫介面(API),通過Socket,我們才能使用TCP/IP協議。
Socket的位置
TCP連線
要想明白Socket連線,先要明白TCP連線。手機能夠使用聯網功能是因為手機底層實現了TCP/IP協議,可以使手機終端通過無線網路建立TCP連線。TCP協議可以對上層網路提供介面,使上層網路資料的傳輸建立在“無差別”的網路之上。
建立起一個TCP連線需要經過“三次握手”:
第一次握手:客戶端傳送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也傳送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。
三次握手(Three-way Handshake)即建立一個TCP連線時,需要客戶端和伺服器總共傳送3個包。三次握手的目的是連線伺服器指定埠,建立TCP連線,並同步連線雙方的序列號和確認號並交換TCP 視窗大小資訊。在socket程式設計中,客戶端執行connect()時,將觸發三次握手。
三次握手
握手過程中傳送的包裡不包含資料,三次握手完畢後,客戶端與伺服器才正式開始傳送資料。理想狀態下,TCP連線一旦建立,在通訊雙方中的任何一方主動關閉連線之前,TCP 連線都將被一直保持下去。斷開連線時伺服器和客戶端均可以主動發起斷開TCP連線的請求,斷開過程需要經過“四次握手”。
TCP連線的拆除需要傳送四個包,因此稱為四次握手(four-way handshake)。在socket程式設計中,任何一方執行close()操作即可產生握手(有地方稱為“揮手”)操作。
TCP連線的拆除
之所以有“三次握手”和“四次握手”的區別,是因為連線時當Server端收到Client端的SYN連線請求報文後,可以直接傳送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連線時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,”你發的FIN報文我收到了”。只有等到我Server端所有的報文都發送完了,我才能傳送FIN報文,因此不能一起傳送。故需要四步握手。
HTTP連線
HTTP協議即超文字傳送協議(HypertextTransfer Protocol ),是Web聯網的基礎,也是手機聯網常用的協議之一,HTTP協議是建立在TCP協議之上的一種應用。
HTTP連線最顯著的特點是客戶端傳送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放連線。從建立連線到關閉連線的過程稱為“一次連線”。因此HTTP連線是一種“短連線”,要保持客戶端程式的線上狀態,需要不斷地向伺服器發起連線請求。若伺服器長時間無法收到客戶端的請求,則認為客戶端“下線”,若客戶端長時間無法收到伺服器的回覆,則認為網路已經斷開。在HTTP 1.0中,客戶端的每次請求都要求建立一次單獨的連線,在處理完本次請求後,就自動釋放連線。在HTTP 1.1中則可以在一次連線中處理多個請求,並且多個請求可以重疊進行,不需要等待一個請求結束後再發送下一個請求。
HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,是HTTP的安全版。 在HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。 HTTPS存在不同於HTTP的預設埠及一個加密/身份驗證層(在HTTP與TCP之間)。HTTP協議以明文方式傳送內容,不提供任何方式的資料加密,如果攻擊者截取了Web瀏覽器和網站伺服器之間的傳輸報文,就可以直接讀懂其中的資訊,因此HTTP協議不適合傳輸一些敏感資訊。
https協議需要到ca申請證書;http是超文字傳輸協議,資訊是明文傳輸,https 則是具有安全性的ssl加密傳輸協議;http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443;http的連線很簡單,是無狀態的,HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議。
HTTPS
Socket連線與HTTP連線的不同
通常情況下Socket連線就是TCP連線,因此Socket連線一旦建立,通訊雙方即可開始相互發送資料內容,直到雙方連線斷開。但在實際應用中,客戶端到伺服器之間的通訊防火牆預設會關閉長時間處於非活躍狀態的連線而導致 Socket 連線斷連,因此需要通過輪詢告訴網路,該連線處於活躍狀態。
而HTTP連線使用的是“請求—響應”的方式,不僅在請求時需要先建立連線,而且需要客戶端向伺服器發出請求後,伺服器端才能回覆資料。