面向连接
面向连接,在服务器与客户端通信之前需要三次握手建立连接,通信之后需要四次挥手断开连接
为什么建立连接:
- 要使每一方能够确知对方存在
- 要允许双方协商一些参数
- 能够对运输实体资源进行分配
三次握手过程
关于三次握手:
A端发送请求后,B端确认后,还要A端也回复B确认,因为网络的拓扑结构,有时候发送的包会在网络中滞留,延迟到达,A要是一段时间收不到回复,会再次发送一个,B收到第二个包回复确认,如果此时A不回复确认,当第一个包到达B,B会认为有两个请求连接,但实际只有一个连接请求,但是在B端会为两个请求分配资源,会浪费资源;或者一个端不断发送SYN请求报文段,但是是恶意行为,做第二次确认回复,如果没有第三次确认,服务器每收到一个请求就分配资源,服务器资源就会被耗费最后奔溃;至于更多次握手是否有必要,其实没有必要,第三次握手确认后,客户端也要分配资源与服务器建立资源,若是客户端有那么多资源和服务器匹敌,其实也没必要攻击服务器。(言语并不专业,不喜勿喷)
四次挥手过程
四次挥手是因为socket通信是全双工通信,当主动断开方请求断开后,被动断开方并不能立即断开,因为可能自己还有一些数据需要处理,得处理完成才能断开
TIME_WAIT的存在必要: 假设主动断开方发送确认后直接进入关闭状态,如果发送的确认报丢失,被动方迟迟没有收到确认回复,再次发送断开请求FIN,但是此时主动方已经关闭,所以就会不理睬被动方发送的报文,不久后,被动方就会异常关闭;另一种情况,主动方发送确认后立即处于关闭,关闭后,主动方又启动了一个一个连接,接口刚好和刚才关闭的连接一样,此时,被动方有一些发送的数据因为一些原因迟到,这个新启动的连接会收到奇怪的数据不知道怎么处理。所以这个状态的存在就是:1.使迟到的数据能够被处理 2.保证最后一个ACK能够传送到被动方同时断开