關於mina的setSendBufferSize體驗

先說說事件回放html

某天客戶端要求說tcp包要小點,這樣他開的buffer就小點java

那我就找到acceptor.getSessionConfig().setSendBufferSize(int);這個方法設置發送byte buffer的大小,但我把他設置成1,讓他每一個包都即時發送linux

mina的setSendBufferSize方法是一個接口,他會調用java.net.Socket.setSendBufferSize文件ubuntu

jdk的描述是這樣的windows

將此 Socket 的 SO_SNDBUF 選項設置爲指定的值。平臺的網絡鏈接代碼將 SO_SNDBUF 選項用做設置底層網絡 I/O 緩存的大小的提示。

因爲 SO_SNDBUF 是一種提示,想要驗證緩衝區設置大小的應用程序應該調用 getSendBufferSize()緩存

 

意思就是發送buffer吧服務器

 

用工具在客戶端捉包的結果顯示最大包 仍是1460,但tcp包id的數量不一樣了網絡

舉個例子:session

SendBufferSize爲1024時(15:55:45.225中的225就是包id號)捉取的數據包以下tcp

時間(.包id)    包長 數據長度  具體數據

15:55:45.225 63 9 xxxxxxxx(具體數據)

15:55:45.225 63 19 xxxxxxxx(具體數據)

15:55:45.225 63 39 xxxxxxxx(具體數據)

15:55:45.225 63 932 xxxxxxxx(具體數據)

15:55:47.225 63 93 xxxxxxxx(具體數據)

15:55:47.225 63 9 xxxxxxxx(具體數據)

15:55:47.225 63 9 xxxxxxxx(具體數據)

SendBufferSize爲1時(15:55:45.225中的22X就是包id號)捉取的數據包以下

時間(.包id)    包長 數據長度  具體數據

15:55:45.225 63 9 xxxxxxxx(具體數據)

15:55:45.225 63 19 xxxxxxxx(具體數據)

15:55:45.226 63 39 xxxxxxxx(具體數據)

15:55:45.227 63 932 xxxxxxxx(具體數據)

15:55:47.228 63 93 xxxxxxxx(具體數據)

15:55:47.229 63 9 xxxxxxxx(具體數據)

15:55:47.230 63 9 xxxxxxxx(具體數據)

能夠明顯看出當SendBufferSize 1時,tcp包發送很是及時(基本上沒有作buffer >.<)

這個時候問題鬼異的問題就來了

先來看看現象

服務器發送一個超過2920數據長度的包

mina代碼約爲這樣 

IoBuffer buffer = ba.allocate(3320, false);
buffer.flip();
session.write(buffer);

網卡底層tcp包就會分紅三個發

數據大小分別是1460 1460 400

測試

內網服務器爲linux 時就會丟了最後一個包即長度爲400的包(5,5.2,5.3都是這樣)

windows和ubuntu沒有問題,這個時候奇怪的問題又來了,咱們的外網linux服務器沒有問題(ps 內網和外網服務器的linux版本是同樣的,仍是同一長碟,但硬件不同)

真NN的奇怪,爲何只有內網的linux纔會這樣,外網的就不會呢,,爲何windows,和ubuntu就不會有這個問題??????

最後咱們把setSendBufferSize設回爲1024就沒有這個問題了

相關文章
相關標籤/搜索