zhngs

zhngs

socket编程(3)——tcp陷阱

一.如何正确关闭tcp连接
二.自连接
三.SIGPIPE
四.Nagle
五.reuseaddr

一.如何正确关闭tcp连接

主动关闭端:send() -> shutdown(WR) -> read()=0 -> close()

被动关闭: read()=0 -> 如果没有要发送的数据 -> close()

原因:如果协议栈接收缓冲区有数据,但是程序调用了close,会发送rst分节,强行终止连接,造成发送数据不完整

note:主动关闭的一端无法确定对方是否数据已经收全,对方可能程序crash,read仍然返回0,这时候如果需要更强的保证,可以设计合理的协议来确保对方已经收到

二.自连接

linux协议栈会出现自连接的情况,原因是tcp的同时打开功能,可以在网络库中加简单的判断来避免

三.SIGPIPE

如果向一个已经关闭的socket写数据,会收到SIGPIPE信号,网络库需要忽略这个信号,不然会程序终止

四.Nagle

nagle算法会严重影响请求响应式协议的延时,tcp中应该默认禁用nagle算法

五.reuseaddr

服务端应该设置这个选项,可以保证服务端程序关闭后立刻重启