中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中TCP連接及其優化方法

發布時間:2021-06-23 09:33:14 來源:億速云 閱讀:141 作者:chen 欄目:大數據

本篇內容主要講解“Java中TCP連接及其優化方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java中TCP連接及其優化方法”吧!

作為一個后端程序員,網絡連接這塊是一個繞不過的砍,當你在做服務器優化的時候,網絡優化也是其中一環,那么作為網絡連接中最基礎的部分-TCP連接你了解嗎?今天我們來仔細看看這個部分。

<!-- more -->

TCP建立連接-三次握手

詳解

Java中TCP連接及其優化方法

  1. 客戶端和服務器還未建立連接,但服務器一般處于listen狀態

  2. 客戶端主動建立連接,向服務器發送SYN報文,客戶端變為SYN_SENT狀態

  3. 服務器收到客戶端發送的報文,也回了一個SYN報文,包含了一個ack。此時,服務器變為SYN_RCVD狀態

  4. 客戶端收到了服務器發送的SYN報文,確認了ack,它將向服務器發送一個ACK報文。此時,客戶端變為ESTABLISHED

  5. 服務器收到客戶端的ACK報文,確認了ack。此時,服務器也變為ESTABLISHED

  6. 服務器和客戶端可以正常通信了

其中步驟2~4就是三次握手,那么為什么需要三次握手呢?為什么不是一次或者兩次握手呢?

首先,我們需要知道,只有當服務器和客戶端都能確保自己能夠發消息和接收消息,這次網絡通信才算成功的。

步驟2的作用是讓服務器知道了自己是可以接收消息的。

步驟3的作用是讓客戶端知道自己發送消息和接收消息的功能是OK的,發送消息的能力是通過服務器返回的ack=x+1確認的,因為這個值基于當初客戶端發送的消息seq=x。接收消息的能力是因為收到了服務器的返回。

步驟4的作用是讓服務器端知道自己發送消息的能力是OK的(和步驟3類似)。

linux查看

linux服務器可以利用netstat -anp | grep tcp命令,查看服務器上各個端口和應用的連接狀態。

你還可以通過修改linux的配置文件/etc/sysctl.conf,調整各個狀態的數量

SYN_SENT狀態相關
  • 主動建立連接時,發SYN(步驟2)的重試次數

nct.ipv4.tcp_syn_rctries = 6
  • 建立連接時的本地端口可用范圍

net.ipv4.ip_local_port_range = 32768 60999
SYN_RCVD狀態相關
  • SYN_RCVD狀態連接的最大個數

net.ipv4.tcp_max_syn_backlog
  • 被動建立連接時,發SYN/ACK(步驟3)重試次數

net.ipv4.tcp_synack_retries

說完了TCP建立連接,接下來,我們再來看看TCP正常斷開連接的過程

TCP斷開連接-四次揮手

詳解

Java中TCP連接及其優化方法

  1. 客戶端與服務器端正常傳輸數據

  2. 客戶端主動斷開連接,向服務器端發送FIN報文,客戶端變為FIN_WAIT1狀態

  3. 服務器收到客戶端的FIN后,向客戶端發送ACK報文,服務器變為CLOSE_WAIT狀態

  4. 客戶端收到服務器的ACK報文后,客戶端變為FIN_WAIT2狀態

  5. 服務器向客戶端發送FIN報文,服務器變為LAST_ACK狀態

  6. 客戶端收到服務器發送的FIN報文后,向服務器發送ACK報文,客戶端變為TIME_WAIT狀態

  7. 服務器收到客戶端的ACK報文后,服務器變為CLOSED狀態

  8. 客戶端經過2MSL(max segment lifetime,報文最大生存時間)時間后,也變為CLOSED狀態

其中,步驟2、3、5、6即為4次揮手。

TIME_WAIT狀態及其優化

看完之后,大家想必會有一個疑問,為什么TIME_WAIT狀態需要保持2MSL?因為這可以保證至少一次報文的往返時間內,端口是不可復用的。

假設TIME_WAIT狀態的持續時間很短,我們來模擬下面這種場景: Java中TCP連接及其優化方法

  • 客戶端向服務器端發送了三條報文,其中第3條報文卡在網絡中,服務器只收到了前兩條,向客戶單發送ACK=2,客戶端重新發送第三條報文。

  • 服務器主動發送FIN報文,客戶端收到后發送FIN、ACK,服務器端收到后發送ACK并進入TIME_WAIT狀態(假設這個狀態很短)。

  • 現在服務器又再次和客戶端建立連接,三次握手之后開始發送正常數據,結果之前卡住的第三條報文,現在終于發送到服務器,但服務器也不知道該如何處理這條報文。

因此這也是TIME_WAIT狀態需要保持2MSL的原因,如果這么長時間也沒有收到報文,即使有正確的報文從客戶端發出,也已經過期了,因此不會影響到之后的通信。

但這同樣也會帶來一個問題,TIME_WAIT狀態保持的時間較長,假設服務器端有大量TIME_WAIT狀態的TCP連接,就相當于白白浪費掉大量的服務器資源(端口)。此時,我們可以通過修改以下配置進行服務器調優:

net.ipv4.tcp_tw_reuse = 1
  • 開啟后,作為客戶端時新連接可以使用仍然處于TIME_WAIT狀態的端口

  • 由于timestamp的存在,操作系統可以拒絕遲到的報文(例如上面說的第三條報文),可以利用以下配置:

net.ipv4.tcp_timestamps = 1

其他狀態的優化

CLOSE_WAIT狀態

如果服務器端有大量CLOSE_WAIT狀態的連接,很有可能是應用進程出現bug,沒有及時關閉連接。

FIN_WAIT1狀態

調整發送FIN報文的重試次數,0相當于8

net.ipv4.tcp_orphan_retries = 0
FIN_WAIT2狀態

調整保持在FIN_WAIT2狀態的時間

net.ipv4.tcp_fin_timeout = 60

總結

看到這里,想必你應該對TCP連接有了一個大致的了解。現在服務器大多都用了nginx做了負載均衡,因此,我們可能需要在此基礎上了解一些nginx相關的配置原理,這樣應該會對我們的服務器性能調優會有更大的幫助。有興趣的同學不妨可以去了解一下,如果有什么新發現想和作者探討的,歡迎在下方留言。

到此,相信大家對“Java中TCP連接及其優化方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

图木舒克市| 赤峰市| 渭南市| 淳安县| 甘洛县| 新丰县| 城口县| 绍兴县| 泰兴市| 澜沧| 阿尔山市| 玉门市| 巨鹿县| 韩城市| 宜川县| 江源县| 象州县| 油尖旺区| 曲靖市| 武宁县| 安宁市| 旬邑县| 涿鹿县| 盘山县| 龙泉市| 临武县| 岳池县| 田阳县| 微山县| 江阴市| 沽源县| 攀枝花市| 北碚区| 尤溪县| 平泉县| 白朗县| 保靖县| 南皮县| 彭山县| 沭阳县| 渭南市|