🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# TCP三次握手及四次挥手 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200223183443961.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/202002231835041.png) 1. 序列号seq 占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号 2. 确认号ack 确认号指的是期望接受到下一个字节的编号 占1个比特位,仅当ACK=1,确认号字段才有效。ACK=0,确认号无效 4. 同步SYN 连接建立时用于同步序号。当SYN=1,ACK=0表示:这是一个连接请求报文段。 若同意连接,则在响应报文段中使用SYN=1,ACK=1. 5. 终止FIN ==为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?== > 建立连接时,ACK和SYN可以放在一个报文里来发送。而关闭连接时,被动关闭方可能还需要发送一些数据后,再发送FIN报文表示同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。 ==为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?== 最大报文生存时间,MSL是任何报文段被丢弃前在网络内的最长时间。 1、无法保证最后发送的ACK报文会一定被对方收到,所以需要重发可能丢失的ACK报文。 第一、确保被动方能进入CLOSED状态。 对照上图,主动方我们用A表示,被动方用B表示,在四次挥手协议中,当B向A发送Fin+Ack后,A就需要向B发送ACK+Seq报文,A这时候就处于TIME_WAIT 状态,但是这个报文有可能会发送失败,这时候就需要A等待B来确认是否成功,就需要A等待,而且至少要等待两个最大报文长度(发送过去,再反馈回来),当B没有收到时,B会向A再次发送Fin+Ack报文,而A在2MSL内就可以收到Fin+Ack报文,这时A便重新发送,就能确保B进入CLOSED状态。 第二、防止已失效的连接请求报文段出现在本连接中。 客户端在发送完最后一个ACK确认报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。 ## **TCP和UDP的区别 ** 域名解析用UDP协议?为什么区域传送用TCP协议? - 1) TCP是面向连接的,可靠性高;UDP是基于非连接的,可靠性低 - 2) 由于TCP是连接的通信,需要有三次握手、重新确认等连接过程,会有延时,实时性差,同时过程复杂,也使其易于攻击;UDP没有建立连接的过程,因而实时性较强,也稍安全 - 3) 在传输相同大小的数据时,TCP首部开销20字节;UDP首部开销8字节,TCP报头比UDP复杂,故实际包含的用户数据较少。TCP在IP协议的基础上添加了序号机制、确认机制、超时重传机制等,保证了传输的可靠性,不会出现丢包或乱序,而UDP有丢包,故TCP开销大,UDP开销较小 - 4) 每条TCP连接只能时点到点的;UDP支持一对一、一对多、多对一、多对多的交互通信 对实时性要求高和高速传输的场合下使用UDP;在可靠性要求低,追求效率的情况下使用UDP; 需要传输大量数据且对可靠性要求高的情况下使用TCP