1、为什么要建立三次连接
确保资源能准确到达,如果只建立2次连接,比如客户端第一次发出消息后,服务端没有返回确认,这时候客户端第二次发出一个消息,然后服务端收到了消息,并告诉客户端我收到了,当客户端与服务端断开连接后,服务端又收到了第一次发送的消息,并回复客户端我收到了,这时候客户端会产生疑问,我并没有向服务端发送消息,为什么会服务端会返回一个消息说我收到了。
2、当一方没有正常发出关闭连接信号会怎样,也就是未发送close(),要看客户端服务端进程是否还存在
客户端与服务端还会保持一段时间的tcp连接,linux中有一个保活机制进行计算时间默认7200秒、探测次数9次、时间间隔75秒
保活机制文件地址:proc/sys/net/ipv4下面
tcp_keepalive_time 保活时间
tcp_keepalive_intvl 保活间隔
tcp_keepalive_probes 探测次数
3、保活机制存在哪些弊端
1) 在出现短暂的网络错误的时候,保活机制会使一个正常的连接断开
2) 保活机制会占用不必要的带宽
4、tcp连接资源回收4种情况
情况1:客户端进程还在,服务端进程还在,2端系统是否会自动回收tcp连接
结果:tcp连接状态为established 不会自动断开连接
情况2:客户端进程不在,服务端进程不在,2端系统是否会自动回收tcp连接
结果: 先kill掉客户端进程后,tcp连接状态进入time_wait,过一段时间会自动回收,服务端会立即回收tcp连接
先kill掉服务端进程后,tcp连接状态进入time_wait,过一段时间会自动回收,客户端会立即回收tcp连接
情况3:客户端进程还在,服务端进程不在,2端系统是否会自动回收tcp连接
结果:先kill掉服务端进程后,tcp连接状态进入fin_wait2,然后连接会自动释放,客户端tcp状态进入close_wait,该状态不会自动回收,kill掉后进入 lask_ack状态
情况4: 客户端进程不在,服务端进程还在,2端系统是否会自动回收tcp连接
结果:先kill掉客户端进程后, tcp连接状态进入time_wait,过一段时间会自动回收,服务端会立即回收tcp连接