异想天开

What's the true meaning of light, Could you tell me why

TCP的REST包

日期:2015-03-24 18:27:41
  
最后更新日期:2015-06-02 11:24:49
【技术】
TCP的四次挥手过程中,一般情况下,主动关闭连接方会发送FIN包,然后进入TIME_WAIT状态,被动关闭方则是CLOSED状态。但有时后端服务器会发出REST包:
a.
1.若接收缓冲区还有数据没有被read,主动调用close(fd)关闭连接,则会发出REST包,而不是FIN包。
2.so_linger选项,是否设置该值,即意味着主动关闭方是否优雅的退出。若设置了so_linger,默认为0,即:
[code lang="cpp"]
struct linger {
int l_onoff;
int l_linger;
};
struct linger so_linger;
so_linger.l_onff=1;
so_linger.l_linger=timeout;
setsockopt (fd, SOL_SOCKET, SO_LINGER, &so_linger, sizeof(so_linger));
[/code]
那么不管发送缓冲区有数据未发送完,发送REST包,强制退出。
对于强制退出情况,被动关闭方read会出错,返回ECONNRESET错误码,表明对端强制关闭连接。

b.若客户端向一个没有监听的端口发送数据,该端口没有使用,则产生一个ICMP端口不可达的信息,TCP则使用复位。