网络编程deep dive(0)

抛出问题

近期在搞一个Android上的监控(叫Backdoor也行),基本原理就是通过某jni上面加一层壳,壳中加入一些长连接相关的代码,通过服务端往这个长连接发一些消息,根据消息做出一些动作。其中就需要在网络层面写一些代码,由于以前网络这块比较薄弱,希望整理出个系列专门理一理,然后目标是通过这些做一个高效的非阻塞服务器实现,用在ZeroDB上.

下列的问题是我这边在做的过程中想到的一些问题,会一直更新. 后续对这些问题逐一解答.

  • 问题列表
  1. sock编程里哪些接口可能造成阻塞?
  2. 阻塞/非阻塞与同步/异步的区别?
  3. sock的backlog是什么意思?
  4. 出现不完整的tcp封包应该怎么处理? 如:tcp半包, tcp粘包.
  5. tcp对断开连接如何感知?
  6. 滑动窗口为0会怎么样?
  7. tcp的可靠性体tcp的可靠性现在哪里?
  8. 应用层缓冲区为什么是必须的?
  9. linux最多可以维持多少个连接?
  10. 如何标识某个主机上某个进程的服务?
  11. 如何在进程中标识线程?(这个是在诊断日志中需要的,在内联汇编中也有提到,就是gettid系统调用)
  12. 线程模型应该怎么设计比较好?(尤其是非阻塞下的Reator模型,具体应该怎么设计线程模型)
  13. 多线程是否真能提升性能? (I/O密集型与计算密集型应用的线程模型应该如何选定)

Part I

  1. 出现不完整的tcp封包应该怎么处理? 如:tcp半包, tcp粘包.

这个问题没什么好讲的,需要自己在tcp的字节流基础上做一层应用层协议。
虽然没啥好讲的,但这个协议应该怎么定也是个大坑。

一般地,要根据需求和应用场景做出一个合理的设计。协议一般要求是可扩展的,另外有个可选的要求是协议解析器能够支持断点。

  1. tcp的可靠性

(1) tcp可靠性无法保证服务是否可用能被感知.
因此应用层的心跳协议一般是必须的.

(2)某些情况下tcp中的数据可能会有错误.
因此在数据敏感的应用中一定需要增加应用层的校验.

有个考虑不够全面的说法如下:

由于“tcp是面向连接、并提供可靠性保证”,所以应用层不需要考虑包的错误问题.

首先来看看tcp所谓的“可靠性”,它的可靠性应该是相对于udp而言的. tcp的可靠性:

1. 面向连接
2. 传输的数据有序、无错、不重复、不丢

你可能感兴趣的:(网络编程deep dive(0))