美文网首页
网络编程deep dive(0)

网络编程deep dive(0)

作者: Quasars | 来源:发表于2018-08-12 18:07 被阅读20次

    抛出问题

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

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

    • 问题列表
    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)

          本文链接:https://www.haomeiwen.com/subject/enqsbftx.html