#网络编程
服务器应该设置SO_REUSEADDR选项
有些人,而且包括很多写书的人,都认为设置SO_REUSEADDR是很危险的,因为这样就允许创建相同的TCP四元组了,会引发问题。这种看法是不对的。在写网络服务器的时候,我们务必设置SO_REUSEADDR选项,这对我们有益无害
理解TCP的有序释放操作
有序释放的目的是确保两端都能在连接拆除之前收到所有来自其对等实体的数据
理解TCP的写操作
对 TCP 连接使用写操作时,最好将写操作理解成将数据复制到发生队列,并通知 TCP 此队列中有新数据的一种操作。实际上,写操作返回时,写操作写出的部分或全部数据可能还在排队等待传输,所以,此时不管是主机还是对等应用程序崩溃了,数据都会丢失
要认识到TCP是一个可靠的,但并不绝对可靠的协议
我们会误以为只要基于 TCP 编程,那么通信的数据必然能够到达对端主机,毕竟 TCP 是可靠的传输协议。然而, TCP 是处在传输层的协议,其可靠性只针对传输层,但是消息最终要达到应用层才算有价值。从传输层到应用层的消息会不会出现问题,可不由 TCP 来保证
记住:TCP是一种流协议
TCP 是一种流协议,这就意味着数据是以字节流的形式传递给接收者的,没有固有的”报文”或”报文边界”的概念。从这方面来说,读取 TCP 数据就像从串行端口读取数据一样——无法预先得知在一次指定的读调用中会返回多少字节
基本套接字 API 的回顾
网络编程必备的基础 API 应用知识
记住:TCP不是轮询的
TCP 不提供连接丢失即时通知最重要的原因与其主要设计目标之一有关:出现网络故障时维护通信的能力。国防部赞助的一项研究要提供一种即使在发生战争或自然灾害这种严重网络损坏的情况下,也能维护可靠网络通信的网络协议,TCP就是这种研究的产物
理解面向连接和无连接协议之间的区别
它们的本质区别在于,对无连接协议来说,每个分组的处理都独立于所有其他分组,而对面向连接的协议来说,协议实现则维护了与后继分组有关的状态信息
提防对等实体的不友好动作
亦如在程序中接受用户的输入前,要对用户的输入进行“安全检测”,以防止恶意输入破坏应用程序的正常运行。可见,防御性编程在编码中是必备的意识,网络编程中也要考虑各种概率看似很小的事件,做出相应的处理动作