协议特性
面向连接,可靠传输,面向字节流
面向连接
典型问题
建立连接握手为什么是三次?
tcp是面向连接的,通信双方都必须确认对端具有数据收发能力.只是四次没必要,两次不安全.
断开连接挥手为什么是四次?
FIN只能表示对方不在发送数据,不表示对方不再接收数据,因此被动关闭方收到断开连接请求并进行回复后,还可以继续发送数据给对方,只有在确认自己不再发送数据的时候(也就是调用close的时候),才会给对方发送FIN.
主动关闭方进行最后一次回复后为什么会进入TIME_WAIT进行等待,而不是直接CLOSED释放资源?
如果最后一次的ACK丢包了,被动关闭方会对FIN包进行重传
假设没有TIME_WAIT,主动关闭方最后一次回复后直接释放资源,这种情况下一旦新启动一个socket使用了相同的地址信息,重传的FIN包就会对新的socket造成影响,最后一次回复后,进入TIME_WAIT等待一段时间就是为了避免新启动一个socket使用相同的地址信息,但是受到原有连接的影响
TIME_WAIT等待的时间是两个MSL(报文最大生存周期)时间,为了处理有可能重传的FIN,以及等待对重传FIN包的确认回复消失在网络中,完全的避免了重传的数据对新连接造成影响
TIME_WAIT更多的是为了保护客户端(服务端通常就算重启也必须使用相同的地址信息)
一台主机上出现大量的CLOSE_WAIT状态的socket是什么原因?
CLOSE_WAIT是被动关闭方收到FIN进行回复之后出现的状态,会在调用close之后进入下一个状态LAST_ACK,因此一旦一台主机上出现大量的CLOSE_WAIT状态的socket则表示你的程序中可能在对方关闭连接时没有关闭套接字释放资源,这是编程存在的错误,连接断开但是没有关闭套接字
一台主机上出现大量的TIME_WAIT状态的socket是什么原因?
TIME_WAIT是主动关闭方出现的状态,因此一台主机上出现大量的TIME_WAIT,意味着这台主机上进行大量的套接字主动关闭,常见于爬虫服务器(服务器作为主动关闭方)
解决方案:可以调整TIME_WAIT等待时间,也可以设置套接字选项----地址重用
tcp连接管理中的保活机制:
通信双方长时间(默认7200s)没有数据通信,则服务器会间隔(默认75s)向客户端发送保活探测数据包,连续(默认9次)没有响应则认为连接断开,这个时间都是可以通过设置套接字选项进行设置