精华内容
参与话题
问答
  • 在前面的文章中, 我们说过, udp socket中, sendto函数单次发送的最大业务数据是65507字节, 并给出了理论的计算方式。 那么, TCP包同样被IP包包住, 表面上看, 好像是TCP包不能超过65535个字节, 所以send函数...

    在前面的文章中, 我们说过, udp socket中, sendto函数单次发送的最大业务数据是65507字节, 并给出了理论的计算方式。 那么, TCP包同样被IP包包住, 表面上看, 好像是TCP包不能超过65535个字节, 所以send函数不能超过65535个字节, 可实际呢?

           先说结果, 实际上, 如果send函数的长度过大, 那么会分为多个tcp包来发, 如下:

     

    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <errno.h>
    #include <malloc.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/ioctl.h>
    #include <stdarg.h>
    #include <fcntl.h>
     
    int main()
    {
    	int sockSrv = socket(AF_INET, SOCK_STREAM, 0);
     
    	struct sockaddr_in addrSrv;
    	addrSrv.sin_family = AF_INET;
    	addrSrv.sin_addr.s_addr = INADDR_ANY; 
    	addrSrv.sin_port = htons(8765);
     
    	bind(sockSrv, (const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));
     
    	listen(sockSrv, 5);
     
    	struct sockaddr_in addrClient;
    	int len = sizeof(struct sockaddr_in);
     
    	int sockConn = accept(sockSrv, (struct sockaddr *)&addrClient, (socklen_t*)&len);
     
    	unsigned int total = 0;
    	while(1)
    	{
    	    char szRecvBuf[1024 * 64] = {0};
    	    int iRet = recv(sockConn, szRecvBuf, sizeof(szRecvBuf), 0);
    		total += iRet;
    	    printf("iRet is %u, total %u\n", iRet, total);
     
    		getchar(); 
    	}
    	
    	close(sockConn);
    	close(sockSrv);
    	
    	return 0;
    }
    
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <errno.h>
    #include <malloc.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/ioctl.h>
    #include <stdarg.h>
    #include <fcntl.h>
     
    int main()
    {
        int sockClient = socket(AF_INET, SOCK_STREAM, 0);
     
        struct sockaddr_in addrSrv;
        addrSrv.sin_addr.s_addr = inet_addr("127.0.0.1");
        addrSrv.sin_family = AF_INET;
        addrSrv.sin_port = htons(8765);
        connect(sockClient, ( const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));
     
    	char szSendBuf[1024 * 64 * 10] = {0};
    	int iRet = send(sockClient, szSendBuf, sizeof(szSendBuf) , 0); 
    	printf("send size is %d, iRet is %d\n", sizeof(szSendBuf), iRet);
     
        getchar();
     
        close(sockClient);
     
        return 0;
    }
    

     

          测了一下, 客户端的所有数据都能正常发送到服务端(服务端要及时去取, 否则客户端阻塞着呢!)

         这个例子包含了TCP的很多原理, 建议大家实践并理解理论, 这样印象更深刻。

     

    转自:https://blog.csdn.net/stpeace/article/details/74012556

    展开全文
  • TCP/UDP最大长度

    千次阅读 2016-11-22 15:11:48
    对于UDP协议来说,整个包的最大长度为65535,其中包头长度是65535-20=65515; 对于TCP协议来说,整个包的最大长度是由最大传输大小(MSS,Maxitum Segment Size)决定,MSS就是TCP数据包每次能够传输的最大数据分段...


    传输层:

    对于UDP协议来说,整个包的最大长度为65535,其中包头长度是65535-20=65515;

    对于TCP协议来说,整个包的最大长度是由最大传输大小(MSS,Maxitum Segment Size)决定,MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。 通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。

    IP层:

    对于IP协议来说, IP包的大小由MTU决定 。 MTU值越大,封包就越大,理论上可增加传送速率,但MTU值又不能设得太大,因为封包太大,传送时出现错误的机会大增。

    一般默认的设置如下:

    PPPoE连接的最高MTU值是1492

    以太网网(Ethernet)的最高MTU值则是1500

    Internet上,默认的MTU大小是576字节。

    实际UDP的包长度不要超过MTU值,一般不建议超过1K。

    MSS 是是 传输层 概念, 在建立TCP连接过程, 双方的SYN 报文中定义的 , 通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。

    后面的数据传输都是按照确定的MSS进行传输。 MSS会根据物理接口的MTU计算得出 (MSS=MTU-IP头长度-TCP头长度)

    MTU (max transfer unit) 是是 数据链路层 中的概念,需要在 网卡中设置 的,如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就需要进行分片(fragmentation),把数据报分成若干片,这样每一片都小于MTU。


    当在同一个网络上的两台主机互相进行通信时,该网络的MTU是非常重要的。但是如果两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的MTU。重要的不是两台主机所在网络的MTU的值,重要的是两台通信主机路径中的最小MTU。它被称作 路径MTU 。

    判断路径MTU方法

    ============================

    如果某个程序需要判断到达目的端的路途中最小MTU(路径MTU)

    发生ICMP不可达差错的另一种情况是, 当路由器收到一份需要分片的数据报,而在IP首部又设置了不分片(DF)的标志比特。


    ping

     -c 发包次数

     -s 数据大小, 不包括 ip 和 icmp 协议头

     -M [do|dont]  将IP报头的DF位设置

    # ping -c 2 -s 1472 -M do 10.178.72.18

    PING 10.178.72.18 (10.178.72.18) 1472(1500) bytes of data.

    1480 bytes from 10.178.72.18: icmp_seq=1 ttl=52 time=4.36 ms

    1480 bytes from 10.178.72.18: icmp_seq=2 ttl=52 time=4.33 ms

    # ping -c 2 -s 1473 -M do 10.178.72.18

    PING 10.178.72.18 (10.178.72.18) 1473(1501) bytes of data.

    From 172.25.39.106 icmp_seq=1 Frag needed and DF set mtu = 1500 )

    From 172.25.39.106 icmp_seq=1 Frag needed and DF set mtu = 1500 )

    所以路径MTU为1500

    --------------------------------------------

    对于一个以太网来说,TCP的最大报文段长度即MSS一般是1460字节(1500(MTU) - 20(IP head) - 20(TCP head) = 1460 Byte),减去12字节的TCP timestamp option,留给TCP正文数据是 1448字节 。另外,TCP流量控制采用了滑动窗口机制,发送窗口的大小要小于min(接收端通告的接收窗口大小,发送端拥塞窗口大小)。google得知Linux 2.6.39内核之前的TCP实现中,发送端初始拥塞窗口为3,单位是MSS (server机器内核版本未知,估计是2.6.39以前的)。也就是说TCP连接建立后,初始拥塞窗口限制第一次发送的数据长度要小于等于 1448 * 3 = 4344 字节,所以客户端 第一次recv 调用只收到了4344字节 数据。


    展开全文
  • udp最大数据长度是多少

    千次阅读 2018-12-26 15:35:44
    每个udp包的最大大小是多少?  65507 约等于 64K 为什么最大是65507?  因为udp包头有2个byte用于记录包体长度. 2个byte可表示最大值为: 2^16-1=64K-1=65535  udp包头占8字节, ip包头占20字节, ...

    原文地址:https://blog.csdn.net/caoshangpa/article/details/51530685

    每个udp包的最大大小是多少?
        65507 约等于 64K

    为什么最大是65507?
        因为udp包头有2个byte用于记录包体长度. 2个byte可表示最大值为: 2^16-1=64K-1=65535
        udp包头占8字节, ip包头占20字节, 65535-28 = 65507

    如果要发送的udp报文大于65507怎么办?
        需要在应用层由开发者自己分片发送. 分片的粒度最大65507字节. 系统的sendto函数是不支持大于65507字节的单包发送的.


    UDP包头格式:

     

    用php测试结果如下, 当大小为65508时报错.

    ....
    socket_sendto return : 65506
    will send data len : 65507 ...
    socket_sendto return : 65507
    will send data len : 65508 ... //=================< 这里报错

    PHP Warning:  socket_sendto(): unable to write to socket [90]: Message too long in /data/home/nemo/code/test/server_test/udp_client.php on line 25


    测试代码:

        <?php
        $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
         
        $svr_ip = "10.130.2.105";
        $svr_port = 9999;
         
        // 构造一个70KB长度的字符串
        $msg1 = "0123456789";
        $msg2 = '';
        for ($i=0; $i<1024*7; $i++)
        {
            $msg2 .= $msg1;
        }
         
        // 从63KB开始尝试发, 看是否发送失败
        $send_len = 63*1024;
        while (1)
        {
            $msg = substr($msg2, 0, $send_len);
            $len = strlen($msg);
         
            print_r("will send data len : $len ...\n");
         
            $ret = socket_sendto($sock, $msg, $len, 0, $svr_ip, $svr_port);
            if ($ret == false)
            {
                print_r("$len failed.");
                exit;
            }
            $send_len ++;
         
            //print_r($msg);
         
            print_r("socket_sendto return : $ret\n");
         
        }
         
        socket_close($sock);

     


    ---------------------
    作者:zdl1016
    来源:CSDN
    原文:https://blog.csdn.net/zdl1016/article/details/8673377
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 最大UDP数据报长度

    千次阅读 2008-04-11 14:11:00
    理论上,IP数据报的最大长度是65535字节,这是由IP首部16比特总长度字段所限制的。去除20字节的IP首部和8个字节的UDP首部, UDP数据报中用户数据的最长长度为65507字节。但是,大多数实现所提供的长度比这个最大值小...
      理论上,IP数据报的最大长度是65535字节,这是由IP首部16比特总长度字段所限制的。去除20字节的IP首部和8个字节的UDP首部, UDP数据报中用户数据的最长长度为65507字节。但是,大多数实现所提供的长度比这个最大值小。
        我们将遇到两个限制因素。第一,应用程序可能会受到其程序接口的限制。socket API提供了一个可供应用程序调用的函数,以设置接收和发送缓存的长度。对于UDP socket,这个长度与应用程序可以读写的最大UDP数据报的长度直接相关。现在的大部分系统都默认提供了可读写大于8192字节的UDP数据报(使用这个默认值是因为8192是NFS读写用户数据数的默认值)。
        第二个限制来自于TCP/IP的内核实现。可能存在一些实现特性(或差错),使IP数据报长度小于65535字节。
        作者使用sock程序对不同UDP数据报长度进行了试验。在SunOS 4.1.3下使用环回接口的最大IP数据报长度是3276 7字节。比它大的值都会发生差错。但是从BSD/386到SunOS 4.1.3的情况下,Sun所能接收到最大IP数据报长度为32786字节(即32758字节用户数据)。在Solaris 2.2下使用环回接口,最大可收发IP数据报长度为65535字节。从Solaris 2.2到AIX 3.2.2,发送的最大IP数据报长度可以是65535字节。很显然,这个限制与源端和目的端的实现有关。
        我们在3.2节中提过,要求主机必须能够接收最短为576字节的IP数据报。在许多UDP应用程序的设计中,其应用程序数据被限制成512字节或更小,因此比这个限制值小。例如,我们在10.4节中看到,路径信息协议总是发送每份数据报小于512字节的数据。我们还会在其他UDP应用程序如DNS(第14章)、TFTP(第15章)、BOOTP(第16章)以及SNMP(第25章)中遇到这个限制。
        数据报截断
        由于IP能够发送或接收特定长度的数据报并不意味着接收应用程序可以读取该长度的数据。因此, UDP编程接口允许应用程序指定每次返回的最大字节数。如果接收到的数据报长度大于应用程序所能处理的长度,那么会发生什么情况呢?
        不幸的是,该问题的答案取决于编程接口和实现。
        典型的Berkeley版socket API对数据报进行截断,并丢弃任何多余的数据。应用程序何时能够知道,则与版本有关(4.3BSD Reno及其后的版本可以通知应用程序数据报被截断)。
        SVR4下的socket API(包括Solaris 2.x) 并不截断数据报。超出部分数据在后面的读取中返回。它也不通知应用程序从单个UDP数据报中多次进行读取操作。
        TLI API不丢弃数据。相反,它返回一个标志表明可以获得更多的数据,而应用程序后面的读操作将返回数据报的其余部分。
        在讨论TCP时,我们发现它为应用程序提供连续的字节流,而没有任何信息边界。TCP以应用程序读操作时所要求的长度来传送数据,因此,在这个接口下,不会发生数据丢失。
     
    展开全文
  • IP UDP TCP等最大长度

    2017-03-26 00:36:00
    传输层: 对于UDP协议来说,整个包的最大长度为65535,其中包头长度是65535-20=65515; 对于TCP协议来说,整个包的最大长度是由最大传输大小(MSS,Maxitum Segment Size)决定,MSS就是TCP数据包每次能够传 输的...
  • 为什么端口数量最大限制为65535

    千次阅读 2019-10-06 18:37:31
    在TCP、UDP协议的开头,会分别有16位来存储源端口号和目标端口号,所以端口个数是 2^16-1=65535个。 总结 tcp客户端连接服务端的时候,需要获取本地的临时端口,传输层协议限制了最多只有65535个端口 转载于:...
  • UDP包的最大大小是多少?

    万次阅读 2013-03-14 15:35:28
    每个udp包的最大大小是多少?  65507 约等于 64K 为什么最大是65507?  因为udp包头有2个byte用于记录包体长度. 2个byte可表示最大值为: 2^16-1=64K-1=65535  udp包头占8字节, ip包头占20字节, 65535-28 = ...
  • TCP 、UDP包的最大长度是多少?

    千次阅读 2011-06-16 20:47:00
    传输层: 对于UDP协议来说,整个包的最大长度为65535,其中包头长度是65535-20=65515; 对于TCP协议来说,整个包的最大长度是由最大传输大小(MSS,Maxitum Segment Size)决定,MSS就是TCP数据包每次能够传 输的...
  • TCP 、UDP、IP包的最大长度是多少

    千次阅读 2017-12-02 23:53:57
    UDP:而对于UDP,IP报头占20字节,UDP报头占8字节,则最大的包体为65535(由报文长度字段决定)-20-8=65507,单次传输的数据受限于网络层。 二、网络层 局域网:MTU大约是1500字节,也就是一个IP包可以传输...
  • UDP允许传输的最大长度理论上2^16 - udp head - iphead( 65507 字节 = 65535 - 20 - 8) 但是实际上UDP数据报的数据区最大长度为1472字节。分析如下: 首先,我们知道,TCP/IP通常被认为是一个四层协议系统,...
  • 理论上,IP数据报的最大长度是65535字节,这是由IP首部(图IP协议格式)16比特总长度字段所限制。去除20字节的IP首部(图IP协议格式)和8字节的UDP(图UDP协议格式)首部,UDP数据报中用户的最长长度为65507.但是,大多数...
  • 网传udp传输单次sendto()数据需小于64kb,即65536个字节? 于是我想实测一番 测试结果: 单次传输65507字节正常: ...参考文章:用实际程序来测试udp sendto函数的最大发包大小------为什么是65507? ...
  • TCP 、UDP、IP包的最大长度是多少?

    万次阅读 2012-05-18 16:32:06
    对于UDP协议来说,整个包的最大长度为65535,其中包头长度是65535-20=65515; 对于TCP协议来说,整个包的最大长度是由最大传输大小(MSS,Maxitum Segment Size)决定,MSS就是TCP数据包每次能够传 输的最大数据...
  • 理论上,IP数据报的最大长度是65535字节,这是由IP首部(图3-1)16比特总长度字段所限制的。去除20字节的IP首部和8个字节的UDP首部, UDP数据报中用户数据的最长长度为65507字节。但是,大多数实现所提供的长度比这...
  • 如题,所以声明65535的字节数组是浪费的 另外这个网站有好多java的教程http://tutorials.jenkov.com/ 转载于:https://www.cnblogs.com/cuizhf/archive/2011/11/28/2266410.html...
  • UDP全面分析

    千次阅读 2013-09-23 14:53:40
    IP分片与网络的MTU有关.先来看看MTU: MTU(Maximum Transmission Unit)是网络上传送的最大数据包.MTU的单位是字节....RFC791规定,MTU最大65535个字节,最小是68个字节.当IP层收到一份要发送的IP数据包
  • UDP细节笔记

    2020-07-30 11:12:24
    UDP协议本身,UDP协议中有16位的UDP报文长度字段,即长度不能超过2^16-1=65535字节 以太网的MTU限制 socket的UDP发送缓存区大小 UDP最大长度: (65535-8(UDP包头)-20(IP包头))=65507字节 UDP包理想长度: MTU = ...
  • 运输层UDP协议

    2017-09-30 15:36:39
    //UDP包发送失败不会产生ICMP差错报文?长度字段为2字节(16位),最大表示65535,所以UDP包长度最大65535(含协议头8个字节),但考虑到MTU问题,整包最好不要超过1500字节,避免出现ip层分片。...
  • TCP与UDP基础

    2019-04-22 14:35:55
    理论上,一个IPV4数据报的最大长度是65535字节,这由IPV4头部的16位总长度字段决定 除去20字节的IPV4头部和UDP头部8字节 数据最大长度就是65507字节 实际上:UDP属于传输层,由下至上来看: 以太网(Ethernet)数据帧...
  • 传输层—UDP协议

    2018-07-10 16:24:28
     (2)16位UDP长度:指整个数据报(UDP首部+UDP数据)的长度,UDP首部固定为8字节,UDP数据最大65535-8=65527字节。 (3)16位UDP校验和:检验整个数据报、UDP首部等在数据传输中是否出错...
  • linux udp bind函数说明

    千次阅读 2012-04-16 22:43:54
    1. IP包头部20个字节,其中有包含源IP地址与目标IP地址,报文长度用2个字节表示,说明最大IP大小为65535,如下图所示: 0 4 8 12 16 19 24 31 版本 首部长度 服务类型 长度 ...
  • TCP、UDP数据包传输

    千次阅读 2012-08-06 09:28:01
    UDP和TCP协议利用端口号实现...因为UDP和TCP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。动态端口的范围是从1024到65535。   MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关

空空如也

1 2 3 4 5 ... 9
收藏数 179
精华内容 71
关键字:

udp 最大65535