Linux記錄-TCP狀態以及(TIME_WAIT/CLOSE_WAIT)分析(轉載)

1.TCP握手定理

?

?

?2.TCP狀態

l? CLOSED:初始狀態,表示TCP連接是“關閉著的”或“未打開的”。

l? LISTEN?:表示服務器端的某個SOCKET處于監聽狀態,可以接受客戶端的連接。

l? SYN_RCVD?:表示服務器接收到了來自客戶端請求連接的SYN報文。在正常情況下,這個狀態是服務器端的SOCKET在建立TCP連接時的三次握手會話過程中的一個中間狀態,很短暫,基本上用netstat很難看到這種狀態,除非故意寫一個監測程序,將三次TCP握手過程中最后一個ACK報文不予發送。當TCP連接處于此狀態時,再收到客戶端的ACK報文,它就會進入到ESTABLISHED 狀態。

l? SYN_SENT?:這個狀態與SYN_RCVD 狀態相呼應,當客戶端SOCKET執行connect()進行連接時,它首先發送SYN報文,然后隨即進入到SYN_SENT 狀態,并等待服務端的發送三次握手中的第2個報文。SYN_SENT 狀態表示客戶端已發送SYN報文。

l? ESTABLISHED?:表示TCP連接已經成功建立。

l? FIN_WAIT_1?:這個狀態得好好解釋一下,其實FIN_WAIT_1 和FIN_WAIT_2 兩種狀態的真正含義都是表示等待對方的FIN報文。而這兩種狀態的區別是:FIN_WAIT_1狀態實際上是當SOCKET在ESTABLISHED狀態時,它想主動關閉連接,向對方發送了FIN報文,此時該SOCKET進入到FIN_WAIT_1 狀態。而當對方回應ACK報文后,則進入到FIN_WAIT_2 狀態。當然在實際的正常情況下,無論對方處于任何種情況下,都應該馬上回應ACK報文,所以FIN_WAIT_1 狀態一般是比較難見到的,而FIN_WAIT_2 狀態有時仍可以用netstat看到。

l? FIN_WAIT_2?:上面已經解釋了這種狀態的由來,實際上FIN_WAIT_2狀態下的SOCKET表示半連接,即有一方調用close()主動要求關閉連接。注意:FIN_WAIT_2 是沒有超時的(不像TIME_WAIT 狀態),這種狀態下如果對方不關閉(不配合完成4次揮手過程),那這個?FIN_WAIT_2 狀態將一直保持到系統重啟,越來越多的FIN_WAIT_2 狀態會導致內核crash。

l? TIME_WAIT?:表示收到了對方的FIN報文,并發送出了ACK報文。?TIME_WAIT狀態下的TCP連接會等待2*MSL(Max Segment Lifetime,最大分段生存期,指一個TCP報文在Internet上的最長生存時間。每個具體的TCP協議實現都必須選擇一個確定的MSL值,RFC 1122建議是2分鐘,但BSD傳統實現采用了30秒,Linux可以cat?/proc/sys/net/ipv4/tcp_fin_timeout看到本機的這個值),然后即可回到CLOSED 可用狀態了。如果FIN_WAIT_1狀態下,收到了對方同時帶FIN標志和ACK標志的報文時,可以直接進入到TIME_WAIT狀態,而無須經過FIN_WAIT_2狀態。(這種情況應該就是四次揮手變成三次揮手的那種情況)

l??CLOSING?:這種狀態在實際情況中應該很少見,屬于一種比較罕見的例外狀態。正常情況下,當一方發送FIN報文后,按理來說是應該先收到(或同時收到)對方的ACK報文,再收到對方的FIN報文。但是CLOSING 狀態表示一方發送FIN報文后,并沒有收到對方的ACK報文,反而卻也收到了對方的FIN報文。什么情況下會出現此種情況呢?那就是當雙方幾乎在同時close()一個SOCKET的話,就出現了雙方同時發送FIN報文的情況,這是就會出現CLOSING 狀態,表示雙方都正在關閉SOCKET連接。

