女人荫蒂被添全过程13种图片,亚洲+欧美+在线,欧洲精品无码一区二区三区 ,在厨房拨开内裤进入毛片

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

簡單了解TCP中設計的短連接和長連接

西西 ? 來源:Kirito的技術分享 ? 作者:kiritomoe ? 2019-02-01 10:46 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1 前言

可能很多 Java 程序員對 TCP 的理解只有一個三次握手,四次揮手的認識,我覺得這樣的原因主要在于 TCP 協議本身稍微有點抽象(相比較于應用層的 HTTP 協議);其次,非框架開發者不太需要接觸到 TCP 的一些細節。其實我個人對 TCP 的很多細節也并沒有完全理解,這篇文章主要針對微信交流群里有人提出的長連接,心跳的問題,做一個統一的整理。

在 Java 中,使用 TCP 通信,大概率會涉及到 Socket、Netty,本文會借用它們的一些 API 和設置參數來輔助介紹。

2 長連接與短連接

TCP 本身并沒有長短連接的區別,長短與否,完全取決于我們怎么用它。

短連接:每次通信時,創建 Socket;一次通信結束,調用 socket.close()。這就是一般意義上的短連接,短連接的好處是管理起來比較簡單,存在的連接都是可用的連接,不需要額外的控制手段。

長連接:每次通信完畢后,不會關閉連接,這樣就可以做到連接的復用。長連接的好處便是省去了創建連接的耗時。

短連接和長連接的優勢,分別是對方的劣勢。想要圖簡單,不追求高性能,使用短連接合適,這樣我們就不需要操心連接狀態的管理;想要追求性能,使用長連接,我們就需要擔心各種問題:比如端對端連接的維護,連接的保活。

長連接還常常被用來做數據的推送,我們大多數時候對通信的認知還是 request/response 模型,但 TCP 雙工通信的性質決定了它還可以被用來做雙向通信。在長連接之下,可以很方便的實現 push 模型。

短連接沒有太多東西可以講,所以下文我們將目光聚焦在長連接的一些問題上。純講理論未免有些過于單調,所以下文我借助 Dubbo 這個 RPC 框架的一些實踐來展開 TCP 的相關討論。

3 服務治理框架中的長連接

前面已經提到過,追求性能的時候,必然會選擇使用長連接,所以借助 Dubbo 可以很好的來理解 TCP。我們開啟兩個 Dubbo 應用,一個 server 負責監聽本地 20880(眾所周知,這是 Dubbo 協議默認的端口),一個 client 負責循環發送請求。執行 lsof-i:20880 命令可以查看端口的相關使用情況:

簡單了解TCP中設計的短連接和長連接

*:20880(LISTEN) 說明了 Dubbo 正在監聽本地的 20880 端口,處理發送到本地 20880 端口的請求。

后兩條信息說明請求的發送情況,驗證了 TCP 是一個雙向的通信過程,由于我是在同一個機器開啟了兩個 Dubbo 應用,所以你能夠看到是本地的 53078 端口與 20880 端口在通信。我們并沒有手動設置 53078 這個客戶端端口,他是隨機的,但也闡釋了一個道理:即使是發送請求的一方,也需要占用一個端口。

稍微說一下 FD 這個參數,他代表了文件句柄,每新增一條連接都會占用新的文件句柄,如果你在使用 TCP 通信的過程中出現了 open too many files 的異常,那就應該檢查一下,你是不是創建了太多的連接,而沒有關閉。細心的讀者也會聯想到長連接的另一個好處,那就是會占用較少的文件句柄。

4 長連接的維護

因為客戶端請求的服務可能分布在多個服務器上,客戶端端自然需要跟對端創建多條長連接,使用長連接,我們遇到的第一個問題就是要如何維護長連接。

//客戶端 public class NettyHandler extends SimpleChannelHandler {

private final Map《String, Channel》 channels = new ConcurrentHashMap《String, Channel》();// 《ip:port, channel》

} //服務端

public class NettyServer extends AbstractServer implements Server {

private Map《String, Channel》 channels;// 《ip:port, channel》

}

在 Dubbo 中,客戶端和服務端都使用 ip:port 維護了端對端的長連接,Channel 便是對連接的抽象。我們主要關注 NettyHandler 中的長連接,服務端同時維護一個長連接的集合是 Dubbo 的設計,我們將在后面提到。

5 連接的保活

