關於wcf的tcp繫結傳檔案的速率問題的深究

2021-09-06 08:23:03 字數 1191 閱讀 2802

前面有篇隨筆比較了http、tcp和管道繫結的檔案傳輸速率

今天又特意比較了http和tcp每次read的大小,結果是這樣的:

http繫結不管怎麼樣每次都是4096;

tcp繫結與maxbytesperread屬性有關。

測試過程記錄如下:

tcp 客戶端  maxbytesperread="4089"

255 4083 12 4083 4083 4083 4083

tcp 客戶端  maxbytesperread="40890"

255 4095 40884 24654 40884 24651 40884 24651 40884

tcp 客戶端  maxbytesperread="65536"

255 4095 65529 9 65529 6 65529 9 65529 6

tcp 客戶端  maxbytesperread="65538"

255 4095 65532 6 65532 6 3

初步判斷 這是 tcp的流量控制機制導致  每次大小的區別涉及到 tcp的滑動視窗

視窗由16bit定義,所以最大支援65535個位元組的緩衝 maxbytesperread基本上等於視窗大小+7

tcp的最大報文長度是65535byte(即64k) 測試發現 最大長度可以達到65538byte(前提是maxbytesperread>65535+7)

在程式中減少迴圈次數可以加快速度

在這篇隨筆中本機wcf的tcp繫結傳檔案流模式60~70mb/s的速度(大概0.38秒),結合這篇隨筆的結論,

將maxbytesperread="65543" 每次read的buffersize設定為65536,結果流模式只需要0.16秒(大概155mb/s),速度提公升了一倍之多。

區域網wcf的tcp繫結流模式原來的2~3mb/s的速度(大概10秒),現在也只需要0.31秒(8.05mb/s)。

這是本人目前測試時流模式下最快速度的設定。

至於http為什麼每次都是4096位元組?還待繼續深究

在tcp的一本書中看到這樣的介紹:

接收方提供的視窗大小通常可以由接收經常控制,這將影響tcp的效能(http在tcp之上)。

迄今為止,sunos,bsd/386和svr4系統仍然使用4096位元組的預設大小……

……對乙太網而言,預設的4096位元組並不是最理想的大小……《tcp/ip協議詳解 卷一:協議》p214

關於wcf的tcp繫結傳檔案的速率問題的深究

前面有篇隨筆比較了http tcp和管道繫結的檔案傳輸速率 今天又特意比較了http和tcp每次read的大小,結果是這樣的 http繫結不管怎麼樣每次都是4096 tcp繫結與maxbytesperread屬性有關。測試過程記錄如下 tcp 客戶端 maxbytesperread 4089 255...

關於重複繫結TCP埠的疑惑?

如果我使用tcplistener繫結本地的7000埠,並啟動監聽。然後,再使用tcpclient繫結本地7000埠,此時需要開啟tcpclient的位址重用設定 tcpclient.client.setsocketoption socketoptionlevel socket,socketoptio...

關於重複繫結TCP埠的疑惑?

如果我使用tcplistener繫結本地的7000埠,並啟動監聽。然後,再使用tcpclient繫結本地7000埠,此時需要開啟tcpclient的位址重用設定 tcpclient.client.setsocketoption socketoptionlevel socket,socketoptio...