tcp長(zhǎng)連接和短連接
TCP在真正的讀寫操作之前,server與client之間必須建立一個(gè)連接,
當(dāng)讀寫操作完成后,雙方不再需要這個(gè)連接時(shí)它們可以釋放這個(gè)連接,
連接的建立通過三次握手,釋放則需要四次握手,
所以說每個(gè)連接的建立都是需要資源消耗和時(shí)間消耗的。
TCP通信的整個(gè)過程,如下圖:
1. TCP短連接
模擬一種TCP短連接的情況:
client 向 server 發(fā)起連接請(qǐng)求
server 接到請(qǐng)求,雙方建立連接
client 向 server 發(fā)送消息
server 回應(yīng) client
一次讀寫完成,此時(shí)雙方任何一個(gè)都可以發(fā)起 close 操作
在步驟5中,一般都是 client 先發(fā)起 close 操作。當(dāng)然也不排除有特殊的情況。
從上面的描述看,短連接一般只會(huì)在 client/server 間傳遞一次讀寫操作!
2. TCP長(zhǎng)連接
再模擬一種長(zhǎng)連接的情況:
client 向 server 發(fā)起連接
server 接到請(qǐng)求,雙方建立連接
client 向 server 發(fā)送消息
server 回應(yīng) client
一次讀寫完成,連接不關(guān)閉
后續(xù)讀寫操作…
長(zhǎng)時(shí)間操作之后client發(fā)起關(guān)閉請(qǐng)求
3. TCP長(zhǎng)/短連接操作過程
3.1 短連接的操作步驟是:
建立連接——數(shù)據(jù)傳輸——關(guān)閉連接…建立連接——數(shù)據(jù)傳輸——關(guān)閉連接
3.2 長(zhǎng)連接的操作步驟是:
建立連接——數(shù)據(jù)傳輸…(保持連接)…數(shù)據(jù)傳輸——關(guān)閉連接
4. TCP長(zhǎng)/短連接的優(yōu)點(diǎn)和缺點(diǎn)
長(zhǎng)連接可以省去較多的TCP建立和關(guān)閉的操作,減少浪費(fèi),節(jié)約時(shí)間。
對(duì)于頻繁請(qǐng)求資源的客戶來說,較適用長(zhǎng)連接。
client與server之間的連接如果一直不關(guān)閉的話,會(huì)存在一個(gè)問題,
隨著客戶端連接越來越多,server早晚有扛不住的時(shí)候,這時(shí)候server端需要采取一些策略,
如關(guān)閉一些長(zhǎng)時(shí)間沒有讀寫事件發(fā)生的連接,這樣可以避免一些惡意連接導(dǎo)致server端服務(wù)受損;
如果條件再允許就可以以客戶端機(jī)器為顆粒度,限制每個(gè)客戶端的最大長(zhǎng)連接數(shù),
這樣可以完全避免某個(gè)蛋疼的客戶端連累后端服務(wù)。
短連接對(duì)于服務(wù)器來說管理較為簡(jiǎn)單,存在的連接都是有用的連接,不需要額外的控制手段。
但如果客戶請(qǐng)求頻繁,將在TCP的建立和關(guān)閉操作上浪費(fèi)時(shí)間和帶寬。
5. TCP長(zhǎng)/短連接的應(yīng)用場(chǎng)景
長(zhǎng)連接多用于操作頻繁,點(diǎn)對(duì)點(diǎn)的通訊,而且連接數(shù)不能太多情況。
每個(gè)TCP連接都需要三次握手,這需要時(shí)間,如果每個(gè)操作都是先連接,
再操作的話那么處理速度會(huì)降低很多,所以每個(gè)操作完后都不斷開,
再次處理時(shí)直接發(fā)送數(shù)據(jù)包就OK了,不用建立TCP連接。
例如:數(shù)據(jù)庫(kù)的連接用長(zhǎng)連接,如果用短連接頻繁的通信會(huì)造成socket錯(cuò)誤,
而且頻繁的socket 創(chuàng)建也是對(duì)資源的浪費(fèi)。
而像WEB網(wǎng)站的http服務(wù)一般都用短鏈接,因?yàn)殚L(zhǎng)連接對(duì)于服務(wù)端來說會(huì)耗費(fèi)一定的資源,
而像WEB網(wǎng)站這么頻繁的成千上萬甚至上億客戶端的連接用短連接會(huì)更省一些資源,
如果用長(zhǎng)連接,而且同時(shí)有成千上萬的用戶,如果每個(gè)用戶都占用一個(gè)連接的話,
那可想而知吧。所以并發(fā)量大,但每個(gè)用戶無需頻繁操作情況下需用短連好。