月度归档:2016年04月

枝连效应小谈

      今天来公司时看到地铁站里红烧牛肉面的广告, 突发奇想: 广告行业为什么不枝连在一起来宣传? 比如卖汽车的,一般会有一个长得很帅的男模,这时为什么不顺便做服装的生意。一般情况下一个广告(3分钟以内),确实很难让人记住一大推的品牌,但是只有一个也会很无聊, 我想1-3分钟来熟悉3个品牌是很好的, 这三个产品(当然没有竞争关系,而且会有一些相似之处,比如用户品味、依赖关系等)可以一起投资来做一个效果很不错的广告,而且用户也会感觉很亲切,因为团结和结合的东西一般都会很亲民。所以,广告行业也需要打破公司间的壁垒,携手走向共赢。

关键字: 枝连、共赢、广告

udp包长度问题追踪

因为日常开发中我的应用日志一般都是通过udp包在网络上传输的,这样的话,当包长大于一定长度就会报错:

Traceback (most recent call last):
  File "test.py", line 8, in <module>
    sock.sendto(msg, ("127.0.0.1", 5555))
socket.error: [Errno 40] Message too long

测试下来发现,发送内容大于等于8185时就会报错,8184是个最大的安全值。测试程序如下:

client:

# coding=utf-8
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
msg = ""
for i in xrange(0, 1000):
  #msg += "中国你好啊,"
  msg += "hello,"
msg += "\n"
sock.sendto(msg, ("127.0.0.1", 5555))

server 端监听:

nc -ul 127.0.0.1 5555

发现这个现象后从网上找原因,首先是了解到 MTU(Maximum Transmission Unit,最大传输单元)。这个值一般设置都是1500 bytes. 可以通过ipconfig 或是 netstat -i 来查看各个网卡这个值的设置情况。然后去掉IP数据报的首部为20字节,UDP数据报的首部8字节,剩余1472字节用来存储数据。我们可以通过ping(ICMP协议,和UDP一样,报头也占用8个字节)来断定实际包传输情况。

找一个server机(IP 172.19.44.10):

root@jrtool ~]# netstat -i
Kernel Interface table
Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0       1500   0 605731701      0      0      0 663673344      0      0      0 BMRU
lo        16436   0   614404      0      0      0   614404      0      0      0 LRU

然后在其他机器ping:


在server端:

可见本机发UDP包,最大可可发 65507 bytes (udp 理论长度 2^16 – udp head – iphead 也就是 65535-28=65507), 夸机器发包, 会比MTU(1500 大一些),可以达到 8184 ( 2^13 – 8 ). 

结论:

1. udp包最好不要超过1480 (IP 要占去20 bytes)

2. Internet上的标准MTU值为576字节,所以我建议在进行Internet的UDP编程时.    最好将UDP的数据长度控件在548字节(576-8-20)以内

3. udp包长在1500 到 65535 bytes 之间时,一般也可以接收,和发送的buffer设置有关,也和平台有关。

4. udp日志的设置最大就为8184 即可。

5. 系统的MTU是可以设置的,方法是: sudo ifconfig eth0 mtu 5000

 

参考: http://stackoverflow.com/questions/11809727/sendto-returns-values-greater-than-mtu-on-sock-dgram-udp-socket