网络协议中链接与断开的握手有何区别?
模块一:互联网和传输层协议
1、传输层协议 TCP:TCP 为什么 3 次握手、挥手是 4 次?
一个 host 主动向另外一个 host 发起连接,成为 syn(Synchroniation),请求同步;
一个 host 主动发起断开请求,称为 FIN(finish),请求完成;
一个主机向另外一个 host 发送数据。称为 PSH(push),数据推送
建立连接过程(三次握手)
因为要保证连接和可靠性约束,TCP 需要给发送方一个响应 ACK,如果一个请求没有响应,发送方会重新发送;
1.1、客户端发送一个 SYN 给服务端(SYN=1,以及一个 seq=xx);
1.2、服务端准备好进行连接,服务端针对客户端的 SYN 给一个 ACK(ACK=xx+1,seq=yy);
注:如果就这样结束,服务端还没有确定好客户端是否已经准备好,如果这时候服务端发送给客户端一个数据,客户端可能还没有准备好接受数据,所以还需要增加一个过程;
1.3、服务端在给客户端发送一个 ACK 的同时,发送一个 SYN(ACK=yy+1,seq=zz);
1.4、客户端准备好之后给服务端一个 ACK;
断开连接过程(4 次挥手)
①、客户端发动一个 FIN 请求;
②、服务端收到请求后给客户回一个 ACK,作为 FIN 的回应
注:这就是与连接时的区别,这时不会同时发送一个 FIN 请求给客户端。因为断开要处理的问题有很多,比如说服务端发送的消息没有得到 ACK;也有可能服务器关闭时自己有很多资源需要释放,因此断开连接不能向建立连接那样,将两条信息合并发送。所以服务器需要等待一段时间,等可以关闭了,然后发一条 FIN 给客户端;
---> TCP 四次挥手的等待时间为什么是 2MSL 而不是 1MSL
2MSL 即两倍的 MSL,TCP 的 TIME_WAIT 状态也称为 2MSL 等待状态,TCP 的一段发起主动关闭,发起最后一个 ACK 包后,即第 3 次握手完成后的一个 ACK 包对方没有收到,那么对方在超时后讲重发第三次握手的 FIN 包,主动关闭端接到重发的 FIN 包后可以在发一个 ACK 应答包。主要就是重发一个丢失的 ACK 包;
③、客户端收到服务器的 FIN 后会再次给服务端发送一个 ACK。
为什么 TIME_WAIT 状态还需要等 2MSL 后才能返回到 CLOSED 状态?
两个存在的理由:1、无法保证最后发送的 ACK 报文会一定被对方收到,所以需要重发可能丢失的 ACK 报文。2、关闭链接一段时间后可能会在相同的 IP 地址和端口建立新的连接,为了防止旧连接的重复分组在新连接已经终止后再现。2MSL 足以让分组最多存活 msl 秒被丢弃。
2、TCP 的封包式:TCP 为什么粘包拆包?
发生原因:tcp 是没有边界的流的形势传输数据,发送数据时会先发送到 socket 缓存区,等到缓存区满的时候才会发送数据,所以当发送的数据报文小于缓存区时则会发生粘包现象,当发送报文大于缓存区时会发生拆包现象。
解决方式:
①定长消息发送:服务端读取既定长度的消息作为一条完整的消息;
②设置消息头:在发送的消息报文头使用一定长度指明消息的长度;
③设置消息边界:使用特殊的字符表示一条消息的结束;如 换行 "\n";
3、TCP 的稳定性:滑动窗口和流量控制是么回事?
当 TCP 发送一个数据,都要收到确认应答。并且是序号是递增的。当上一个包的确认收到了在发送下一个包,这样效率很低,所以引入了窗口的概念,窗口的大小,就是一次消息能发送的最大值,
相应的序列应答,即使中间有丢失,只要收到最后的序列号,就认为是这个序列号之前的都已经成功接受了
,这种模式就是累计确认应答,或者叫累计确认。
窗口实际就是操作系统开辟的缓存空间,发送方和接口方都有分别为接受 窗口和发送窗口。接收端在确认应答的时候会给发送端告知接受窗口的大小以及接受到的最大序号等,发送端会根据大小以及已经发送的数据包计算出下一个窗口的大小,以及序列号。调整发送窗口。
流量控制:依据滑动窗口原理,调整窗口的大小,避免流量过大或者过小;
①窗口探测
当发送窗口降为 0,接受窗口(出问题)迟迟不能发送非 0 的窗口值,会陷入死锁,两边都等待对方。
TCP 有探测机制,发送方在窗口为 0 的时候会启动计时器,等到一定时间会发送消息,探测接受方是否已经发生改变。
②糊涂窗口综合征
接受方出现问题,没有处理接受到的数据,并且不断的返回窗口大小,导致窗口越来越小,甚至发送方只能发送几个字节的数据,这样就导致了资源的浪费。
为了避免出现这种情况,通常会规定接受窗口小于缓存的一半大小时,就直接放回 0,不返回较小的窗口值:
而发送方也会根据条件发送数据(两者都满足才会发送消息):
1)、窗口大小>=MSS 或者数据大小>=MSS
2)、收到之前数据包的 ACK 应答
4、TCP 与 UDP 协议优势与劣势?
① TCP 面向连接的提供可靠的服务,不过效率相对较低,UDP 面向无连接的,是不可靠的服务,传输效率高。
评论