這個話題就有的聊了,會牽扯到比較多的知識點。首先需要明確一點,為什么需要連接的報活?當雙方已經建立了連接,但因為網絡問題,鏈路不通,這樣長連接就不能使用了。需要明確的一點是,通過 netstat,lsof 等指令查看到連接的狀態處于 ESTABLISHED 狀態并不是一件非常靠譜的事,因為連接可能已死,但沒有被系統感知到,更不用提假死這種疑難雜癥了。如果保證長連接可用是一件技術活。

6 連接的保活:KeepAlive

首先想到的是 TCP 中的 KeepAlive 機制。KeepAlive 并不是 TCP 協議的一部分,但是大多數操作系統都實現了這個機制。KeepAlive 機制開啟后,在一定時間內(一般時間為 7200s,參數 tcp_keepalive_time)在鏈路上沒有數據傳送的情況下,TCP 層將發送相應的KeepAlive探針以確定連接可用性,探測失敗后重試 10(參數 tcp_keepalive_probes)次,每次間隔時間 75s(參數 tcp_keepalive_intvl),所有探測失敗后,才認為當前連接已經不可用。

在 Netty 中開啟 KeepAlive

bootstrap.option(ChannelOption.TCP_NODELAY,true)

Linux 操作系統中設置 KeepAlive 相關參數,修改 /etc/sysctl.conf 文件:

net.ipv4.tcp_keepalive_time=90 net.ipv4.tcp_keepalive_intvl=15 net.ipv4.tcp_keepalive_probes=2

KeepAlive 機制是在網絡層面保證了連接的可用性,但站在應用框架層面我們認為這還不夠。主要體現在兩個方面:

KeepAlive 的開關是在應用層開啟的,但是具體參數(如重試測試,重試間隔時間)的設置卻是操作系統級別的,位于操作系統的 /etc/sysctl.conf 配置中,這對于應用來說不夠靈活。

KeepAlive 的保活機制只在鏈路空閑的情況下才會起到作用,假如此時有數據發送,且物理鏈路已經不通,操作系統這邊的鏈路狀態還是 ESTABLISHED,這時會發生什么?自然會走 TCP 重傳機制,要知道默認的 TCP 超時重傳,指數退避算法也是一個相當長的過程。

KeepAlive 本身是面向網絡的,并不是面向于應用的,當連接不可用時,可能是由于應用本身 GC 問題,系統 load 高等情況,但網絡仍然是通的,此時,應用已經失去了活性,所以連接自然應該認為是不可用的。

看來,應用層面的連接保活還是必須要做的。

7 連接的保活:應用層心跳

終于點題了,文題中提到的心跳便是一個本文想要重點強調的另一個 TCP 相關的知識點。上一節我們已經解釋過了,網絡層面的 KeepAlive 不足以支撐應用級別的連接可用性,本節就來聊聊應用層的心跳機制是實現連接保活的。

如何理解應用層的心跳?簡單來說,就是客戶端會開啟一個定時任務,定時對已經建立連接的對端應用發送請求(這里的請求是特殊的心跳請求),服務端則需要特殊處理該請求,返回響應。如果心跳持續多次沒有收到響應,客戶端會認為連接不可用,主動斷開連接。不同的服務治理框架對心跳,建連,斷連,拉黑的機制有不同的策略,但大多數的服務治理框架都會在應用層做心跳,Dubbo 也不例外。

8 應用層心跳的設計細節

以 Dubbo 為例,支持應用層的心跳,客戶端和服務端都會開啟一個 HeartBeatTask,客戶端在 HeaderExchangeClient 中開啟,服務端將在 HeaderExchangeServer 開啟。文章開頭埋了一個坑:Dubbo 為什么在服務端同時維護 Map

// HeartBeatTask if (channel instanceof Client) {

((Client) channel).reconnect();

} else { channel.close();

}

熟悉其他 RPC 框架的同學會發現,不同框架的心跳機制真的是差距非常大。心跳設計還跟連接創建,重連機制,黑名單連接相關,還需要具體框架具體分析。

除了定時任務的設計,還需要在協議層面支持心跳。最簡單的例子可以參考 nginx 的健康檢查,而針對 Dubbo 協議,自然也需要做心跳的支持,如果將心跳請求識別為正常流量,會造成服務端的壓力問題,干擾限流等諸多問題。

簡單了解TCP中設計的短連接和長連接

