天天看點

TCP/IP,Http,Socket,XMPP的差別

轉載自:http://blog.csdn.net/skyboy11yk/article/details/24304461

網絡由下往上分為

  實體層、資料鍊路層、網絡層、傳輸層、會話層、表示層和應用層。

  通過初步的了解,我知道IP協定對應于網絡層,TCP協定對應于傳輸層,而HTTP協定對應于應用層,

  三者從本質上來說沒有可比性,

  socket則是對TCP/IP協定的封裝和應用(程式員層面上)。

  也可以說,TPC/IP協定是傳輸層協定,主要解決資料如何在網絡中傳輸,

  而HTTP是應用層協定,主要解決如何包裝資料。

  關于TCP/IP和HTTP協定的關系,網絡有一段比較容易了解的介紹:

  “我們在傳輸資料時,可以隻使用(傳輸層)TCP/IP協定,但是那樣的話,如果沒有應用層,便無法識别資料内容。

  如果想要使傳輸的資料有意義,則必須使用到應用層協定。

  應用層協定有很多,比如HTTP、FTP、TELNET等,也可以自己定義應用層協定。

  WEB使用HTTP協定作應用層協定,以封裝HTTP文本資訊,然後使用TCP/IP做傳輸層協定将它發到網絡上。”

  而我們平時說的最多的socket是什麼呢,實際上socket是對TCP/IP協定的封裝,Socket本身并不是協定,而是一個調用接口(API)。

  通過Socket,我們才能使用TCP/IP協定。

  實際上,Socket跟TCP/IP協定沒有必然的聯系。

  Socket程式設計接口在設計的時候,就希望也能适應其他的網絡協定。

  是以說,Socket的出現隻是使得程式員更友善地使用TCP/IP協定棧而已,是對TCP/IP協定的抽象,

  進而形成了我們知道的一些最基本的函數接口,比如create、listen、connect、accept、send、read和write等等。

  網絡有一段關于socket和TCP/IP協定關系的說法比較容易了解:

  “TCP/IP隻是一個協定棧,就像作業系統的運作機制一樣,必須要具體實作,同時還要提供對外的操作接口。

  這個就像作業系統會提供标準的程式設計接口,比如win32程式設計接口一樣,

  TCP/IP也要提供可供程式員做網絡開發所用的接口,這就是Socket程式設計接口。”

  關于TCP/IP協定的相關隻是,用博大精深來講我想也不為過,單單查一下網上關于此類隻是的資料和書籍文獻的數量就知道,

  這個我打算會買一些經典的書籍(比如《TCP/IP詳解:卷一、卷二、卷三》)進行學習,今天就先總結一些基于基于TCP/IP協定的應用和程式設計接口的知識,也就是剛才說了很多的HTTP和Socket。

  CSDN上有個比較形象的描述:HTTP是轎車,提供了封裝或者顯示資料的具體形式;Socket是發動機,提供了網絡通信的能力。

  實際上,傳輸層的TCP是基于網絡層的IP協定的,而應用層的HTTP協定又是基于傳輸層的TCP協定的,而Socket本身不算是協定,就像上面所說,它隻是提供了一個針對TCP或者UDP程式設計的接口。

  下面是一些經常在筆試或者面試中碰到的重要的概念,特在此做摘抄和總結。

  一、什麼是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狀态,完成三次握手。

  握手過程中傳送的包裡不包含資料,三次握手完畢後,用戶端與伺服器才正式開始傳送資料。

  理想狀态下,TCP連接配接一旦建立,在通信雙方中的任何一方主動關閉連接配接之前,TCP 連接配接都将被一直保持下去。

  斷開連接配接時伺服器和用戶端均可以主動發起斷開TCP連接配接的請求,斷開過程需要經過“四次握手”(過程就不細寫了,就是伺服器和用戶端互動,最終确定斷開)

  二、利用Socket建立網絡連接配接的步驟

  建立Socket連接配接至少需要一對套接字,其中一個運作于用戶端,稱為ClientSocket ,另一個運作于伺服器端,稱為ServerSocket 。

  套接字之間的連接配接過程分為三個步驟:伺服器監聽,用戶端請求,連接配接确認。

  1、伺服器監聽:伺服器端套接字并不定位具體的用戶端套接字,而是處于等待連接配接的狀态,實時監控網絡狀态,等待用戶端的連接配接請求。

  2、用戶端請求:指用戶端的套接字提出連接配接請求,要連接配接的目标是伺服器端的套接字。

  為此,用戶端的套接字必須首先描述它要連接配接的伺服器的套接字,指出伺服器端套接字的位址和端口号,然後就向伺服器端套接字提出連接配接請求。

  3、連接配接确認:當伺服器端套接字監聽到或者說接收到用戶端套接字的連接配接請求時,就響應用戶端套接字的請求,建立一個新的線程,把伺服器端套接字的描述發給用戶端,一旦用戶端确認了此描述,雙方就正式建立連接配接。

  而伺服器端套接字繼續處于監聽狀态,繼續接收其他用戶端套接字的連接配接請求。

  三、HTTP連結的特點

  HTTP協定即超文本傳送協定(Hypertext Transfer Protocol ),是Web聯網的基礎,也是手機聯網常用的協定之一,HTTP協定是建立在TCP協定之上的一種應用。

  HTTP連接配接最顯著的特點是用戶端發送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放連接配接。從建立連接配接到關閉連接配接的過程稱為“一次連接配接”。

  四、TCP和UDP的差別(考得最多。。快被考爛了我覺得- -\\)

  1、TCP是面向連結的,雖然說網絡的不安全不穩定特性決定了多少次握手都不能保證連接配接的可靠性,但TCP的三次握手在最低限度上(實際上也很大程度上保證了)保證了連接配接的可靠性;

  而UDP不是面向連接配接的,UDP傳送資料前并不與對方建立連接配接,對接收到的資料也不發送确認信号,發送端不知道資料是否會正确接收,當然也不用重發,是以說UDP是無連接配接的、不可靠的一種資料傳輸協定。

  2、也正由于1所說的特點,使得UDP的開銷更小資料傳輸速率更高,因為不必進行收發資料的确認,是以UDP的實時性更好。

  知道了TCP和UDP的差別,就不難了解為何采用TCP傳輸協定的MSN比采用UDP的QQ傳輸檔案慢了,但并不能說QQ的通信是不安全的,

  因為程式員可以手動對UDP的資料收發進行驗證,比如發送方對每個資料包進行編号然後由接收方進行驗證啊什麼的,

  即使是這樣,UDP因為在底層協定的封裝上沒有采用類似TCP的“三次握手”而實作了TCP所無法達到的傳輸效率。

