socket收包缓冲区研究

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包
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值