请教一个问题,考虑在以太网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数据报?

解决方案 »

  1.   

    send是在用户态执行,进入内核态完成拷贝,然后返回用户态
    你如何send和下层tcp/ip栈没有任何关系, 你当作是个多线程黑箱子就行了,无论你如何调用send,发送一个字节或者发送超过socket缓冲的数据,
    最终如何发送是tcp/ip栈的实现来完成,和你无关
    而tcp/ip栈的实现,不同操作系统是不同的,所以你也无法确定
    因为这最后还要依赖驱动程序的实现
     
     
      

  2.   

    整个8K以上的字节,WIN10下,整个200KB,速度不错。具体情况,具体调试一下就好了。