全国协议5人面授小班,企业级独立开发考核,转业者的IT软件工程师基地 登录/注册 | 如何报名

免费领取试听课程

并获得专业顾问一对一进行选课辅导

课程名称不能为空
姓名不能为空
手机号码不能为空

领取成功

网络编程十大常见错误

行业新闻 汉码未来 | web 编程 bug

2021-11-15 10:50:39

总结出编程过程中十个最容易犯的错

网络编程十大常见错误

一、TCP不考虑粘包分包。

TCP是面向连接的可靠协议,TCP是一种流式协议,创建TCP套接字的类型是SOCK_STREAM。

许多学生对书本上的话面试如流,在实际TCP编程中却没有处理粘包和分包的代码,以为TCP也像UDP一样,客户机每send一次,服务端只需要recv一次,在本地测试可能也不会有任何问题,一旦到了线上,粘包和分包就会导致逻辑错误甚至程序崩溃。

解决方案:

1.使用流式分析程序来保存当前的状态,比如http-parser流解析;

2.利用缓存push接收到的数据,判断接收到的一帧数据完成后,再取pop进行处理;

可以通过hio_set_unpack在libhv中设置拆封规则,从而支持固定的包长.分隔符.头长字段常用的三种方法,叫它的界面设定拆包规则,然后内部就会按照拆装规则来处理粘包和分包,保证回撤是整包的数据包,大大节约了上层处理粘包和分包的成本。


二、UDP不包括丢失包裹问题。

山东济南汉码未来想告诉大家有些情况下,为了避免TCP三次握手,我们会考虑使用UDP协议,但忽略了系统对丢包的容错能力,未考虑某个关键包丢失所造成的影响,也没有重新传递重组机制。

解决方案:

与FEC.KCP.UDT.QUIC等技术相结合提高可靠性;


三、长连接不考虑应用层心跳。

TCP连接并非真正意义上只有一条物理连接,而是通信双方依靠状态记录维护,从客户端发出SYN请求开始,状态便开始有序转换。在TCP协议本身具有keepalive机制的情况下,不能检测对方是否断线,而TCP协议本身具有很长的默认间隔。还不能携带其他信息,因此非常有必要发送应用层心跳,能够迅速感知掉线以便作出通知和处理,还可以及时关闭fd,腾出相关的资源来节约开支。

解决方案:

用计时器发送心跳信号包,并在未收到响应的情况下断开连接;

可以通过hio_set_heartbeat在libhv中设置心跳;


四、大数据没有考虑到分片和通信控制。

有没有人直接把几十M.上百M甚至数G的文件直接读到内存中发送,试问你家里的TB级内存,经的起那么消耗,另外,不做发送速率控制和流量控制,就会导致网络拥塞。

解决方案:

循环往复从磁盘中读取少量数据再发送到内存,并做好流量控制;

libhv中大型文件的发送示例参见examples/httpd中的largeFileHandler;


五、客户端未考虑断线重连问题。

网中哪一个没有掉线,如果没有断线重连机制,将严重影响用户体验,试想你在玩游戏时,突然掉线,不能给你自动重连,必须重新启动应用程序,对心情有影响吗?

重连延迟策略可以通过TcpClient::setReconnect在libhv中设置;


六、外网未考虑加密通信。

不用SSL/TLS加密的外部网络通讯,就像是在大街上裸奔,毫无隐私可言,安全系数0。

解决方案:

1.SSL/TLS加密通信库,如openssl.gnutls.mbedtls;

2.将SSL代理用于网关,例如将nginx用于反向代理服务;

如openssl.gnutls.mbedtls等SSL/TLS加密通信库,以打开WITH_OPENSSL.WITH_GNUTLS.WITH_MBEDTLS选项进行编译,使用hio_enable_ssl打开SSL/TLS加密通信。


七、SIGPIPE未涉及。

在已接收到RST的socket上执行写入时,内核向进程发送SIGPIPE信号,SIGPIPE信号的缺省行为为终止进程。一般做法是忽略这个信号。


八、字节顺序有大小的问题。

电脑硬件有两种存储方法:大端字节和小端字节序。在网络通讯中,我们通常使用大端字节序列,如果不按相应的字节序进行编码,就会产生错误的译码。


九、多线程发送乱序问题。

尽管TCP保证了重传重组,但我们自己要保证发送数据的有序性,尤其是在多线程发送时,即使锁住了,我们也不能保证先发送哪个线程,除非发送的每一个包都是独立完整的,没有次序,否则会导致混乱。

解决方案:

一般不推荐多线程发送,而是由一个线程负责发送。

hio_write.hio_close在libhv中具有多线程安全性,它允许网络IO事件循环线程中接收数据.拆包组包.反序列化后放入队列,消费线程从队列中删除数据,发送响应并在处理之后关闭连接,这变得更简单。


十.串连错误。

数据系列马上就要送到A去了B。当服务器以fd1接受A的请求,A掉线之后B又恢复在线状态时,POSIX标准要求每一次打开文件时都必须要当前最低限度的文件描述符所以fd1也被指派给B,如果你继续用fd1向A发送数据,B就会被发送到B。

解决方案:

出现这种情况的根本原因在于,fd被用作标记设备,并且需要建立某种机制,以确定socket句柄是否是您希望发送的,例如,在设备连接之后,登录验证携带uuid以唯一标记该设备。


以上就是汉码未来给大家分享的文章,希望对小伙伴们有所帮助,想要了解更多网络编程十大常见错误相关内容的小伙伴可以登录汉码未来官网咨询,主打5人小班,全程面授,主打Java开发,web前端开发等课程,有专业的授课老师为你答疑解惑。

    

分享到:



【免责声明】由于政策等各方面情况的不断调整与变化,本网站所提供的信息仅供参考,请以权威部门公布的正式信息为准。本网站在文章内容来源出处标注为其他平台的稿件均为转载稿,免费转载出于非商业性学习目的,版权归原作者所有。如您对内容、版权等问题存在异议请与本站联系,我们会及时进行处理解决。 删除,请联系客服。
相关推荐
为什么选择汉码未来