l? CLOSE_WAIT?:表示正在等待關閉。怎么理解呢?當對方close()一個SOCKET后發送FIN報文給自己,你的系統毫無疑問地將會回應一個ACK報文給對方,此時TCP連接則進入到CLOSE_WAIT狀態。接下來呢,你需要檢查自己是否還有數據要發送給對方,如果沒有的話,那你也就可以close()這個SOCKET并發送FIN報文給對方,即關閉自己到對方這個方向的連接。有數據的話則看程序的策略,繼續發送或丟棄。簡單地說,當你處于CLOSE_WAIT 狀態下,需要完成的事情是等待你去關閉連接。

l? LAST_ACK?:當被動關閉的一方在發送FIN報文后,等待對方的ACK報文的時候,就處于LAST_ACK 狀態。當收到對方的ACK報文后,也就可以進入到CLOSED 可用狀態了。

#######################################################################################################################################

LISTEN:等待從任何遠端TCP 和端口的連接請求。 SYN_SENT:發送完一個連接請求后等待一個匹配的連接請求。 SYN_RECEIVED:發送連接請求并且接收到匹配的連接請求以后等待連接請求確認。 ESTABLISHED:表示一個打開的連接,接收到的數據可以被投遞給用戶。連接的數據傳輸階段的正常狀態。 FIN_WAIT_1:等待遠端TCP 的連接終止請求,或者等待之前發送的連接終止請求的確認。 FIN_WAIT_2:等待遠端TCP 的連接終止請求。 CLOSE_WAIT:等待本地用戶的連接終止請求。 CLOSING:等待遠端TCP 的連接終止請求確認。 LAST_ACK:等待先前發送給遠端TCP 的連接終止請求的確認(包括它字節的連接終止請求的確認) TIME_WAIT:等待足夠的時間過去以確保遠端TCP 接收到它的連接終止請求的確認。 TIME_WAIT 兩個存在的理由: 1.可靠的實現tcp全雙工連接的終止; 2.允許老的重復分節在網絡中消逝。 CLOSED:不在連接狀態(這是為方便描述假想的狀態,實際不存在)

######################################################################################################################################

3.服務器大量TIME_WAIT和CLOSE_WAIT分析

#查看TCP狀態:netstat?-n?|?awk?'/^tcp/?{++S[$NF]}?END?{for(a?in?S)?print?a,?S[a]}'? ?

TIME_WAIT 814
CLOSE_WAIT 1
FIN_WAIT1 1
ESTABLISHED 634
SYN_RECV 2
LAST_ACK 1

常用的三個狀態是:ESTABLISHED 表示正在通信,TIME_WAIT 表示主動關閉,CLOSE_WAIT 表示被動關閉,Listen表示正在監聽可以接受客戶端連接。

#常見問題分析

1.服務器保持了大量TIME_WAIT狀態

2.服務器保持了大量CLOSE_WAIT狀態

因為linux分配給一個用戶的文件句柄是有限的,而TIME_WAIT和CLOSE_WAIT兩種狀態如果一直被保持,那么意味著對應數目的通道就一直被占著,而且是“占著茅坑不使勁”,一旦達到句柄數上限,新的請求就無法被處理了,接著就是大量Too Many Open Files異常,tomcat崩潰。

#############################################################################

tomcat環境下服務器文件句柄耗盡(Too Many Open Files)的問題排查

為什么會出現文件句柄耗盡的情況?

主要是因為linux在文件句柄的數目上有兩個級別的限制。一個是系統級別的總數限制,一個是針對用戶的限制。默認情況下每個用戶所能使用的句柄數是1024。一般情況下1024也夠用了,但是在大容量的系統上,特別是會頻繁使用網絡通信和文件IO的系統上,1024很快就被耗光了。所以首先我們要調整這個值。修改方法如下:

1.?ulimit?-a?查看當前用戶的文件句柄限制??

2.?用戶級別的句柄數限制修改?

修改?/etc/security/limits.conf?增加下面的代碼:??

用戶名(或者用*表示所有用戶)??soft?nofile?65535????

