网络编程中的一些问题总结

 以前,也写过网络编程的一些代码,但是写的不太好。仔细想来,还是对tcp/ip协议理解得不够。加上最近看lwip的实现,学习一下github上开源的代码,再练习一下,也有很多收获。


    a)tcp是面向连接的,udp是非连接的。tcp的超时重传和拥塞控制机制,保证了tcp的稳定性。对于广域网这种情况复杂的网络,用tcp比较保险;

    b)要实现高性能服务器编程,最好用epoll,socket采用非阻塞的方式,适时用心跳机制检测socket是否健康;

    c)socket的read和write都要连续运行,即使失败了,比如出现了EINTR,也要继续读写下去;

    d)发送的packet中要显示说明packet的length;

    e)状态机和定时器永远是正确的协议处理方法;

    f)正确处理多核下的socket表示方法,可以用skynet的方式,也可以用多线程多libevent的方式

    g)tcp最好由客户端关闭,这样服务器不会进入TIMEWAIT状态;

    h)局域网测试的结果不代表广域网也ok,所以一定要在不同的场景下试试;

    i)tcp的状态切换机制要烂熟于心;

    j)wireshark的抓包工具要经常使用;

    k)广域网的data必须要加密处理;

    l)connect、read、write、close可以全部用异步回调的方式解决;

    m)定时器完全可以自己实现;

    n)用户侧的checksum可以用复杂一点的算法代替;

    o)用户之间没有交互的话,用http代理也可以;

    p)udp比较适合局域网;

    q)一些实时性的协议比如rtsp,用udp也合适;

    r)udp发送packet的时候,length要小一点,否则ip层强制分包,很容易丢包

    s)无效的socket要及时close,否则内存泄漏;

    t)高效的socket必然涉及到buffer管理,毕竟很多时候packet是写不完、读不完的;

    u)强调时序性的操作,一定要像tcp一样,添加自己的seq和ack;

    v)报文传输最好基于json这种格式,不要严格的format形式,否则不好扩展;

    w)业务的开发一般是基于某一个通信协议的,私有的也好,标准的也罢,这些都不重要,可以有不同的version;

    x)不同的开发语言都有适合自己的framework,但是了解tcpip的基本原理更重要;

    y)可以自己实现一个小的tcpip协议栈加深一下印象,看过lwip的同学,肯定不会认为这是一件很恐怖的事情;

    z)socket + db基本是server开发的主要模式,可以找一个市场上热门的app,想象一下它们的server端如何设计的,练练手。

你可能感兴趣的:(网络编程中的一些问题总结)