IP包的上限决定了TCP和UDP的上限。
去掉包头大小就是他们理论的最大值。但是,由于MTU的关系。IP包会被分片。分片的包丢了一片,整个包就被丢弃了。所以在实际中,不会用到那么大的包。

解决方案 »

  1.   

    那么一般用多大的包?TCP和UDP
      

  2.   

    MTU (Maximum Transfer Unit) specifies the maximum transmission unit size of an interface. Each interface used by TCP/IP may have a different MTU value specified. The MTU is usually determined through negotiation with the lower driver, using that lower driver value. However, that value may be overridden. Each media type has a maximum frame size that cannot be exceeded. The link layer is responsible for discovering this MTU and reporting it to the protocols above. NDIS drivers may be queried for the local MTU by the protocol stack. Knowledge of the MTU for an interface is used by upper layer protocols such as TCP, which optimizes packet sizes for each medium automatically. If a network interface card (NIC) driver such as an ATM driver uses LAN emulation mode, it may report that it has an MTU higher than what is expected for that media type. For instance, it may emulate Ethernet but report an MTU of 9180 bytes. Windows NT accepts and uses the MTU size reported by the adapter even when it exceeds the normal MTU for a given media type. Below is a list of Default MTU size for different media.    Network                  MTU(Bytes)
       -----------------------------------
       16 Mbit/Sec Token Ring    17914
       4 Mbits/Sec Token Ring     4464
       FDDI                       4352
       Ethernet                   1500
       IEEE 802.3/802.2           1492
       X.25                        576 
      

  3.   

    那么是否UDP或TCP包一定要小于MTU的值呢?一般程序中,传送100KB的数据量,如何分包?能不能使用50KB/包呢?
      

  4.   

    不是,只是如果你的UDP或TCP包大于MTU,IP层会自动的将包进行分片
      

  5.   

    那么UDP包拆分的必要是什么?如何拆分合理?比如每次要传20KB的东西,应该怎么分?
      

  6.   

    不是UDP或者TCP拆分,是IP包分片。为什么分片,以及如何分,TCP/IP一书中有的讲吧。
      

  7.   

    TCP不用管,TCP层自己负责。UDP,masterz()的那份MTU单子写了,对以太网而言(Ethernet)1500。 
    moden的MTU似乎是300左右的样子,ATM的更小些,记忆中是几十字节。所以UDP包,情况而定,别太大就行了,网络条件好的话,分个几片也关系不大。
      

  8.   

    建议去看看《高级TCP/IP编程》,中国电力出版社出版的,讲了很多TCP/IP的注意事项,看了你就懂了
      

  9.   

    其实,在我看来对分组的最优问题可以通过方程解出,但是这必须要知道你的网络传输速率。也不见得只有网络条件好才分片,由于udp是无链接的协议,不会管到没到达,所以一般说来分片是越少越好。实在是要分片时,要用到活动窗口法。这样既提高了一定的速度也保证了传输的质量。
    也就是由于udp这个缺陷,使他用的比较少。虽然udp更快
      

  10.   

    请介绍tcpip在电力系统数据采集方面的应用。
      

  11.   

    我记得tcp以太网肯定是1500字节,但是udp忘了.
    不过这对应用层编程不受影响,ip层会自动分片的.
      

  12.   

    你们说得不精确,建议看看osi的7层layer……ethernet 1500bytes mtu是对于frame来说的,其中要扣除data link layer frame的header(含mac地址等)+fcs(frame checking sequence),network layer ip协议的header(含ip地址等,应该是20bytes),transport layer的tcp或udp header(含端口号),这么就扣掉不少了。我们编程不需要管那么多,我们只需负责上层的事务,具体如何实现由相应的协议自己定,这就是网络分层管理的优势……ATM协议应该是data link层和物理层的,一个cell 53字节,header占5字节,剩下48字节装数据,但还要扣上层协议的header……
      

  13.   

    Below is a list of Default MTU size for different media.    Network                  MTU(Bytes)
       -----------------------------------
       16 Mbit/Sec Token Ring    17914
       4 Mbits/Sec Token Ring     4464
       FDDI                       4352
       Ethernet                   1500
       IEEE 802.3/802.2           1492
       X.25                        576 受到分片的限制,本来开发中可以不考虑底层怎么分片的,但实际上有些应用还是受到影响的。
    所以,开发中你应该根据系统的需要来分包。
    好比DeltaForce这样的网络游戏,为了保证即便数据丢了,影响不大,每个udp包都很小,在很短的时间间隔中不停的发很小的包,丢一两个也可以接受。
    比如语音通讯,如果你的采样频率很高,则每秒的数据量很大,为了保证即便丢包也能听到连贯的语音,可能会把发包频率调整到(比如)50ms间隔,然后根据采样频率来决定是否有必要减小发包的大小而缩短时间间隔 <50ms
      

  14.   

    楼上的有理,rfc 879中说ip包最大576字节,不过那个rfc是1983年的,现在不知道如何,好像还是有效的……各种说法太多了……还有大家发言前最好三思,免得误人子弟……
      

  15.   

    我用UDP,最大只能傳2K數據,不知道為什么?
    UPD數據包到底能有多大,與什么有關系?
      

  16.   

    就是啊,UDP传输到底有什么限制,根据什么设定一个包的大小?
      

  17.   

    UDP最大是65535-IP包头,可以在socket调用完之后用
             SOCKET s; unsigned short aa;
    int bb;
    char bbuf[1024];
    getsockopt(s,SOL_SOCKET,SO_MAX_MSG_SIZE,(char*)&aa,&bb);
    sprintf(bbuf,"%d",aa);
    AfxMessageBox(bbuf);显示看
      

  18.   

    programCat()老兄,您的<<TCP/IP协议祥解>>是那个出版社的,作者是谁,哪年出版的?....很想找本这方面的书看看...能否不吝介绍一下?...
    [email protected]
      

  19.   

    我用的电子书籍,chinapub上有,我买的光盘。
      

  20.   

    TCP接收包大小问题:
    应用层
       |
       |
     TCP层
       §
       §
      IP
       §
       §
    DATALINK如果作者是问TCP数据包能够带的数据长度
    则是2的16次方减去首部长度,这是理论上,至于是否超过IP报文或者DATALINK最长能够携带的报文段,这由IP层和DATALINK自己处理。
    这就是TCP/IP设计的分层原理。
    TCP数据包的长度受接收方接收窗口大小的限制。
    另外TCP协议避免分片,所以在TCP/IPILLUSTRATE的24章介绍了TCP路径发现。
      

  21.   

    同意masterz的观点,这是经过我测试过的!
      

  22.   

    我也看了TCP/IP详解
    我认为UDP,TCP包最大的大小为IP包的大小65535
    当你调用SENDTO发送UDP包的时候,如果报文长度大于MTU则由IP来自动分片,而对于你来说这是不用知道的。所以在目标机,你RECVFROM的时候你收到的是由目标机将分片重组后的UDP包。所以UDP的最大包,应该与MTU无关。
    对于TCP当你发送一个报文的时候,实际上报文是发送给了IP的写缓冲区,而每帧报文的大小,你是不能加以控制的。与接收方的窗口大小,网络拥塞等有关。由IP层自动加以处理。但每帧的大小最大为IP帧的大小65535。而一般情况下要小得多。
      

  23.   

    老兄门,如何发个65535大小的数据包!我试过就在局域网都不行,  还有PING的时候到底在对哪个端口发数据,自己又是用的哪个口?  能不能对指定的端口发PING指令?我走了很多论坛都解决不了,这里高手众多,希望有人能解答!!!
      

  24.   

    你要发65535大小的数据包,那么在lan(802.3)肯定是不行的,其实你不必考虑数据包的大小,你只需考虑你要发多少数据,然后往port写即可,当然只能分块写了。
    至于ping,采用的是imcp,建议你了解<<tcp/ip技术》三卷书相关内容
      

  25.   

    是icmp,是tcp/ip在network layer的协议,而端口是上层transport层的定义……ping根本不用端口……65535的包是绝对不可能的,无论什么协议在什么传输介质上都行不通……
      

  26.   

    还有freeasfish,无论tcp、udp的数据都是受mtu的限制的……mtu是比较底层的东西,上层的所有协议都受限……
    不知是这本所谓的“TCP/IP详解”讲的不清楚还是你们读的不仔细……
    有兴趣的人还是去看看Cisco出的认证教材吧……
      

  27.   

    Wanting(String [ ] args) 
    tcp,udp在实际中都会分片,分片大小与MTU确实相关。但分片是IP层的事情,由ip层来负责把片重组。所以在TCP,UDP层不应该知道MTU,它们只与IP层打交道。我认为这就是分层的精髓,不知这样对不对。
      

  28.   

    我认为能不能写65535的关键在于,应用层发送这么多数据给TCP,UDP层,它们有没有这么大的缓冲,一次性保留这么多的数据。我想这不是,tcp/ip的关键,毕竟有些api接口可以修改缓存的大小。
      

  29.   

    看看《用TCP/IP进行网际互连》把
      

  30.   

    以太网上ip包最小限制64字节,原因:见清华翻译的计算机网络第三版,
    最大65535,因为IPV4 ip字头上有包长字节,32位,故最大只能是2^32=65535,见tcp/ip详解第1卷
    有问题吗?
    [email protected]