用戶名?hard?nofile?65535???

有兩種限制,一種是soft軟限制,在數目超過軟限制的時候系統會給出warning警告,但是達到hard硬限制的時候系統將拒絕或者異常了。??

修改之后可能需要重啟shell生效。??

3.?系統級別的句柄數限制修改

sysctl?-w?fs.file-max?65536??

或者??echo?"65536"?>?/proc/sys/fs/file-max??

兩者作用是相同的,前者改內核參數,后者直接作用于內核參數在虛擬文件系統(procfs,?psuedo?file?system)上對應的文件而已。??

可以用下面的命令查看新的限制??

sysctl?-a?|?grep?fs.file-max??

或者??cat?/proc/sys/fs/file-max??

4.修改內核參數??

/etc/sysctl.conf??

echo?"fs.file-max=65536"?>>?/etc/sysctl.conf??

sysctl?-p??

查看系統總限制?命令:cat?/proc/sys/fs/file-max????

查看整個系統目前使用的文件句柄數量命令:cat?/proc/sys/fs/file-nr???

查看某個進程開了哪些句柄?:lsof?-p?pid????

某個進程開了幾個句柄?:lsof?-p?pid?|wc?-l????

也可以看到某個目錄?/文件被什么進程占用了,顯示已打開該目錄或文件的所有進程信息?:lsof?path/filename? ?

具體這個值應該設置成多少?

優先級(Open File Descriptors):
soft limit < hard limit < kernel < 實現最大file descriptor數采用的數據結構所導致的限制

其實這個值倒是沒有具體限制,但是分配的值如果太大反而會影響系統性能,所以要根據具體應用調配權衡。

問題的解決方案:

首先當然是修改linux句柄數限制到一個合適的值。

然后就是應用本身的一個調整。有這么幾種情況:

1.數據庫連接池的優化。必須要使用連接池,否則句柄沒耗光數據庫就崩了。。。

2.抓取資源的時候有可能會用到HttpClient,盡量也應該使用連接池來控制連接數。

3.連接池設置的把握,建立連接超時時間,讀取超時時間,連接數目,等待時間,等都需要配置到一個合適的值,否則發揮不出連接池的性能。

###########################################################################################################

解決思路很簡單,就是讓服務器能夠快速回收和重用那些TIME_WAIT的資源。

對/etc/sysctl.conf文件的修改:

#對于一個新建連接,內核要發送多少個?SYN?連接請求才決定放棄,不應該大于255,默認值是5,對應于180秒左右時間???

net.ipv4.tcp_syn_retries=2??

#net.ipv4.tcp_synack_retries=2??

#表示當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時,改為300秒??

net.ipv4.tcp_keepalive_time=1200??

net.ipv4.tcp_orphan_retries=3??

#表示如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間??

net.ipv4.tcp_fin_timeout=30????

#表示SYN隊列的長度,默認為1024,加大隊列長度為8192,可以容納更多等待連接的網絡連接數。??

net.ipv4.tcp_max_syn_backlog?=?4096??

#表示開啟SYN?Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防范少量SYN攻擊,默認為0,表示關閉??

net.ipv4.tcp_syncookies?=?1??

#表示開啟重用。允許將TIME-WAIT?sockets重新用于新的TCP連接,默認為0,表示關閉??

net.ipv4.tcp_tw_reuse?=?1??

#表示開啟TCP連接中TIME-WAIT?sockets的快速回收,默認為0,表示關閉??

net.ipv4.tcp_tw_recycle?=?1??

##減少超時前的探測次數???

net.ipv4.tcp_keepalive_probes=5???

##優化網絡設備接收隊列???

net.core.netdev_max_backlog=3000? ?

修改完之后執行/sbin/sysctl -p讓參數生效。
這里頭主要注意到的是net.ipv4.tcp_tw_reuse
net.ipv4.tcp_tw_recycle
net.ipv4.tcp_fin_timeout
net.ipv4.tcp_keepalive_*
這幾個參數。
net.ipv4.tcp_tw_reuse和net.ipv4.tcp_tw_recycle的開啟都是為了回收處于TIME_WAIT狀態的資源。
net.ipv4.tcp_fin_timeout這個時間可以減少在異常情況下服務器從FIN-WAIT-2轉到TIME_WAIT的時間。
net.ipv4.tcp_keepalive_*一系列參數,是用來設置服務器檢測連接存活的相關配置。

