當前位置:首頁 » 操作系統 » 納格演算法

納格演算法

發布時間: 2023-02-11 13:20:44

1. Java Socket重要參數講解

Java Socket的api可能很多人會用 但是Java Socket的參數可能很多人都不知道用來幹嘛的 甚至都不知道有這些參數

backlog

用於ServerSocket 配置ServerSocket的最大客戶端等待隊列 等待隊列的意思 先看下面代碼

public class Main { public static void main(String[] args) throws Exception { int port = int backlog = ServerSocket serverSocket = new ServerSocket(port backlog) Socket clientSock = serverSocket accept() System out println( revcive from + clientSock getPort()) while (true) { byte buf[] = new byte[ ] int len = clientSock getInputStream() read(buf) System out println(new String(buf len)) }這段測試代碼在第一次處理一個客戶端時 就不會處理第二個客戶端 所以除了第一個客戶端 其他客戶端就是等待隊列了 所以這個伺服器最多可以同時連接 個客戶端 其中 個等待隊列 大家可以telnet localhost 測試下

這個參數設置為 表示無限制 默認是 個最大等待隊列 如果設置無限制 那麼你要小心了 如果你伺服器無法處理那麼多連接 那麼當很多客戶端連到你的伺服器時 每一個TCP連接都會佔用伺服器的內存 最後會讓伺服器崩潰的

另外 就算你設置了backlog為 如果你的代碼中是一直Socket clientSock = serverSocket accept() 假設我們的機器最多可以同時處理 個請求 總共有 個線程在運行 然後你把在 個線程的線程池處理clientSock 不能處理的clientSock就排隊 最後clientSock越來越多 也意味著TCP連接越來越多 也意味著我們的伺服器的內存使用越來越高(客戶端連接進程 肯定會發送數據過來 數據會保存到伺服器端的TCP接收緩存區) 最後伺服器就宕機了 所以如果你不能處理那麼多請求 請不要循環無限制地調用serverSocket accept() 否則backlog也無法生效 如果真的請求過多 只會讓你的伺服器宕機(相信很多人都是這么寫 要注意點)

TcpNoDelay

禁用納格演算法 將數據立即發送出去 納格演算法是以減少封包傳送量來增進TCP/IP網路的效能 當我們調用下面代碼 如

Socket socket = new Socket() nnect(new InetSocketAddress(host )) InputStream in = socket getInputStream() OutputStream out = socket getOutputStream() String head = hello String body = world out write(head getBytes()) out write(body getBytes()) 我們發送了hello 當hello沒有收到ack確認(TCP是可靠連接 發送的每一個數據都要收到對方的一個ack確認 否則就要重發)的時候 根據納格演算法 world不會立馬發送 會等待 要麼等到ack確認(最多等 ms對方會發過來的) 要麼等到TCP緩沖區內容>=MSS 很明顯這里沒有機會 我們寫了world後再也沒有寫數據了 所以只能等到hello的ack我們才會發送world 除非我們禁用納格演算法 數據就會立即發送了

SoLinger

當我們調用socket close()返回時 socket已經write的數據未必已經發送到對方了 例如

Socket socket = new Socket() nnect(new InetSocketAddress(host )) InputStream in = socket getInputStream() OutputStream out = socket getOutputStream() String head = hello String body = world out write(head getBytes()) out write(body getBytes()) socket close()

這里調用了socket close()返回時 hello和world未必已經成功發送到對方了 如果我們設置了linger而不小於 如

bool on = true int linger = ……

socket setSoLinger(boolean on int linger)

……

socket close() 那麼close會等到發送的數據已經確認了才返回 但是如果對方宕機 超時 那麼會根據linger設定的時間返回

UrgentData和OOBInline

TCP的緊急指針 一般都不建議使用 而且不同的TCP/IP實現 也不同 一般說如果你有緊急數據寧願再建立一個新的TCP/IP連接發送數據 讓對方緊急處理

所以這兩個參數 你們可以忽略吧 想知道更多的 自己查下資料

SoTimeout

設置socket調用InputStream讀數據的超時時間 以毫秒為單位 如果超過這個時候 會拋出 SocketTimeoutException

KeepAlive

keepalive不是說TCP的常連接 當我們作為服務端 一個客戶端連接上來 如果設置了keeplive為true 當對方沒有發送任何數據過來 超過一個時間(看系統內核參數配置) 那麼我們這邊會發送一個ack探測包發到對方 探測雙方的TCP/IP連接是否有效(對方可能斷點 斷網) 在Linux好像這個時間是 秒 如果不設置 那麼客戶端宕機時 伺服器永遠也不知道客戶端宕機了 仍然保存這個失效的連接

SendBufferSize和ReceiveBufferSize

TCP發送緩存區和接收緩存區 默認是 一般情況下足夠了 而且就算你增加了發送緩存區 對方沒有增加它對應的接收緩沖 那麼在TCP三握手時 最後確定的最大發送窗口還是雙方最小的那個緩沖區 就算你無視 發了更多的數據 那麼多出來的數據也會被丟棄 除非雙方都協商好

lishixin/Article/program/Java/hx/201311/26575

2. 【性能】Nagle 演算法(納格演算法)

Nagle 演算法,是 TCP 協議中用於減少小包發送數量的一種優化演算法,目的是為了提高實際帶寬的利用率。

舉個例子,當有效負載只有 1 位元組時,再加上 TCP 頭部和 IP 頭部分別佔用的 20 位元組,整個網路包就是 41 位元組,這樣實際帶寬的利用率只有 2.4%(1/41)。往大了說,如果整個網路帶寬都被這種小包占滿,那整個網路的有效利用率就太低了。

Nagle 演算法正是為了解決這個問題:它通過合並 TCP 小包,提高網路帶寬的利用率。Nagle 演算法規定,一個 TCP 連接上,最多隻能有一個未被確認的未完成分組;在收到這個分組的 ACK 前,不發送其他分組。這些小分組會被組合起來,並在收到 ACK 後,用同一個分組發送出去。

顯然,Nagle 演算法本身的想法還是挺好的,但是知道 Linux 默認的延遲確認機制後,你應該就不這么想了。因為它們一起使用時,網路延遲會明顯。如下圖所示:

3. 我的世界為什麼自己蹦端了

納格演算法模組出現錯誤,請刪除納格演算法模組。
如果問題依然存在,請重新下載Forge。

熱點內容
6s和安卓8哪個值得入手 發布:2025-07-23 23:03:31 瀏覽:766
巧妙運演算法 發布:2025-07-23 23:02:02 瀏覽:140
sql解析json 發布:2025-07-23 22:48:16 瀏覽:905
戰神解壓密碼 發布:2025-07-23 22:29:07 瀏覽:224
如何刷機安卓系統手機 發布:2025-07-23 22:28:56 瀏覽:739
麥咭編程下載 發布:2025-07-23 22:20:04 瀏覽:36
javadraw 發布:2025-07-23 22:19:59 瀏覽:629
忘記密碼去哪裡找回 發布:2025-07-23 22:19:06 瀏覽:748
php培訓技術 發布:2025-07-23 22:18:21 瀏覽:608
兒童速演算法 發布:2025-07-23 22:09:37 瀏覽:637