18-TCP使用的注意事项
-
如果程序向已关闭的管道写数据,返回SIGPIPE信号
-
SIGPIPE信号的默认行为是终止进程。对于命令行通道有好处
-
gunzip -c huge.log.gz | grep ERROR | head 。(如果管道末端的命令执行失败,那么整个管道的程序将会依次收到SIGPIPE。避免了无效的计算。)
-
-
-
当客户端关闭socket时,而服务端仍然往socket写数据会发生什么?
-
client could be offensive or misbehaving, server should be defensive(不懂)
-
-
SIGPIPE在网络编程中的危害:
-
当一个客户端关闭后,服务端向其发送数据,导致SIGPIPE信号发生,导致服务器终止运行,从而影响所有的客户端
-
-
所以,在网络编程中通常忽略SIGPIPE(muduo中是通过全局对象构造来做到这一点)
-
另外,需要注意的是,忽略SIGPIPE后,如果对方关闭了连接,我们的程序可能不会退出,因此,我们需要额外关注一些函数的返回值,例如我们向一个连接请求数据后将它输出到标准输出时,我们需要额外关注printf 函数的返回值,如果它的返回值是负值,则表示对端连接已关闭。那么我们的程序此刻应该退出。
-
Nagle算法、TCP_NODELAY
-
影响请求-相应协议的延迟
-
write有可能会被延迟(将多个write的数据存在一起再发送)
-
建议关闭Nagle算法,即设置TCP_NODELYA选项
Nagle算法:数据只有在写缓存中累积到一定量之后,才会被发送出去,这样明显提高了网络利用率(实际传输数据payload与协议头的比例大大提高)。但是这又不可避免地增加了延时;与TCP delayed ack这个特性结合,这个问题会更加显著,延时基本在40ms左右。当然这个问题只有在连续进行两次写操作的时候,才会暴露出来。
Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段。 所谓“小段”,指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。
测试代码
服务端:
客户端:
