1、三次握手
1.1 为什么要三次握手
三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
- 第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常
- 第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:对方发送正常,自己接收正常
- 第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送、接收正常
1.2 传了 SYN,为啥还要传 ACK
双方通信无误必须是两者互相发送信息都无误。传了 SYN,证明发送方到接收方的通道没有问题,但是接收方到发送方的通道还需要 ACK 信号来进行验证。
2、四次挥手
第一次,表示client不会发送了,关闭发送通道
第二次,表示server知道了,关闭接受通道
第三次,表示server不会发送了,关闭发送通道
第四次,表示client不会接受了,关闭接受通道
3、Time_Wait问题
当服务器主动断开一个连接时,该端口还会占用2*MSL(TCP包的最大存活时间)的时间,在这个时间段内该端口处于关闭状态,可想而知,如果并发量急剧增加,极容易发生端口耗尽问题,比如说如果Time_Wait=60,端口总数为63500,那么如果 QPS(每秒查询率——Queries-per-second) >= 63500/60,必然会发生端口耗尽问题。
——解决方案:在网络延迟低的情况下,降低Time_Wait的时间;另外可以将连接改为长连接
【为什么会出现Time_Wait问题】
Time_Wait的目的是为了避免因为网络延迟造成数据混乱的问题,比如说因为延迟,前一个连接的数据在后一个连接才到来,此时便无法分辨到底是哪一次的数据。所以加了Time_Wait后,如果超过这个时间段,延迟数据一定会被丢弃,就不会造成数据混乱了。