其中 Flag 代表了 Dubbo 協議的標志位,一共 8 個地址位。低四位用來表示消息體數據用的序列化工具的類型(默認 hessian),高四位中,第一位為1表示是 request 請求,第二位為 1 表示雙向傳輸(即有返回response),第三位為 1 表示是心跳事件。

心跳請求應當和普通請求區別對待。

9 注意和 HTTP 的 KeepAlive 區別對待

HTTP 協議的 KeepAlive 意圖在于連接復用,同一個連接上串行方式傳遞請求-響應數據

TCP 的 KeepAlive 機制意圖在于保活、心跳,檢測連接錯誤。

這壓根是兩個概念。

10 KeepAlive 常見異常

啟用 TCP KeepAlive 的應用程序,一般可以捕獲到下面幾種類型錯誤

ETIMEOUT 超時錯誤,在發送一個探測保護包經過 (tcpkeepalivetime + tcpkeepaliveintvl * tcpkeepaliveprobes)時間后仍然沒有接收到 ACK 確認情況下觸發的異常,套接字被關閉 java java.io.IOException:Connectiontimedout

EHOSTUNREACH host unreachable(主機不可達)錯誤,這個應該是 ICMP 匯報給上層應用的。 java java.io.IOException:Noroute to host

鏈接被重置,終端可能崩潰死機重啟之后,接收到來自服務器的報文,然物是人非,前朝往事,只能報以無奈重置宣告之。 java java.io.IOException:Connectionresetbypeer

11 總結

有三種使用 KeepAlive 的實踐方案:

1.默認情況下使用 KeepAlive 周期為 2 個小時,如不選擇更改,屬于誤用范疇,造成資源浪費:內核會為每一個連接都打開一個保活計時器,N 個連接會打開 N 個保活計時器。 優勢很明顯:

TCP 協議層面保活探測機制,系統內核完全替上層應用自動給做好了

內核層面計時器相比上層應用,更為高效

上層應用只需要處理數據收發、連接異常通知即可

數據包將更為緊湊

2.關閉 TCP 的 KeepAlive,完全使用應用層心跳保活機制。由應用掌管心跳,更靈活可控,比如可以在應用級別設置心跳周期,適配私有協議。

3.業務心跳 + TCP KeepAlive 一起使用,互相作為補充,但 TCP 保活探測周期和應用的心跳周期要協調,以互補方可,不能夠差距過大,否則將達不到設想的效果。

