目录
- TCP粘包、分包
- 惊群
- 断开连接,TCP怎么检测的?
- 大量的close wait,如何解 ?
- 双方同时调用close
- 水平触发和边沿触发的区别
TCP粘包、分包
解决:1.应用层协议头前面pktlen;2.为每一个包加上分隔符;(\r\n)
惊群
解决:多个线程共享一个共性内存,里面存有锁,谁得锁谁去响应。
断开连接,TCP怎么检测的?
1、网线断了,网卡会重启。(应用层检测出来)
2、路由器断电,设计 —> 心跳包
3、客户端直接宕机。-------->心跳包
大量的close wait,如何解 ?
ret=recv(),
ret=0时,此时会清理tcp相关的信息之后,才会调用close。(因此会存在大量的close_wait)
解决:把业务层和网络层数据分离,可以直接调用close。
双方同时调用close
哪些情景会出现:
水平触发和边沿触发的区别
边沿触发时,
比如read时,read buffer有500个数据,read(fd,buf,size)size=300,那么读完size=300之后就不会读了,会等待到下一次出发在读,所以一般读的时候会写个循环,一直读到buffer为空;
应用场景:处理大数据
水平触发时,
只要文件描述符关联的读内核缓冲区read buffer非空,有数据可以读取,就一直发出可读信号进行通知,
水平触发可以在业务逻辑上只调用一次recv,边沿触发需要用循环来recv。
水平触发可以使用阻塞模式,边沿模式不能。
两者性能差异非常小,一般小数据使用水平触发LT,大数据使用边沿触发ET。
listen fd最好使用水平触发,尽量不要边沿触发。