TCP连接需要解决的问题
- 需要让通信双方能感知到对方的存在
- 过程中需要协商一下一些参数,如最大窗口值,时间戳选项,服务质量等
- 双方能够对运输实体资源(如数据缓存大小,连接表中的项目等)进行分配
三次握手的具体过程:
能否使用2次握手:不行
这里假设2次握手后,双方就处于连接建立状态:ESTABLISHED
- 客户端向服务端发送连接建立请求报文A,但是A报文由于某些原因在网络中滞留超时
- 客户端超时重传请求报文B,此时报文B到达服务端,服务端返回报文B的确认报文
- 此时双方建立连接,然后进行数据传输,数据传输完成后进行四次挥手
- 连接释放后,在网络中滞留的报文A到达了服务端,服务端以为客户端又要建立连接
- 然后申请资源,返回报文A的确认报文,处于连接建立状态
- 此时客户端并不知情,然后服务端一致等待客户端数据,此时连接一直存在,资源一直占有,影响计算机资源
能否使用4报文:
多余没必要
四次挥手的详细过程
客户端主动发起断开请求:两次挥手后
此时处于半关闭状态,关闭的是客户端–>服务端这个方向的连接,客户端不能再向服务端发送数据,但是依然可以接受服务端发来的数据。
服务端也没有数据向客户端发送,将进行服务端—>客户端方向的连接的释放:
TIME-WAIT的存在的意义:
客户端为何不直接进入CLOSED状态,还要等2MSL时间呢?
假设,客户端向服务端发送了FIN的确认的报文后,就直接关闭了,但是这个报文在网络传输中,可能会丢失。
然后,服务端那边的FIN报文超时重传定时器到了,又会去重传FIN报文,实际上客户端此时已经不会去理会这个报文了,导致服务端不停的发送FIN重传报文,浪费资源,无法进入关闭状态。
TCP保活定时器
本文中出现的图,来自网络公开课,感兴趣的朋友可以搜一下学习一下,我这里只做学习记录和分享,很感谢老师可以将精品课程分享出来供大家学习:https://www.bilibili.com/video/BV1c4411d7jb?p=62&spm_id_from=pageDriver