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包