close_wait狀態和time_wait狀態
根據TCP協議,主動發起關閉的一方,會進入TIME_WAIT狀態,持續2*MSL(Max Segment Lifetime),預設為240秒,在這個post中簡潔的介紹了為什麼需要這個狀態。
值得一說的是,對於基於TCP的HTTP協議,關閉TCP連線的是Server端,這樣,Server端會進入TIME_WAIT狀態,可 想而知,對於訪問量大的Web Server,會存在大量的TIME_WAIT狀態,假如server一秒鐘接收1000個請求,那麼就會積壓240*1000=240,000個 TIME_WAIT的記錄,維護這些狀態給Server帶來負擔。當然現代作業系統都會用快速的查詢演算法來管理這些TIME_WAIT,所以對於新的 TCP連線請求,判斷是否hit中一個TIME_WAIT不會太費時間,但是有這麼多狀態要維護總是不好。
HTTP協議1.1版規定default行為是Keep-Alive,也就是會重用TCP連線傳輸多個 request/response,一個主要原因就是發現了這個問題。還有一個方法減緩TIME_WAIT壓力就是把系統的2*MSL時間減少,因為 240秒的時間實在是忒長了點,對於Windows,修改登錄檔,在HKEY_LOCAL_MACHINE/ SYSTEM/CurrentControlSet/Services/ Tcpip/Parameters上新增一個DWORD型別的值TcpTimedWaitDelay,一般認為不要少於60,不然可能會有麻煩。
對於大型的服務,一臺server搞不定,需要一個LB(Load Balancer)把流量分配到若干後端伺服器上,如果這個LB是以NAT方式工作的話,可能會帶來問題。假如所有從LB到後端Server的IP包的 source address都是一樣的(LB的對內地址),那麼LB到後端Server的TCP連線會受限制,因為頻繁的TCP連線建立和關閉,會在server上留 下TIME_WAIT狀態,而且這些狀態對應的remote address都是LB的,LB的source port撐死也就60000多個(2^16=65536,1~1023是保留埠,還有一些其他埠預設也不會用),每個LB上的埠一旦進入 Server的TIME_WAIT黑名單,就有240秒不能再用來建立和Server的連線,這樣LB和Server最多也就能支援300個左右的連線。 如果沒有LB,不會有這個問題,因為這樣server看到的remote address是internet上廣闊無垠的集合,對每個address,60000多個port實在是夠用了。
一開始我覺得用上LB會很大程度上限制TCP的連線數,但是實驗表明沒這回事,LB後面的一臺Windows Server
2003每秒處理請求數照樣達到了600個,難道TIME_WAIT狀態沒起作用?用Net
Monitor和netstat觀察後發現,Server和LB的XXXX埠之間的連線進入TIME_WAIT狀態後,再來一個LB的XXXX埠的
SYN包,Server照樣接收處理了,而是想像的那樣被drop掉了。翻書,從書堆裡面找出覆滿塵土的大學時代買的《UNIX Network
Programming, Volume 1, Second Edition: Networking APIs: Sockets and
XTI》,中間提到一句,對於BSD-derived實現,只要SYN的sequence number比上一次關閉時的最大sequence
number還要大,那麼TIME_WAIT狀態一樣接受這個SYN,難不成Windows也算BSD-derived?有了這點線索和關鍵字
(BSD),找到
做個試驗,用Socket API編一個Client端,每次都Bind到本地一個埠比如2345,重複的建立TCP連線往一個Server傳送Keep-Alive=false 的HTTP請求,Windows的實現讓sequence number不斷的增長,所以雖然Server對於Client的2345埠連線保持TIME_WAIT狀態,但是總是能夠接受新的請求,不會拒絕。那 如果SYN的Sequence Number變小會怎麼樣呢?同樣用Socket API,不過這次用Raw IP,傳送一個小sequence number的SYN包過去,Net Monitor裡面看到,這個SYN被Server接收後如泥牛如海,一點反應沒有,被drop掉了。
按照書上的說法,BSD-derived和Windows Server 2003的做法有安全隱患,不過至少這樣至少不會出現TIME_WAIT阻止TCP請求的問題,當然,客戶端要配合,保證不同TCP連線的sequence number要上漲不要下降。
相關推薦
close_wait狀態和time_wait狀態
根據TCP協議,主動發起關閉的一方,會進入TIME_WAIT狀態,持續2*MSL(Max Segment Lifetime),預設為240秒,在這個post中簡潔的介紹了為什麼需要這個狀態。 值得一說的是,對於基於TCP的HTTP協議,關閉TCP連線的是Server端,這樣,Server端會進入TIME
$?:退出狀態和退出狀態碼
mage image pin 遇到 ech bubuko 狀態 例如 執行 $? 變量保存最近的命令退出狀態 進程使用退出狀態來報告成功或失敗 ?0 代表成功,1-255代表失敗 ?例如: ping -c1 -W1 hostdown &> /dev/null
Atitit 持久化 Persistence概念的藝術 目錄 1. 持久化是將程式資料在持久狀態和瞬時狀態間轉換的機制。 1 2. DBC就是一種持久化機制。檔案IO也是一種持久化機制。 2 3.
Atitit 持久化 Persistence概念的藝術 目錄 1. 持久化是將程式資料在持久狀態和瞬時狀態間轉換的機制。 1 2. DBC就是一種持久化機制。檔案IO也是一種持久化機制。 2 3. 日常持久化的方法 2 4. 理解與分類 3 4.1
併發程式設計實戰(1):執行緒安全性之有狀態和無狀態物件
程序和執行緒的區別 程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位. 執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位. 程序在執行過程中擁有獨立的記憶體單元,程序
有狀態和無狀態的Servlet
有狀態和無狀態的Servlet 有狀態 有狀態就是有資料的儲存功能.有狀態物件(Stateful Bean) 有例項變數的物件,可以儲存資料,是非執行緒安全的.在不同的方法呼叫間不保留任何的狀態.無狀態 無狀態就是一次操作,不能儲存資料.無狀態物件(Stateless Bean) 沒有例項變數的物件
有狀態和無狀態的區別
基本概念: 有狀態就是有資料儲存功能。有狀態物件(Stateful Bean),就是有例項變數的物件 ,可以儲存資料,是非執行緒安全的。在不同方法呼叫間不保留任何狀態。 無狀態就是一次操作,不能儲存資料。無狀態物件(Stateless Bean),就是沒有例項變數的物件 .
lua學習筆記day04-----無狀態和多狀態的迭代器
在解釋無狀態和多狀態的迭代器之前,我們需要先了解一下泛型for是如何和迭代函式一起工作的。 a = {"one","two","three"} function gc(c) local k = 0 return function ()
農夫過河問題——使用者自定義初始狀態和終止狀態
問題描述 一個農夫帶著一隻狼、一隻羊和一棵白菜,身處河的南岸,他要把這些東西全部運到北岸。他面前只有一條小船,船隻能容下他和一件物品,另外只有農夫才能撐船。如果農夫在場,則狼不能吃羊,羊不能吃白菜;否則狼會吃羊,羊會吃白菜。所以農夫不能留下羊和白菜自己離開,也
高通暫存器狀態比較-比如錄音狀態和正常狀態
adb shell cat /sys/kernel/debug/asoc/apq8064-tabla-snd-card/tabla_codec/codec_reg > D:\register_record.txt adb shell cat /sys/kernel
有狀態和無狀態服務
很多 技術 分享 是否 建議 關心 http 圖片 復制 有狀態服務器和無狀態服務器 對服務器程序來說,有兩個基本假設十分重要,究竟服務器是基於狀態請求還是無狀態請求。狀態化的判斷是指兩個來自相同發起者的請求在服務器端是否具備上下文關系。如果是狀態化請求,那麽服務器端一
淺析權限認證中的有狀態和無狀態
總結 有一個 eth 返回 alt 配置 客戶端信息 傳遞 主動 前言 我們在設計構建一個系統的時候,權限管理和用戶認證是最基本功能,其中關於用戶認證這塊是一個比較常見的模塊。在已有的方案中,我們最常見的就是保存到 tomcat 中的 session 對象中。隨著微服務的興
TCP的狀態,兼談Close_Wait和Time_Wait的狀態 (keepalive機制)
一TCP的狀態: 1)、LISTEN:首先服務端需要開啟一個socket進行監聽,狀態為LISTEN. /* The socket is listening for incoming connections. 偵聽來自遠方TCP埠的連線請求 */ 2)、SYN_SENT:客
time_wait狀態如何處理和建議
pan res ubi eight too call archive eat web TL;DR: do not enable net.ipv4.tcp_tw_recycle. UPDATED (2017.09): net.ipv4.tcp_tw_recycle has b
TCP和UDP協議的對比,TCP三次握手,TIME_WAIT狀態極其存在的必要性
TCP和UDP協議的對比: TCP---傳輸控制協議,提供的是面向連線、可靠的位元組流服務。當客戶和伺服器彼此交換資料前,必須先在雙方之間建立一個TCP連線,之後才能傳輸資料。TCP提供超時重發,丟棄
關於面試經常被問到的socket的TIME_WAIT狀態的原因及解決辦法和避免的辦法
一檢視現在time_wait的數量及淺析 netstat -an | grep TIME_WAIT | wc -l 發現系統存在大量TIME_WAIT狀態的連線,通過調整核心引數解決,在 /etc/sysctl.conf中加入net.ipv4.tcp_tw_r
TCP/IP TIME_WAIT狀態原理和服務端過多原因分析
TIME_WAIT狀態原理 ---------------------------- 通訊雙方建立TCP連線後,主動關閉連線的一方就會進入TIME_WAIT狀態。 客戶端主動關閉連線時,會發送最後一個ack後,然後會進入TIME_WAIT狀態,再停留2個MSL時間(後有MSL的解釋),進入CLOSE
[socket] 斷開連線時,time_wait狀態的解釋和驗證:
time_wait狀態的解釋和驗證: 在TCP同步雙工斷開連線中,假設沒有time-wait這個狀態,那麼在最後一個FIN N傳送時,主動關閉方接到後,返回ack N+1.那麼這個時候如果N+1這個包在沒有正確達到,那麼對方會一直處於LAST ACK的狀態,而傳送方因為
生成樹中的5種交換機端口狀態和3種生成樹協議模式
style blocking 用戶數 forward 命令 learn 用戶數據 pvst+ class 端口狀態:①關閉(disable):端口處於管理關閉狀態 即DIS②阻塞(blocking): 不能轉發用戶數據 即BLK③監聽(listening): 接口開始啟動
Entity Framework 添加、附加、和實體狀態
鍵值 name 五個 能夠 att first 通過 數據集 attach 這篇文章將會覆蓋如何新增和附加實體到上下文以及在 SaveChanges 中Entity Framework 如何處理它們。 Entity Framework 會在實體與上下文連接時追蹤它們的
頁面的下鉆和返回狀態的記錄
bsp 不能 highlight roo 頁面 off onchange which keyword 通過angularjs自帶的$locationChangeStart .run([‘$rootScope‘, ‘$window‘, ‘$location‘,