https://blog.csdn.net/jasonjwl/article/details/52085264
短連接
連接->傳輸數據->關閉連接
HTTP是無狀態的,瀏覽器和服務器每進行一次HTTP操作,就建立一次連接,但任務結束后就中斷連接。短連接是指SOCKET連接后發送后接收完數據后馬上斷開連接。
長連接
連接->傳輸數據->保持連接->傳輸數據->....->關閉連接
長連接指建立SOCKET連接后不管是否使用都保持連接,但安全性較差。
http的長連接
HTTP也可以建立長連接的,使用Connection:keep-alive,HTTP1.1默認進行持久連接。HTTP1.1和HTTP1.0相比較而言,最大的區別就是增加了持久連接支持,但還是無狀態的,或者說是不可以信任的。
那什么場景下使用長連接或者短連接?
長連接多用於操作頻繁,點對點的通訊(及時通訊),而且連接數不能太多。每個TCP連接都需要三次握手,建立連接,會比較耗時。如果每個操作都要先連接,再操作的話,處理速度會降低很多。長連接的特點是每個操作完后都不斷開連接,直接發送數據包就可以了,不需要每次都建立連接。
使用場景如下:
1.數據庫的連接用長連接。如果用短連接頻繁的通信會造成socket錯誤,而且頻繁的socket創建也是對資源的浪費。
2.像web網站的http服務一般都是用短連接,因為長連接對於服務器來說會耗費一定的資源,而像WEB網站這么頻繁的成千上萬甚至上億客戶端的連接用短連接會更省一點資源,如果用長連接,而且同時又成千上萬的用戶,如果每個用戶都占用一個連接的話,並發量大,對服務器的壓力比較大。如果每個用戶無需頻繁操作情況下需用短連接。
在長連接中一般無法判斷讀寫什么時候結束,必須要加長度報文頭。讀函數先是讀取報文頭的長度,再根據這個長度讀相應長度的報文。
Socket是什么
Socket是應用層與TCP/IP協議族通信中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個facade模式,它把復雜的TCP/IP協議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。
通信過程:
主機A的應用程序要能和主機B的應用程序通信,必須通過Socket建立連接,而建立Socket連接必須需要底層TCP/IP協議來建立TCP連接。建立TCP連接需要底層IP協議來尋址網絡中的主機。網絡層使用的iP協議可以幫助我們根據IP地址來找到目標主機,但是一台主機上可能運行着多個應用程序,如何才能與指定的應用程序通信就要通過端口號來指定。這樣就可以通過Socket實例唯一代表一個主機上的一個應用程序的通信鏈路了。
建立通信鏈路
當客戶端要與服務器端通信,客戶端首先要創建一個Socket實例,操作系統將為這個Socket實例分配一個沒有被使用的本地端口號,並創建一個包含本地和遠程地址、端口號的套接字數據結構,這個數據結構將一直保存在系統中直到這個連接關閉。在創建Socket實例的構造函數正確返回之前,將要進行TCP的三次握手協議,TCP握手協議完成后,Socket實例對象將創建完成,否則將拋出IOException錯誤。
TCP和UDP的區別
- TCP(transport control protocol,傳輸控制協議)是面向連接的,面向流的,提供高可靠服務。收發兩端都要有一一成對的socket,因此,發送端為了將多個發往接收端的包,更有效的發到對方,使用了優化方法(Nagle算法),將多次間隔較小且數據量小的數據,合並成一個大的數據塊,然后進行封包。這樣,接收端就難於分辨出來了,必須提供科學的拆包機制。即面向流的通信是無消息保護邊界的。
- UDP(user datagram protocol,用戶數據報協議)是無連接的,面向消息的,提供高效率服務。不會使用塊的合並優化算法,由於UDP支持的是一對多的模式,所以接收端的skbuff(套接字緩沖區)采用了鏈式結構來記錄每一個到達的UDP包,在每個UDP包中就有了消息頭(消息來源地址,端口等信息),這樣對於接收端來說,就容易進行區分處理了。即面向消息的通信是有消息保護邊界的。