HTTP、TCP、Socket區別與聯繫

    TPC/IP協議是傳輸層協議,主要解決數據如何在網絡中傳輸,而HTTP是應用層協議,主要解決如何包裝數據,兩者本質上沒有可比性,何況HTTP協議是基於TCP連接的。而Socket 是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。

    關於TCP/IP和HTTP協議的關係,網絡有一段比較容易理解的介紹:“我們在傳輸數據時,可以只使用(傳輸層)TCP/IP協議,但是那樣的話,如果沒有應用層,便無法識別數據內容,如果想要使傳輸的數據有意義,則必須使用到應用層協議,應用層協議有很多,比如HTTP、FTP、TELNET等,也可以自己定義應用層協議。WEB使用HTTP協議作應用層協議,以封裝HTTP 文本信息,然後使用TCP/IP做傳輸層協議將它發到網絡上。”

    TCP和UDP是高速公路上的“卡車”,它們攜帶的貨物就是像HTTP。

    1、先說Socket連接與TCP連接:

    應用層通過傳輸層進行數據通信時,TCP會遇到同時爲多個應用程序進程提供併發服務的問題。多個TCP連接或多個應用程序進程可能需要通過同一個 TCP協議端口傳輸數據。爲了區別不同的應用程序進程和連接,許多計算機操作系統爲應用程序與TCP/IP協議交互提供了套接字(Socket)接口。應用層可以和傳輸層通過Socket接口,區分來自不同應用程序進程或網絡連接的通信,實現數據傳輸的併發服務。

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

由於通常情況下Socket連接就是TCP連接,因此Socket連接一旦建立,通信雙方即可開始相互發送數據內容,直到雙方連接斷開。但在實際網絡應用中,客戶端到服務器之間的通信往往需要穿越多箇中間節點,例如路由器、網關、防火牆等,大部分防火牆默認會關閉長時間處於非活躍狀態的連接而導致 Socket 連接斷連,因此需要通過輪詢告訴網絡,該連接處於活躍狀態。這也就是我們在保持長連接時需要間隔一段時間發送一個心跳包的原因。

    2、再說Socket連接與HTTP連接:

    Socket一般作爲長連接使用,而HTTP一般作爲短連接使用,下面我們先了解一下長連接與短連接

    短連接 
      連接->傳輸數據->關閉連接 
      HTTP是無狀態的,瀏覽器和服務器每進行一次HTTP操作,就建立一次連接,但任務結束就中斷連接。 
      也可以這樣說:短連接是指 Socket 連接後發送後接收完數據後馬上斷開連接。 

    長連接 
      連接->傳輸數據->保持連接 -> 傳輸數據-> 。。。 ->關閉連接。 
      長連接指建立 Socket 連接後不管是否使用都保持連接,但安全性較差。 

    HTTP 一般應用在短連接,但HTTP 1.1中,HTTP也能支持長連接,使用Connection:keep-alive,HTTP 1.1默認進行持久連接。HTTP1.1和HTTP1.0相比較而言,最大的區別就是增加了持久連接支持(貌似最新的 http1.0 可以顯示的指定 keep-alive),但還是無狀態的,或者說是不可以信任的。

那我們什麼時候用長連接,什麼時候用短連接? 

    長連接多用於操作頻繁,點對點的通訊,而且連接數不能太多情況。每個TCP連接都需要三步握手,這需要時間,如果每個操作都是先連接,再操作的話那麼處理速度會降低很多,所以每個操作完後都不斷開,次處理時直接發送數據包就OK了,不用建立TCP連接。例如:數據庫的連接用長連接,如果用短連接頻繁的通信會造成Socket錯誤,而且頻繁的Socket創建也是對資源的浪費。 
    而像WEB網站的HTTP服務一般都用短鏈接,因爲長連接對於服務端來說會耗費一定的資源,而像WEB網站這麼頻繁的成千上萬甚至上億客戶端的連接用短連接 會更省一些資源,如果用長連接,而且同時有成千上萬的用戶,如果每個用戶都佔用一個連接的話,那可想而知吧。所以併發量大,但每個用戶無需頻繁操作情況下 需用短連好。

    3、下面分別介紹一下HTTP、TCP、Socket基本概念

    (1)HTTP連接

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

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

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

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

  由於HTTP在每次請求結束後都會主動釋放連接,因此HTTP連接是一種“短連接”。要使用HTTP長連接保持客戶端程序的在線狀態,需要不斷地向服務器發起連接請求,客戶端的長連接不可能無限期的拿着,會有一個超時時間,服務器有時候會告訴客戶端超時時間。通常的做法是即使不需要獲得任何數據,客戶端也保持每隔一段固定的時間向服務器發送一次“保持連接”的請求,服務器在收到該請求後對客戶端進行回覆,表明知道客戶端“在線”。若服務器長時間無法收到客戶端的請求,則認爲客戶端“下線”,若客戶端長時間無法收到服務器的回覆,則認爲網絡已經斷開。

   (2)Socket

  Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。套接字(Socket)概念

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

  而HTTP連接使用的是“請求—響應”的方式,不僅在請求時需要先建立連接,而且需要客戶端向服務器發出請求後,服務器端才能回覆數據。

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

   (3)TCP

    TCP是一種面向連接的、可靠的、基於字節流的傳輸層通信協議TCP的連接建立需要經過三次握手,而連接終止需要四次握手。

    TCP連接建立三次握手

  所謂三次握手(Three-way Handshake),是指建立一個TCP連接時,需要客戶端和服務器總共發送3個包。

第一次握手:客戶端發送一個TCP的SYN標誌位置1的包指明客戶打算連接的服務器的端口,以及初始序號X,保存在包頭的序列號(Sequence Number)字段裏。

  第二次握手:服務器發回確認包(ACK)應答。即SYN標誌位和ACK標誌位均爲1同時,將確認序號(Acknowledgement Number)設置爲客戶的序列號加1以,即X+1。

第三次握手:客戶端再次發送確認包(ACK) SYN標誌位爲0,ACK標誌位爲1。並且把服務器發來ACK的序號字段+1,放在確定字段中發送給對方.並且在數據段放寫序列號的+1。


    三次握手完成,TCP客戶端和服務器端成功地建立連接,可以開始傳輸數據了。

    TCP連接終止四次揮手

  TCP的連接的拆除需要發送四個包,因此稱爲四次揮手(four-way handshake)。客戶端或服務器均可主動發起揮手動作,在socket

  編程中,任何一方執行close()操作即可產生揮手操作。

爲什麼連接的時候是三次握手,關閉的時候卻是四次揮手?

某個應用進程首先調用close,駐東莞比長連接時,該端的TCP於是發送一個FIN報文,表示數據發送完畢,可以關閉連接,接收到這個FIN的對端執行 “被動關閉”,可是此時這一方可能還有沒有處理完成的任務,比如從輸出流中讀取傳送過來的數據,所以並不會立即關閉SOCKET連接,所以只能先回復一個ACK報文,告訴請求關閉連接端,你發的FIN報文我收到了。只有等到我所有的處理完之後,我才發送FIN報文,告訴說連接可以關閉,最後請求關閉端在發送一個ACK報文同一關閉連接。故需要四步握手。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章