link
link copied to clipboard
A clojure framework for nonblocking network programming
对于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,在激活时间内把数据发下去。(如果是内网直连的话,就不需要这种骚操作了)
I'm trying to port link to nodejs backend, and it requires changes in: - codec module needs to be ported to nodejs. - tcp - http
Allowing user to provide a `to-retry?` function as reconnect policy. the to-retry function takes several information of current retry loop state like time elapsed, retry count. And user could also...
We should add ability to pass on the event as currently the user defined handle is only allowed for last handler in pipeline.