如果將大量CLOSE_WAIT的解決辦法總結為一句話那就是:查代碼。因為問題出在服務器程序里頭啊。

?

轉載于:https://www.cnblogs.com/xinfang520/p/8961129.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389782.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389782.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389782.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

677. 鍵值映射

677. 鍵值映射 實現一個 MapSum 類&#xff0c;支持兩個方法&#xff0c;insert 和 sum&#xff1a; MapSum() 初始化 MapSum 對象 void insert(String key, int val) 插入 key-val 鍵值對&#xff0c;字符串表示鍵 key &#xff0c;整數表示值 val 。如果鍵 key 已經存在&am…

算法 從 數中選出_算法可以選出勝出的nba幻想選秀嗎

算法 從 數中選出Note from Towards Data Science’s editors: While we allow independent authors to publish articles in accordance with our rules and guidelines, we do not endorse each author’s contribution. You should not rely on an author’s works without …

jQuery表單校驗

小小Demo&#xff1a; <script>$(function () {//給username綁定失去焦點事件$("#username").blur(function () {//得到username文本框的值var nameValue $(this).val();//每次清除數據$("table font:first").remove();//校驗username是否合法if (n…

5912. 每一個查詢的最大美麗值

5912. 每一個查詢的最大美麗值 給你一個二維整數數組 items &#xff0c;其中 items[i] [pricei, beautyi] 分別表示每一個物品的 價格 和 美麗值 。 同時給你一個下標從 0 開始的整數數組 queries 。對于每個查詢 queries[j] &#xff0c;你想求出價格小于等于 queries[j] …

django-rest-framework第一次使用使用常見問題

2019獨角獸企業重金招聘Python工程師標準>>> 記錄在第一次使用django-rest-framework框架使用時遇到的問題&#xff0c;為了便于理解在這里創建了Person和Grade這兩個model from django.db import models class Person(models.Model):SHIRT_SIZES ((S, Small),(M, …

插入腳注把腳注標注刪掉_地獄司機不應該只是英國電影歷史數據中的腳注,這說明了為什么...

插入腳注把腳注標注刪掉Cowritten by Andie Yam由安迪(Andie Yam)撰寫 Hell Drivers”, 1957地獄司機 》電影海報 Data visualization is a great way to celebrate our favorite pieces of art as well as reveal connections and ideas that were previously invisible. Mor…

vue之axios 登陸驗證及數據獲取

登陸驗證&#xff0c;獲取token methods:{callApi () {var vm thisvm.msg vm.result //驗證地址vm.loginUrl http://xxx///查詢地址vm.apiUrl http://yyy/vm.loginModel {username: 你的用戶名,password: 你的密碼,// grant_type: password,}//先獲取 tokenaxios.post(v…

5926. 買票需要的時間

5926. 買票需要的時間 有 n 個人前來排隊買票&#xff0c;其中第 0 人站在隊伍 最前方 &#xff0c;第 (n - 1) 人站在隊伍 最后方 。 給你一個下標從 0 開始的整數數組 tickets &#xff0c;數組長度為 n &#xff0c;其中第 i 人想要購買的票數為 tickets[i] 。 每個人買票…

貝葉斯統計 傳統統計_統計貝葉斯如何補充常客

貝葉斯統計 傳統統計For many years, academics have been using so-called frequentist statistics to evaluate whether experimental manipulations have significant effects.多年以來&#xff0c;學者們一直在使用所謂的常客統計學來評估實驗操作是否具有significant效果。…

吳恩達機器學習+林軒田機器學習+高等數學和線性代數等視頻領取