1、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狀态,完成三次握手。

握手過程中傳送的包裡不包含資料,三次握手完畢後,用戶端與伺服器才正式開始傳送資料。理想狀态下,TCP連接配接一旦建立,在通信雙方中的任何一方主動關閉連接配接之前,TCP 連接配接都将被一直保持下去。斷開連接配接時伺服器和用戶端均可以主動發起斷開TCP連接配接的請求,斷開過程需要經過“四次握手”(過程就不細寫了,就是伺服器和用戶端互動,最終确定斷開)

2、HTTP連接配接

HTTP協定即超文本傳送協定(Hypertext Transfer Protocol ),是Web聯網的基礎,也是手機聯網常用的協定之一,HTTP協定是建立在TCP協定之上的一種應用。

HTTP連接配接最顯著的特點是用戶端發送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放連接配接。從建立連接配接到關閉連接配接的過程稱為“一次連接配接”。

1)在HTTP 1.0中,用戶端的每次請求都要求建立一次單獨的連接配接,在處理完本次請求後,就自動釋放連接配接。

2)在HTTP 1.1中則可以在一次連接配接中處理多個請求,并且多個請求可以重疊進行,不需要等待一個請求結束後再發送下一個請求。

由于HTTP在每次請求結束後都會主動釋放連接配接,是以HTTP連接配接是一種“短連接配接”,要保持用戶端程式的線上狀态,需要不斷地向伺服器發起連接配接請求。通常的做法是即時不需要獲得任何資料,用戶端也保持每隔一段固定的時間向伺服器發送一次“保持連接配接”的請求,伺服器在收到該請求後對用戶端進行回複,表明知道用戶端“線上”。若伺服器長時間無法收到用戶端的請求,則認為用戶端“下線”,若用戶端長時間無法收到伺服器的回複,則認為網絡已經斷開。

