BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #25778同步于 2009/7/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

问个网络编程问题

youziboy
2009/7/2镜像同步3 回复
一般MTU= 1500;使用TCP时候MSS=1460 ,每个包的数据大小<1460的话,是不是就传输效率会高啊(这样就可以避免数据分片),因此我们在上层时候发出的数据buffer大小是不是最好少于1460啊。。 一般buffer定义成一个数组char buffer[N] (这个N设置成2048 就没有比设置成1024好呢?)
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
youziboy机器人#1 · 2009/7/2
哦,那就是将缓存设置了1024*8,OS会帮我去处理的。但是是哪种方式好呢?效率高呢
sunway机器人#2 · 2009/7/2
....原来的帖让我删了.... 虽然man udp说系统会使用pmtu避免分片,但我试了一下好像并不是这样...还得再试一下 嗯,答案在下面: man 7 ip: IP_MTU_DISCOVER (since Linux 2.2) Sets or receives the Path MTU Discovery setting for a socket. When enabled, Linux will perform Path MTU Dis- covery as defined in RFC 1191 on this socket. The don't-fragment flag is set on all outgoing datagrams. The system-wide default is controlled by the /proc/sys/net/ipv4/ip_no_pmtu_disc file for SOCK_STREAM sockets, and disabled on all others. For non-SOCK_STREAM sockets, it is the user's resp onsibility to packetize the data in MTU sized chunks and to do the retransmits if necessary. The kernel will reject packets that are bigger than the known path MTU if this flag is set (with EMSGSIZE ). 【 在 youziboy (柚子) 的大作中提到: 】 : 哦,那就是将缓存设置了1024*8,OS会帮我去处理的。但是是哪种方式好呢?效率高呢
sunway机器人#3 · 2009/7/2
总结一下吧: setsockopt里有个SO_SNDBUF/SO_RCVBUF,指定一个socket在内核里的发送/接收缓冲区大小 对于tcp socket,对应的是tcp窗口的大小,如果设定SO_SNDBUF大小为A,则用户态的buffer大小不能超过A,否则会失败. 用户态的send实际只是把buffer里的东西复制到内核里的SNDBUF,实际上这个东西什么时候被发送出去是由tcp的滑动窗口协议决定的. 当滑动窗口决定发送时,它会从SNDBUF取出数据,至于取出多少,会不会造成分片,取决了tcp的mss,或者是否指定了IP_MTU_DISCOVER 选项,如果指定了这个选项,linux会根据RFC 1191,探测PMTU,尽量避免分片,因为有了mss和pmtu,tcp比较容易避免分片. 又因为tcp使用滑动窗口从SNDBUF取数据来发送,所以和用户态设定的buffer大小没什么关系 对于udp socket,实际上根本没有SNDBUF,buffer是直接被发送的(虽然还是可以通过setsockopt指定一个SNDBUF的大小.....),而且man 7 ip也说了,对于sock_stream以外的socket,IP_MTU_DISCOVER选项不起作用,所以对于udp socket,要避免分片必须在sendto时小心指定一个较小的buffer 【 在 youziboy (柚子) 的大作中提到: 】 : 标 题: Re: 问个网络编程问题 : 发信站: 北邮人论坛 (Thu Jul 2 18:17:28 2009), 站内 : : 哦,那就是将缓存设置了1024*8,OS会帮我去处理的。但是是哪种方式好呢?效率高呢 : -- : 我的理想是: 想干啥就可以去干啥~ : : : ※ 来源:·北邮人论坛 http://forum.byr.edu.cn·[FROM: 192.168.3.*]