機器學習一直是一個熱門的領域。這次小編應大家需求&#xff0c;整理了許多相關學習視頻和書籍。本次分享包含&#xff1a;臺灣大學林軒田老師的【機器學習基石】和【機器學習技法】視頻教學、吳恩達老師的機器學習分享、徐小湛的高等數學和線性代數視頻&#xff0c;還有相關機…

saltstack二

配置管理 haproxy的安裝部署 haproxy各版本安裝包下載路徑https://www.haproxy.org/download/1.6/src/&#xff0c;跳轉地址為http&#xff0c;改為https即可 創建相關目錄 # 創建配置目錄 [rootlinux-node1 ~]# mkdir /srv/salt/prod/pkg/ [rootlinux-node1 ~]# mkdir /srv/sa…

319. 燈泡開關

319. 燈泡開關 初始時有 n 個燈泡處于關閉狀態。第一輪&#xff0c;你將會打開所有燈泡。接下來的第二輪&#xff0c;你將會每兩個燈泡關閉一個。 第三輪&#xff0c;你每三個燈泡就切換一個燈泡的開關&#xff08;即&#xff0c;打開變關閉&#xff0c;關閉變打開&#xff0…

如何生成隨機不重復的11位數字

要求 不重復隨機11位數字不占存儲我們都知道11位數字(random)對應有最大值max和最小值min99999999999和10000000000.很簡單的從最小值開始按順序分發到最大值&#xff0c;就滿足了不重復&#xff0c;不占存儲&#xff0c;11位數字的特性。那么接下來就要考慮如何生成隨機數字這…

因為你的電腦安裝了即點即用_即你所愛

因為你的電腦安裝了即點即用Data visualization is a great way to celebrate our favorite pieces of art as well as reveal connections and ideas that were previously invisible. More importantly, it’s a fun way to connect things we love — visualizing data and …

關于前端緩存問題

Cookie、localStorage、sessionStorage的異同 之前沒怎接觸過前端緩存&#xff0c;請教了前端同事之后他給我粘了幾行代碼&#xff0c;用localStorage存取信息&#xff0c;后來老大review代碼的時候發現&#xff0c;被批了一頓&#xff0c;現在好好看看這幾個前端緩存的區別&am…

2074. 反轉偶數長度組的節點

2074. 反轉偶數長度組的節點 給你一個鏈表的頭節點 head 。 鏈表中的節點 按順序 劃分成若干 非空 組&#xff0c;這些非空組的長度構成一個自然數序列&#xff08;1, 2, 3, 4, …&#xff09;。一個組的 長度 就是組中分配到的節點數目。換句話說&#xff1a; 節點 1 分配給…

阿里云云服務器硬盤分區及掛載

云服務器環境&#xff1a;CentOS 6.2 64位 客戶端環境&#xff1a;Mac OSX 遠程連接方式&#xff1a;運行 Terminal&#xff0c;輸入命令 ssh usernameip 硬盤分區及掛載操作步驟&#xff1a; 查看未掛載的硬盤&#xff08;名稱為/dev/xvdb&#xff09;fdisk -l Disk /dev/xvdb…

團隊管理新思考_需要一個新的空間來思考討論和行動

團隊管理新思考andrew wong安德魯黃 Follow跟隨 Sep 4 九月4 There is a need for a new space to think, discuss, and act. This need are being felt by the majority of AI / ML / Data Product Managers out there. They are exhausted by the ever increasing data volum…

Uva201

原題地址&#xff1a;https://uva.onlinejudge.org/index.php?optioncom_onlinejudge&Itemid9 題意&#xff1a; 就是要你輸入一系列橫邊的起始點&#xff0c;和豎邊的起始點&#xff0c;然后你去找出這些邊里面構成的所有正方形。 心得體會 一道難度適中的模擬題&#xf…

2075. 解碼斜向換位密碼

2075. 解碼斜向換位密碼 字符串 originalText 使用 斜向換位密碼 &#xff0c;經由 行數固定 為 rows 的矩陣輔助&#xff0c;加密得到一個字符串 encodedText 。 originalText 先按從左上到右下的方式放置到矩陣中。 先填充藍色單元格&#xff0c;接著是紅色單元格&#xff…