link
link copied to clipboard
TCP与UDP开发对比
对于tcp和udp开发中需要注意的地方的总结。 tcp和udp两兄弟都是在IP之上的协议。几乎是服务器唯二支持的通信方式。其中tcp占得最多。
tcp是流式协议。因为它有拆包和组装的功能。具体表现就是tcp中的半包和粘包问题。所以使用tcp协议传输包式数据的话,一定要在数据中加入能分辨包结尾的机制,否则一旦出现粘包半包,就无法处理了。 udp则是报文式协议。如果数据大小超过ip包的负载,tcp会拆包,而udp会直接丢弃后面一部分。显然,udp就不会出现什么半包粘包的问题了。
tcp具有窗口滑动机制,如果你accept了一个tcp的socket一直不read的话,peer在发送一定的数据之后再write就会阻塞。 udp则没有这种机制,如果你的处理速度低于peer的发送速度,那么IP层在缓存满了之后会直接丢弃新的报文。所以说,udp一定要设置缓存区。
tcp协议会维持channel,而udp不会,udp是无连接的,这一点在很多地方都有体现: 1.tcp如果peer关闭了socket,另一端会收到通知。udp的话,你发送数据和对方收到数据没有任何关系,哪怕你往一台关闭的机器发送udp数据,大多数情况下没有人会阻止你这么做。一切都是ok。 2.在代码上就是tcp有accept,会得到一个新的socket用来通信。而udp则listen之后直接就在那个socket上read和write了。 所以对于udp来说,我们需要自行解决socket和业务实体的映射保持。在udp收到的包中,有ip和port,我们可以通过(ip port)反向发送数据回去。 但是!不可以使用它来做长期的映射。因为在ipv4地址几乎枯竭的现在,ip复用技术被大肆使用,你不知道下一秒,这个ip还是不是它。 所以我们需要设置一个超时时间,这个时间是凭经验去设置的。超过这个时间之后,就将这个实体的addr视作未知,这段时间要对它发数据的话,可以直接报错, 也可以缓存起来,在下次它再发送数据上来的时候,激活新的ip和port,在激活时间内把数据发下去。(如果是内网直连的话,就不需要这种骚操作了)