TCP为什么是四次挥手
确保数据能够完成传输。
当关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
静默数据段在网络中能够存活的最长时间( MSL)
Timewait的作用
- 保证连接关闭
确认被动关闭方能够正常进入关闭状态。假设B未收到A最后的一个ack,会再次发送FIN消息(第三次挥手),如果A已经CLOSE了,那么B就会一直重试发送。所以A必须要进行一段时间的等待。 - 阻止延迟数据段,防止失效请求在网络中传输
允许老的重复分节在网络中消失。如果一个TCP连接关闭,过了一会又在相同的IP和端口建立新的连接。TCP需要防止之前连接没有传完的数据在新的连接出现。而如果连接处于TIME_WAIT状态,就不会给这个相同IP和端口建立新的连接。之前没有传完的数据将会在TIME_WAIT结束前在网络中消失,因为TIME_WAIT的持续时间是数据的生存时间MSL的两倍。
滑动窗口
动态控制发送方和接收方的窗口大小,确认能收到数据报文的多少,提升发送效率
拥塞控制
慢开始(指数),到达阈值拥塞避免,超时慢开始,快重传(收到3个重复ack)快恢复,
快重传是指发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。