3、SOCKET原理

3.1套接字(socket)概念

套接字(socket)是通信的基石,是支援TCP/IP協定的網絡通信的基本操作單元。它是網絡通信過程中端點的抽象表示,包含進行網絡通信必須的五種資訊:連接配接使用的協定,本地主機的IP位址,本地程序的協定端口,遠地主機的IP位址,遠地程序的協定端口。

應用層通過傳輸層進行資料通信時,TCP會遇到同時為多個應用程式程序提供并發服務的問題。多個TCP連接配接或多個應用程式程序可能需要通過同一個 TCP協定端口傳輸資料。為了差別不同的應用程式程序和連接配接,許多計算機作業系統為應用程式與TCP/IP協定互動提供了套接字(Socket)接口。應用層可以和傳輸層通過Socket接口,區分來自不同應用程式程序或網絡連接配接的通信,實作資料傳輸的并發服務。

3.2 建立socket連接配接

建立Socket連接配接至少需要一對套接字,其中一個運作于用戶端,稱為ClientSocket ,另一個運作于伺服器端,稱為ServerSocket 。

套接字之間的連接配接過程分為三個步驟:伺服器監聽,用戶端請求,連接配接确認。

伺服器監聽:伺服器端套接字并不定位具體的用戶端套接字,而是處于等待連接配接的狀态,實時監控網絡狀态,等待用戶端的連接配接請求。

用戶端請求:指用戶端的套接字提出連接配接請求,要連接配接的目标是伺服器端的套接字。為此,用戶端的套接字必須首先描述它要連接配接的伺服器的套接字,指出伺服器端套接字的位址和端口号,然後就向伺服器端套接字提出連接配接請求。

連接配接确認:當伺服器端套接字監聽到或者說接收到用戶端套接字的連接配接請求時,就響應用戶端套接字的請求,建立一個新的線程,把伺服器端套接字的描述發給用戶端,一旦用戶端确認了此描述,雙方就正式建立連接配接。而伺服器端套接字繼續處于監聽狀态,繼續接收其他用戶端套接字的連接配接請求。

4、SOCKET連接配接與TCP連接配接

建立Socket連接配接時,可以指定使用的傳輸層協定,Socket可以支援不同的傳輸層協定(TCP或UDP),當使用TCP協定進行連接配接時,該Socket連接配接就是一個TCP連接配接。

5、Socket連接配接與HTTP連接配接

由于通常情況下Socket連接配接就是TCP連接配接,是以Socket連接配接一旦建立,通信雙方即可開始互相發送資料内容,直到雙方連接配接斷開。但在實際網絡應用中,用戶端到伺服器之間的通信往往需要穿越多個中間節點,例如路由器、網關、防火牆等,大部分防火牆預設會關閉長時間處于非活躍狀态的連接配接而導緻 Socket 連接配接斷連,是以需要通過輪詢告訴網絡,該連接配接處于活躍狀态。

而HTTP連接配接使用的是“請求—響應”的方式,不僅在請求時需要先建立連接配接,而且需要用戶端向伺服器送出請求後,伺服器端才能回複資料。

很多情況下,需要伺服器端主動向用戶端推送資料,保持用戶端與伺服器資料的實時與同步。此時若雙方建立的是Socket連接配接,伺服器就可以直接将資料傳送給用戶端;若雙方建立的是HTTP連接配接,則伺服器需要等到用戶端發送一次請求後才能将資料傳回給用戶端,是以,用戶端定時向伺服器端發送連接配接請求,不僅可以保持線上,同時也是在“詢問”伺服器是否有新的資料,如果有就将資料傳給用戶端。