ioctl获取FIONREAD参数 ? ? raw_socket获取为原始分片包接收第一个包大小(icmp60,udp分片1514) ? ? udp_socket获取为协议栈组装包大小(udp发送方60k及为60k,上限为udplen(65535)) ? ? tcp_socket获取为协议栈组装包大小(tcp发送方第一个包长度,初始协商堆积上限tcp窗口基数16位满(65535),阻塞发包方,后滑动窗口大小可协商调整Window size scaling factor(初始握手窗口基数)* Window size value(交互协商倍率))
收包缓冲区测试 udp:发送方发送x大小的包*50000,收方sleep待发完堆积包后recv [8] * 348 = 2784 [60] * 295 = 17700 [128] * 256 = 32768 [158] * 256 = 40448 [159] * 69 = 10971 [1024] * 69 = 70587 [1472] * 69 = 101568 //1514 [1473] * 57 = 83961 //1514+35 [1480] * 57 = 84360 //1514 + 60(34+8+18个0填充) [1500] * 57 = 85500 //1514 + 62(34+28) [2047] * 35 = 71645 [2952] * 35 = 103320 [4095] * 23 = 94158 [4432] * 23 = 101936 [8191] * 12 = 98292 [16383] * 7 = 114681
tcp:收方堆积fionread查询大于SO_RCVBUF,初始连接窗口大小60+kb,周期recv后可读数据10M+超过recv(fd, buf(8M)) 发包方[2047]持续发包 SO_RCVBUF 1048576 fionread 2047 fionread 66588 recv 66588 tcp_len 66588 tcp_cnt 1 fionread 67160 recv 67160 tcp_len 133748 tcp_cnt 2 fionread 141620 recv 141620 tcp_len 275368 tcp_cnt 3 fionread 143080 recv 143080 tcp_len 418448 tcp_cnt 4 fionread 303680 recv 303680 tcp_len 722128 tcp_cnt 5 fionread 308060 recv 308060 tcp_len 1030188 tcp_cnt 6 fionread 651160 recv 651160 tcp_len 1681348 tcp_cnt 7 fionread 975280 recv 975280 tcp_len 2656628 tcp_cnt 8 ...... fionread 7679600 recv 8000800 tcp_len 379808670 tcp_cnt 65 fionread 8117600 recv 8388608 tcp_len 388197278 tcp_cnt 66 fionread 7867032 recv 8188232 tcp_len 396385510 tcp_cnt 67 一次性读取大小8M超过设置缓冲区1M大小,缓冲区大小对收包限制如何体现
注: udp_socket的recv函数单次接收buf长度小于发送方单个udp包大小,多余部分被丢弃,下次recv接收下一个包 tcp_socket的recv可循环接收直至完整接收发送方单个tcp包 ?
|