抛出问题
近期在搞一个Android上的监控(叫Backdoor也行),基本原理就是通过某jni上面加一层壳,壳中加入一些长连接相关的代码,通过服务端往这个长连接发一些消息,根据消息做出一些动作。其中就需要在网络层面写一些代码,由于以前网络这块比较薄弱,希望整理出个系列专门理一理,然后目标是通过这些做一个高效的非阻塞服务器实现,用在ZeroDB上.
下列的问题是我这边在做的过程中<B>想到</B>的一些问题,会一直更新. 后续对这些问题逐一解答.
- 问题列表
- sock编程里哪些接口可能造成阻塞?
- 阻塞/非阻塞与同步/异步的区别?
- sock的backlog是什么意思?
- 出现不完整的tcp封包应该怎么处理? 如:tcp半包, tcp粘包.
- tcp对断开连接如何感知?
- 滑动窗口为0会怎么样?
- tcp的可靠性体tcp的可靠性现在哪里?
- 应用层缓冲区为什么是必须的?
- linux最多可以维持多少个连接?
- 如何标识某个主机上某个进程的服务?
- 如何在进程中标识线程?(这个是在诊断日志中需要的,在内联汇编中也有提到,就是gettid系统调用)
- 线程模型应该怎么设计比较好?(尤其是非阻塞下的Reator模型,具体应该怎么设计线程模型)
- 多线程是否真能提升性能? (I/O密集型与计算密集型应用的线程模型应该如何选定)
Part I
- 出现不完整的tcp封包应该怎么处理? 如:tcp半包, tcp粘包.
这个问题没什么好讲的,需要自己在tcp的字节流基础上做一层应用层协议。
虽然没啥好讲的,但这个协议应该怎么定也是个大坑。
一般地,要根据需求和应用场景做出一个合理的设计。协议一般要求是可扩展的,另外有个可选的要求是协议解析器能够支持断点。
- tcp的可靠性
(1) tcp可靠性无法保证服务是否可用能被感知.
因此应用层的心跳协议一般是必须的.
(2)某些情况下tcp中的数据可能会有错误.
因此在数据敏感的应用中一定需要增加应用层的校验.
有个考虑不够全面的说法如下:
由于“tcp是面向连接、并提供可靠性保证”,所以应用层不需要考虑包的错误问题.
首先来看看tcp所谓的“可靠性”,它的可靠性应该是相对于udp而言的. tcp的可靠性:
1. 面向连接
2. 传输的数据有序、无错、不重复、不丢
网友评论