各個框架的設計都有所不同,例如 Dubbo 使用的是方案三,但阿里內部的 HSF 框架則沒有設置 TCP 的 KeepAlive,僅僅由應用心跳保活。和心跳策略一樣,這和框架整體的設計相關

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    20

    文章

    2988

    瀏覽量

    108400
  • API
    API
    +關注

    關注

    2

    文章

    1568

    瀏覽量

    63726
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1401

    瀏覽量

    80652
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    如何標識一個TCP連接

    tcp應用,server事先在某個固定端口監聽,client主動發起連接,經過三路握手后建立tcp連接。那么對單機,其最大并發
    的頭像 發表于 10-10 10:33 ?3328次閱讀

    TCP/IP協議連接指南

    中扮演什么角色了。文章目錄ESP32 單片機學習筆記 - 07 - TCP連接一、例程實踐1)建立TCP客戶端 - tcp_client2)總結二、
    發表于 02-17 07:45

    TCP, ISO- on- TCP, UDP連接

    TSEND“ & ?TRCV “ 發送和接收數據(TCP 和ISO - on- TCP)?TUSEND“ & ?TURCV“ 發送和接收數據(UDP) 自動連接管理的通訊塊( 僅用于S7- 1200)
    的頭像 發表于 06-12 15:11 ?5428次閱讀
    <b class='flag-5'>TCP</b>, ISO- on- <b class='flag-5'>TCP</b>, UDP<b class='flag-5'>連接</b>

    一文詳談HTTP協議的連接連接

    HTTP的連接連接本質上是TCP連接
    的頭像 發表于 09-07 10:52 ?3032次閱讀
    一文詳談HTTP協議的<b class='flag-5'>長</b><b class='flag-5'>連接</b>和<b class='flag-5'>短</b><b class='flag-5'>連接</b>

    字節一面:HTTP連接TCP連接有區別?

    由于 HTTP 是基于 TCP 傳輸協議實現的,客戶端與服務端要進行 HTTP 通信前,需要先建立 TCP 連接,然后客戶端發送 HTTP 請求,服務端收到后就返回響應,至此「請求-應答」的模式就完成了,隨后就會釋放
    的頭像 發表于 12-02 14:00 ?1254次閱讀

    了解按鈕的內部連接

    電子發燒友網站提供《了解按鈕的內部連接.zip》資料免費下載
    發表于 01-30 15:51 ?0次下載
    <b class='flag-5'>了解</b>按鈕<b class='flag-5'>中</b>的內部<b class='flag-5'>連接</b>

    什么是Socket連接?Socket與TCP連接的關系

    主機 A 的應用程序必須通過 Socket 建立連接才能與主機B的應用程序通信,而建立 Socket 連接需要底層 TCP/IP 協議來建立 TCP
    發表于 03-31 15:10 ?1301次閱讀

    什么是Socket連接?與TCP連接有什么關系?

    什么是Socket連接?它與TCP連接有什么關系? 計算機網絡是我們日常生活不可或缺的一部分,而Socket連接則是網絡通信中必不可少的一
    的頭像 發表于 05-23 11:43 ?997次閱讀

    基于軟件定義無線電的實時頻譜分析儀設備連接方法(一)簡單2端口TCP/IP連接

    虹科實時頻譜分析儀HK-R5550支持簡單2端口TCP/IP連接和使用HiSLIP進行連接兩種不同的設備連接方法。
    的頭像 發表于 12-22 09:16 ?1316次閱讀
    基于軟件定義無線電的實時頻譜分析儀設備<b class='flag-5'>連接</b>方法(一)<b class='flag-5'>簡單</b>2端口<b class='flag-5'>TCP</b>/IP<b class='flag-5'>連接</b>

    什么是Socket連接?它與TCP連接有什么關系?

    計算機網絡是我們日常生活不可或缺的一部分,而Socket連接則是網絡通信中必不可少的一種機制。在本篇文章,我們將通過簡單易懂、生動形象的語言,向大家介紹Socket
    的頭像 發表于 03-06 11:00 ?1552次閱讀
    什么是Socket<b class='flag-5'>連接</b>?它與<b class='flag-5'>TCP</b><b class='flag-5'>連接</b>有什么關系?

    【干貨】什么是Socket連接?它與TCP連接有什么關系?

    計算機網絡是我們日常生活不可或缺的一部分,而Socket連接則是網絡通信中必不可少的一種機制。在本篇文章,我們將通過簡單易懂、生動形象的語言,向大家介紹Socket
    的頭像 發表于 04-09 10:39 ?1645次閱讀
    【干貨】什么是Socket<b class='flag-5'>連接</b>?它與<b class='flag-5'>TCP</b><b class='flag-5'>連接</b>有什么關系?

    TCP通信過程連接連接是什么?

    當面試官問你:TCP 通信過程連接連接是什么?
    的頭像 發表于 08-08 11:30 ?1611次閱讀
    <b class='flag-5'>TCP</b>通信過程<b class='flag-5'>中</b>的<b class='flag-5'>長</b><b class='flag-5'>連接</b>與<b class='flag-5'>短</b><b class='flag-5'>連接</b>是什么?

    TCP連接的建立與中止

    常重要的 。 TCP 連接的建立可以簡單地稱為三次握手,而連接的中止則可以稱為四次揮手。 建立連接 TC
    的頭像 發表于 10-08 16:52 ?935次閱讀

    TCP連接建立的異常

    次發出后還要等32s都知道第5次也超時了。如果第五次重傳之后,還未收到客戶端的 ACK,server 端的 TCP 才會把斷開這個連接。 關于
    的頭像 發表于 10-08 17:01 ?1076次閱讀

    TCP連接連接

    是通過四次揮手。所以說,每個TCP連接的建立和釋放都是需要消耗資源和時間成本的。 二 TCP連接 模擬一種
    的頭像 發表于 11-13 10:46 ?1341次閱讀
    主站蜘蛛池模板: 沂水县| 饶阳县| 河东区| 应用必备| 奉节县| 连城县| 平邑县| 中江县| 清原| 浦东新区| 昭平县| 赤水市| 收藏| 乌审旗| 永新县| 于都县| 卫辉市| 凤凰县| 乐昌市| 将乐县| 翼城县| 延安市| 华坪县| 虞城县| 吴江市| 南宫市| 青河县| 慈利县| 金山区| 独山县| 望江县| 商洛市| 奉新县| 南宫市| 宁都县| 宁夏| 汉沽区| 新田县| 工布江达县| 万载县| 桃源县|