1、三次握手四次挥手
(1)为什么挥手比握手多一次
TCP的握手过程主要是为了建立连接,确认双方身份和可用性,确保双方都正确地接收到了对方的请求。这一过程只需要三次即可完成。
但在挥手过程中,通信的双方不仅需要确认连接的断开,还需要确保各自的数据已经全部传输完毕。
所以在server发送ACK后,需要等待client的close()信号,表示对方已经确定没有数据传输了,再发送FIN信号。
(2)TIME_WAIT和CLOSE_WAIT有什么区别
TIME_WAIT:
-
client端在接收到server的FIN并返回ACK后的状态
-
防止最后一个ACK丢失:client需要等待2MSL( 即两倍的报文段最大生存时间)以确保最后一个ACK被server接收
CLOSE_WAIT:
-
server端在收到client的FIN后并返回ACK后的状态
-
然后server会等待client的close()操作
-
server收到close()后会将状态置为LAST_ACK
(3)线上大量的close_wait和time_wait该如何解决?
close_wait原因:
-
客户端没有调用close()关闭连接
time_wait原因:
-
连接超时导致自动断开——用长连接
-
并发大量短连接——用连接池
解决:
-
检查应用程序代码:
-
确保正确发送了关闭信号(如 TCP 的 FIN 包)。
-
避免在短时间频繁地打开和关闭连接
-
检查是否有资源泄漏或其他导致连接无法正确关闭的问题
-
-
调整系统参数:
-
增大系统的文件描述符限制( ulimit -n ),以适应更多的并发连接。
-
调整 TCP 参数, tcp_fin_timeout (控制 TIME_WAIT 状态的持续时间)和 tcp_keepalive_time (控制连接保活探测的频率)
-
考虑增加系统的连接队列长度(如 net.core.somaxconn ),以防止连接因队列溢出而被拒绝。
-
-
使用连接池:
-
减少频繁地创建和关闭连接的开销,降低 CLOSE_WAIT 和 TIME_WAIT 状态的数量。
-
复用已经建立的连接,提高系统的性能。
-
-
检查网络设备和配置
-
使用工具进行诊断
-
优化应用程序逻辑:
-
使用长连接代替短连接,减少连接的建立和关闭次数
-
使用异步 I/O 或非阻塞 I/O 来处理网络连接,提高并发处理能力
-
2、tcp如何保证数据的可靠性
-
校验和:对 数据段进行校验和计算。发送方在发送数据之前计算校验和,并填充在数据段中。接收方收到数据后,会对数据进行同样的校验和计算,并与发送方的校验和进行比对。如果两者不一致,则说明数据传输有误,接收方会要求发送方重新发送数据。
-
超时重传:如果发送方在一定时间内没有收到对于某个数据段的确认应答,它会认为该数据段已丢失或损坏,并触发超时重传机制。发送方会重新发送该数据段,直到收到确认应答或达到最大重传次数。
-
连接管理: TCP 通过三次握手建立连接,并在数据传输完成后通过四次挥手断开连接。这确保了双方都已准备好进行数据交换,并在结束时正常关闭连接。
-
流量控制: TCP 使用滑动窗口协议来控制发送方和接收方之间的数据流量。接收方会在 ACK 中告诉发送方其当前可用的缓冲区大小,发送方则根据这个信息来调整发送速率,避免发送过多的数据导致接收方无法及时处理。
-
拥塞控制: TCP 通过拥塞控制机制来避免网络拥塞。它动态地调整发送速率,以适应网络的拥塞程度。当网络拥塞时,发送方会降低发送速率,以减少数据包的丢失和重传,从而提高网络的稳定性和可靠性。
-
序列号和确认应答: TCP 为每个数据段分配一个唯一的序列号,接收方在收到数据后,会向发送方发送一个包含接收到的数据段序列号的确认应答( ACK )。发送方会等待这些 ACK ,以确认数据是否成功传输。如果发送方没有收到确认应答,或者序列号不连续,它会重新发送丢失或损坏的数据段。
3、一台服务器最多可以建立多少个TCP连接
源端口的可用范围是0~65535,所以理论上,一台服务器可以建立的TCP连接数至少可以达到65536个。