TCP/IP、Http、Socket的區別?

計算機網路基礎


網路由下往上分為

  物理層、數據鏈路層、網路層、傳輸層、會話層、表示層和應用層。

  通過初步的了解,我知道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所無法達到的傳輸效率。


TCP/IP單說這個的話一般有三種意思,TCP/IP協議棧、TCP/IP模型或者是TCP/IP協議簇,而HTTP的話是基於TCP的應用層協議,位於TCP/IP模型(有的地方認為是四層模型有的地方認為是五層模型)最頂端應用層,這時候需要說明一點,我們需要知道TCP在網路OSI的七層模型中的第四層——傳輸層,IP在第三層——網路層,ARP在第二層——數據鏈路層,在第二層上的數據,我們叫Frame,在第三層上的數據叫Packet,第四層的數據叫Segment。嚴格意義上來說,HTTP是封裝在TCP Segment裡面的協議。這地方可以參考RFC相關的文檔。

對於Socket來說,面向網路的Sokcet其實就是主機IP地址+埠號,也就是xx.xx.xx.xx:xxxx就是一個Socket,Socket鏈接就是兩個Socket之間建立的鏈接。


-----------------------------------2017.12.26更新-------------------------------------

評論有位同學不太清楚http連接這個詞的具體含義,我第一眼看確實也說不太清楚,確實容易混淆,我嘗試解釋一下:

http連接=以http協議為通信協議的tcp連接

順便說說長連接和短連接的問題

tcp連接本身屬性是不分長短的,是根據使用方式來決定的,舉個例子:

有一把不會損壞的刀(tcp連接),你砍一個人(請求一次)就扔了(斷開連接)就叫一次性砍刀(短連接),砍多個人(請求多次)扔了就叫多次性砍刀(長連接),這把刀本身的屬性並不包含長短,只是根據使用方法產生了不同的叫法

總結:

http連接=以http協議為通信協議的tcp連接

http短連接=以http協議為通信協議的,請求一次就斷開的tcp連接

http長連接=以http協議為通信協議的,請求多次才斷開的tcp連接(這個是為了通過減少建立tcp連接的次數達到節省兩端資源的目的)

@dreamer

-----------------------------------原答案-------------------------------------

tcpip和http都是協議是約定好的規範,他們位於網路5層模型的傳輸層(tcp)和應用層(http),tcpip表示的是一系列協議,不過與本題沒有太大關係。規定好的協議總要操作系統實現了才能使用,而socket就是操作系統實現的,tcpip協議族的介面,用於創建一個套接字,可以理解為,通過網路讀寫的文件描述符,socket、bind、listen、accept、connect一系列都是操作系統提供的介面用於實現tcp協議相關的功能。tcp協議可以讓兩個進程通過三次握手建立穩定的通信信道,發送位元組流,而http協議建立在tcp協議之上,也就是說tcp協議可以讓兩個程序說話,而http協議定義了說話的規則。

例如:

A想要B左邊口袋的糖,A和B通過tcp連接後,A發送給B:我想要你左邊口袋的糖,這時進程B如果沒和A做過任何約定,理解這句話是很困難的,想要理解就要和A提前做約定,比如:你發給我的話我會按以下格式理解:「動作:位置/資源」,那麼約定好了後,A就必須發送「獲取:左邊口袋/糖」,B就可以理解這句話,返回給A糖了,但是互聯網上數以億計的節點,是不可能互相都兩兩約定好的,為了讓大家都能順暢的交流、http協議出世,他說:發送方都按我規定的格式說話,接收方都按我規定的格式理解,就互相都明白了不是?

地鐵上碼字,有些混亂,湊合看吧


tcp/ip是一個協議族,對應osi參考模型三層及以上層。

http是tcpip協議族的一個組成協議,是tcp的上層抽象。

socket則是tcpip中運輸層tcp和udp協議中的一個實現定址的重要實現。具體來說,IP是用來定位網路上的一台計算機,那這台計算機上運行這好多服務怎麼定位呢?答案就是socket。


票數最高的答案,內容包含在這篇博文中。如果樓主就是博主,先說聲抱歉,可以return了,如果樓主不是博主,很鄙視這種行為,斷章取義,錯別字都還在,互聯網上的知識本來就亂,這種把相同知識搬運來搬運去的行徑,增加搜索成本,浪費存儲,浪費時間,浪費生命


推薦一本經典書 TCP-IP詳解卷 好好看一遍,這是基礎。

簡單跟你說:TCP/IP、Http 是協議,tcp/ip是目前公認的使用最廣的互聯網協議了,http是應用層協議,tcp/udp傳輸層,ip網路層。

Socket是另一個概念,實現或使用方法,即一般tcp、udp的點對點的通信,也就是兩個端通信基本要素,當然也可以直接raw數據通信,比較少。


http是一種應用層協議,它使用tcp協議提供的服務。tcp協議是一種傳輸層協議,它使用ip協議提供的服務。ip協議是一種網路層協議。

如果把主機比作一個房子,ip地址就類似於它房子的地址,應用程序類似於房子的好多房間,socket類似於應用程序的一個門,埠號類似於門牌號。

要準確地將數據投遞到正確的房間,就需要從傳輸層的一個房子(主機)通過一個門(socket)進到應用層的一個房間(app)。


Http基於TCP/IP 協議的一種更上層協議,socket 是l實現tcp一套介面,有create、listen、connect、accept、send、read和write等基礎的函數提供,方便我們更好的來實現tcp網路傳輸


前兩個是協議 但是layer 都不一樣

而socket 完全不同的東西 是指通訊中的結點


我理解tcp/ip 協議棧(理論)

socket 協議棧的一種實現的基礎產物

http是協議棧的應用,可以基於前面的產物


推薦閱讀:

計算機是如何聊天的?
為什麼wireshark抓包抓不到FCS的信息?
利比亞和哪些國家關係比較好,網路戰方面利比亞的立場會是什麼?
如何利用無線路由器搭建家庭影音網路?說明如下,求最佳方案!
網路通信過程中,建立連接的本質是什麼?

TAG:計算機 | 信息技術IT | 計算機網路 |