TCP協議對應于傳輸層,而HTTP協議對應于應用層,從本質上來說,二者沒有可比性。Http協議是建立在TCP協議基礎之上的,當瀏覽器需要從服務器獲取網頁數據的時候,會發(fā)出一次Http請求。Http會通過TCP建立起一個到服務器的連接通道,當本次請求需要的數據完畢后,Http會立即將TCP連接斷開,這個過程是很短的。所以Http連接是一種短連接,是一種無狀態(tài)的連接。所謂的無狀態(tài),是指瀏覽器每次向服務器發(fā)起請求的時候,不是通過一個連接,而是每次都建立一個新的連接。如果是一個連接的話,服務器進程中就能保持住這個連接并且在內存中記住一些信息狀態(tài)。而每次請求結束后,連接就關閉,相關的內容就釋放了,所以記不住任何狀態(tài),成為無狀態(tài)連接。
隨著時間的推移,html頁面變得復雜了,里面可能嵌入了很多圖片,這時候每次訪問圖片都需要建立一次tcp連接就顯得低效了。因此Keep-Alive被提出用來解決效率低的問題。從HTTP/1.1起,默認都開啟了Keep-Alive,保持連接特性,簡單地說,當一個網頁打開完成后,客戶端和服務器之間用于傳輸HTTP數據的TCP連接不會關閉,如果客戶端再次訪問這個服務器上的網頁,會繼續(xù)使用這一條已經建立的連接Keep-Alive不會永久保持連接,它有一個保持時間,可以在不同的服務器軟件(如Apache)中設定這個時間。雖然這里使用TCP連接保持了一段時間,但是這個時間是有限范圍的,到了時間點依然是會關閉的,所以我們還把其看做是每次連接完成后就會關閉。后來,通過Session, Cookie等相關技術,也能保持一些用戶的狀態(tài)。但是還是每次都使用一個連接,依然是無狀態(tài)連接。
為什么Http是無狀態(tài)的短連接,而TCP是有狀態(tài)的長連接?Http不是建立在TCP的基礎上嗎,為什么還能是短連接? Http就是在每次請求完成后就把TCP連接關了,所以是短連接。而我們直接通過Socket編程使用TCP協議的時候,因為我們自己可以通過代碼區(qū)控制什么時候打開連接什么時候關閉連接,只要我們不通過代碼把連接關閉,這個連接就會在客戶端和服務端的進程中一直存在,相關狀態(tài)數據會一直保存著。
在Java中會有Socket,實際上socket是對TCP/IP協議的封裝,Socket本身并不是協議,而是一個調用接口(API)。Socket的出現只是使得程序員更方便地使用TCP/IP協議棧而已,是對TCP/IP協議的抽象,從而形成了我們知道的一些最基本的函數接口,比如create、listen、connect、accept、send、read和write等等。
比較形象的描述:HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發(fā)動機,提供了網絡通信的能力。對于從C#編程的角度來講,為了方便,你可以直接選擇已經制造好的轎車Http來與服務器交互。但是有時候往往因為環(huán)境因素或者其他的一些定制的請求,必須要使用TCP協議,這時就需要使用Socket編程,然后自己去處理獲取的數據。就像是你用已有的發(fā)動機,自己造了一輛卡車,去從服務器交互。
HTTP/1.0和HTTP/1.1都把TCP作為底層的傳輸協議。HTTP客戶首先發(fā)起建立與服務器TCP連接。一旦建立連接,瀏覽器進程和服務器進程就可以通過各自的套接字來訪問TCP。如前所述,客戶端套接字是客戶進程和TCP連接之間的“門”,服務器端套接字是服務器進程和同一TCP連接之間的“門”??蛻敉约旱奶捉幼职l(fā)送HTTP請求消息,也從自己的套接字接收HTTP響應消息。類似地,服務器從自己的套接字接收HTTP請求消息,也往自己的套接字發(fā)送HTTP響應消息??蛻艋蚍掌饕坏┌涯硞€消息送入各自的套接字,這個消息就完全落入TCP的控制之中。TCP給HTTP提供一個可靠的數據傳輸服務;這意味著由客戶發(fā)出的每個HTTP請求消息最終將無損地到達服務器,由服務器發(fā)出的每個HTTP響應消息最終也將無損地到達客戶。
WebService不需要連接,一秒中至少可以支持上萬/十萬的請求,每次請求然后釋放,沒有空余的內存消耗。一般不會限制同時連接的個數,這是優(yōu)勢。因為每個連接即使沒有在請求數據,也會在內存中占用一定的空間存儲。會限制,比如SQL Server數據庫服務器,一般最多同時連接16個。
Http協議一定通過指定的端口,80,所以一般計算機上不會限制這個端口,所以Http協議能夠順利通過所有機器上的防火墻。而使用Socket編程的話,就需要自己指定特定的端口,那么很可能這個端口是在某個環(huán)境中禁用的,那么就無法穿透防火墻。
apache使用的是80端口,也就是這個程序一直在監(jiān)聽著這個端口。一旦發(fā)現有人要建立到這個端口的連接,他就會響應,然后建立連接。這里說的連接都是短連接。所以你對服務器上的網址的請求,都是通過80端口送到網站程序的。然后通過這個端口發(fā)送的客戶端瀏覽器。
您可能感興趣的文章:- Java下載遠程服務器文件到本地(基于http協議和ssh2協議)
- Java與Http協議的詳細介紹
- HTTP協議詳解_動力節(jié)點Java學院整理
- HTTP協議入門_動力節(jié)點Java學院整理
- Java HTTP協議收發(fā)MQ 消息代碼實例詳解
- javaweb中Http協議詳解
- 基于JAVA中Jersey處理Http協議中的Multipart的詳解
- 使用 Java 類 實現Http協議