2014-06-12 167 views
-1

要通過TCP接收數據,我需要設置一個默認大小的緩衝區,如果我收到的數據包的大小大於此緩衝區,所以我需要循環讀取所有發送的字節。例如,如果我收到4096個字節,並且我的閱讀器緩衝區設置爲1024,那麼我需要循環4次以獲取整個數據包?閱讀TCP數據包緩衝區

每個循環,我在整個連接中訂購了下一個1024字節,或者操作系統的所有4096存儲在內存中,我只是在做一個副本?

一些關於如何在低級別工作的好文章?

回答

1

您的問題與應用層下面的圖層有很大關係,但我會盡力回答它。

您的網絡接口卡(NIC)正在執行收集數據包並等待您的操作系統讀取它們的所有必要任務。最終,當你做一個流讀取時,你從你的操作系統已經保留的內存中拉出,並不斷存儲傳入的信息副本。

要回答你的問題,是的。你肯定在做一個副本。一份拷貝,這些位被讀入你的網卡內的一個緩衝區,你的操作系統把它們放在某個地方,當你進行流讀取時,你拷貝它們。

我不確定一篇好文章與大學級網絡中的一般課程一樣多。我會推薦一本關於這個主題的書,但是我沒有太多關於不同網絡教科書的經驗來提出一個關於另一個的建議。

編輯:我覺得你想知道在執行流讀取時運行的確切代碼。我不知道你是否指定了一種語言,但是這裏有一個指向C#流源的鏈接:Microsoft Stream.cs source code

2

TCP實現的接收緩衝區幾乎肯定大於4KB。因此,發件人不會在發送第二個1KB之前等待您收到第一個1KB。接收小緩衝區只會導致對TCP層的額外調用。

然而,使用小緩衝區發送可能會導致發送「短數據包」,並且由於延遲的ACK和Nagling而導致效率低下。對於典型的以太網和Internet網絡上的TCP,2KB是一個最小的理想發送緩衝區(因爲它比普通的MTU大),但建議使用8KB或更多。