前面有篇隨筆比較了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...