天天看點

TCP/IP、UDP、HTTP、Socket詳解

原文:http://www.cnblogs.com/lavenderone/archive/2011/10/14/2212523.html

網絡由下往上分為: 對應

實體層

資料鍊路層

網絡層( 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協定的應用和程式設計接口的知識,也就是剛才說了很多的 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連接配接的請求,斷開過程需要經過“四次揮手”。

二、TCP斷開連接配接--四次揮手

TCP/IP、UDP、HTTP、Socket詳解

由于TCP連接配接是全雙工的,是以每個方向都必須單獨進行關閉。這個原則是當一方完成它的資料發送任務後就能發送一個FIN來終止這個方向的連接配接。收到一個 FIN隻意味着這一方向上沒有資料流動,一個TCP連接配接在收到一個FIN後仍能發送資料。首先進行關閉的一方将執行主動關閉,而另一方執行被動關閉。 (1)用戶端A發送一個FIN,用來關閉客戶A到伺服器B的 資料傳送(封包段4)。 (2)伺服器B收到這個FIN,它發回一個ACK,确認序号為收到的序号加1(封包段5)。和SYN一樣,一個FIN将占用一個序号。 (3)伺服器B關閉與用戶端A的連接配接,發送一個FIN給用戶端A(封包段6)。 (4)用戶端A發回ACK 封包确認,并将确認序号設定為收到序号加1( 封包段7)

TCP 采用四次揮手關閉連接配接如圖所示為什麼建立 連接配接協定是 三次握手,而關閉連接配接卻是四次握手呢? 這是因為服務端的LISTEN狀态下的SOCKET當收到SYN封包的建連請求後,它可以把ACK和SYN(ACK起應答作用,而SYN起同步作用)放在一個封包裡來發送。 但關閉連接配接時,當收到對方的FIN封包通知時,它僅僅表示對方沒有資料發送給你了;但未必你所有的資料都全部發送給對方了,是以你可以未必會馬上會關閉SOCKET,也即你可能還需要發送一些資料給對方之後,再發送FIN封包給對方來表示你同意現在可以關閉連接配接了,是以它這裡的ACK封包和FIN封包多數情況下都是分開發送的。

三。利用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所無法達到的傳輸效率。