請教一個問題,考慮在以太網IPV4環境,TCP發送較大資料時候 send()函式與下層 TCP報文段分節 與 IP資料報分組的問題。
1、應該層要發送較大的資料時,應用代碼中是怎樣的結構進行發送?是下面的這樣的結構嗎?
do
{
(1)Read要發送的資料到 buff[SZ]中
(2.1)如果還有要改善的資料
send(fd_tcp, buff, SZ)
(2.2)如果沒有要發送的資料
退出回圈
} while(1);
2、send()函式發送資料 與 TCP報文段分節 與 IP資料報分組 是怎樣的關系?
閱讀了《UNP》和一些網路文章,進行了整理,有些問題不確定,所以請教一下:

自己整理的 TCP報文發送send函式與下層協議分節分組關系

問題整理:
(1)應用程式中 send(fd_tcp, buff, SZ) 函式發送資料,那這個buff[SZ]定義多大,網上有說1K-10K之類的,這個大小好像與設定的 套接字緩沖區大小設定有關?還需要設定作業系統組態檔之類的嗎?
(2)send(fd_tcp, buff, SZ)呼叫成功以后,資料到達套接字緩沖區,之后由作業系統進行處理。
(3)套接字緩沖區中資料,會被作業系統分成多個 TCP報文段進行發送(TCP1......TCPn)。具體會分成多少個報文段、每個報文段多少位元組,受幾方面影響。不知道這樣理解對不對?
(3.1)接收端由TCP協議中的 "通告視窗",會告訴發送端它還能接收多少資料,也就是接收端的 套接字緩沖區空閑大小。
(3.2)接收端在TCP協議中的MSS欄位告訴發送方其重組緩沖區實際大小,避免分片。通常MSS為1460位元組=MTU-IP首部-TCP首部。
(3.3)所以每個TCP分節大小=TCP首部+小于等于MSS的資料塊 或者是 536位元組(IPV4最小重組緩沖區576-20IP首部-20TCP首部)(《UNP》ch2.11)
(3.4)那么就是一個TCP報文段攜帶的業務資料就最多只有1460位元組?
(3.5)第 TCP1~TCP(n-1)個分節的大小是536位元組~1460位元組?最后一個TCP分節的大小呢?
(4)一個TCP報文段(比如TCP1)又會被分為多個IP資料報,是嗎?
(5)一個IP資料報(比如IP1),如果長度大于鏈路層的MTU則會分為多個鏈路幀。是這樣的吧,書上這樣介紹。
(6)沒明白,一個IP資料報的長度是576~65535,一個TCP報文段分節的MSS受 鏈路層的幀長影響,所以MSS最大只有1460,也就是說實際上一個TCP分節都是在一個IP資料報中就發送完了,不需要分成多個IP資料報?
uj5u.com熱心網友回復:
send是在用戶態執行,進入內核態完成拷貝,然后回傳用戶態你如何send和下層tcp/ip堆疊沒有任何關系, 你當作是個多執行緒黑箱子就行了,無論你如何呼叫send,發送一個位元組或者發送超過socket緩沖的資料,
最終如何發送是tcp/ip堆疊的實作來完成,和你無關
而tcp/ip堆疊的實作,不同作業系統是不同的,所以你也無法確定
因為這最后還要依賴驅動程式的實作
uj5u.com熱心網友回復:
謝謝回復。
作業系統如何去做確實不用管。不過,看網上文章,也覺得,這個發送大小還是有講究的。
uj5u.com熱心網友回復:
整個8K以上的位元組,WIN10下,整個200KB,速度不錯。具體情況,具體除錯一下就好了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/46926.html
標籤:網絡編程
