以前,也写过网络编程的一些代码,但是写的不太好。仔细想来,还是对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端如何设计的,练练手。