从零开始的计算机网络基础(图文并茂,1.8w字,面试复习必备) (7)

保证此次连接的数据段从网络中消失。如果客户端直接关闭连接,然后马上建立下一次连接,那么有可能新老连接使用的是同一个端口,旧连接因网络原因滞留在网络中的某些数据就会在新连接建立后到达服务端,这样新老连接的数据教会发生混淆

msl表示报文最大生存时间,2msl表示发送接收一个来回报文的最大生存时间

TCP协议如何来保证数据的顺序性 流量控制

控制发送方的发送速度,让接收方来得及接收而不至于数据丢失。

使用滑动窗口机制,a向b发数据,建立连接时b告诉a我的接收窗口rwnd=n,因此发送窗口的字节量不能大于该窗口。当报文某一字段丢失b会向a发送一个ack报文,Ack=1,ack=上次接收到的序列号队尾+1,新的rwnd;当接收窗口满了也会发送ack报文,当数据全部接受会发送一个ack,rwnd=0

拥塞控制

发送方维持一个拥塞窗口cwnd,该窗口的大小随网络拥塞程度动态变化

开始算法:建立连接时将cwnd设置为最大报文段mss的数值,试探性发送,收到确认信息后逐倍加大cwnd的大小。cwnd有一个门限值,当cwnd < 门限则使用慢开始算法,大于使用拥塞避免,等于则两者即可。

拥塞避免:与慢开算法相比,cwnd不再是逐倍数放大,而是每次加1,让其线性缓慢增长

快重传:要求接收方收到一个失序报文后立即发出确认报文而不是等到需要自己发送数据时在携带该信息。当收到连续3个重复的确认信息时发送方立即重传该缺失报文

快恢复:当发送方连续收到三个重复确认信息后,将慢开始门限减半,然后不执行慢开始而是使用拥塞避免算法使cwnd窗口线性增大

TCP协议怎么保证数据的可靠传输 校验与重传策略

校验策略是说每一个tcp数据都会带着数据的校验和,服务端接收到tcp数据首先会验证校验和,如果验证不对,服务端将丢弃这个tcp数据和不确认收到此报文段(希望发送方重发该数据)。

重传策略是说,每一次数据发送是客户端都会同时起一个定时器,如果在指定时间内没有接收到服务端的确认,就把数据再发一次。定时器时长是一个动态变化的过程,简单来说是由当前网络的拥塞程度和之前定时器时长的加权平均值确立的,但对于使用快恢复算法之后的定时器则只跟当前网络拥塞程度有关。

TCP粘包,TCP拆包 TCP粘包和TCP拆包是什么

通过前面的学习我们知道,TCP协议是面向字节流需要通过Socket获取(/上传)数据。Socket大门不可能是无限大的,它存在一个最大长度。报文大小与Socket大小有下面情况

tcp粘包

如上图中的第一根bar所示,服务端一共读到两个数据包,每个数据包都是完成的,并没有发生粘包的问题,

服务端仅收到一个数据包,这个数据包包含客户端发出的两条消息的完整信息,这个时候基于第一种情况的逻辑实现的服务端就蒙了,因为服务端并不能很好的处理这个数据包,甚至不能处理,这种情况其实就是TCP的粘包问题。

服务端收到了两个数据包,第一个数据包只包含了第一条消息的一部分,第一条消息的后半部分和第二条消息都在第二个数据包中,或者是第一个数据包包含了第一条消息的完整信息和第二条消息的一部分信息,第二个数据包包含了第二条消息的剩下部分,这种情况其实是发送了TCP拆包问题,因为发生了一条消息被拆分在两个包里面发送了,同样上面的服务器逻辑对于这种情况是不好处理的。

什么情况下会发生TCP粘包

TCP连接复用造成的粘包问题

TCP默认使用Nagle算法,该算法会导致TCP粘包

数据包过大造成的粘包问题

网络拥塞造成的TCP粘包

接收方不及时接受缓存区的包,造成一次接受多个包

如何处理粘包、拆包

通常会有以下一些常用的方法:

使用带消息头的协议、消息头存储消息开始标识及消息长度信息,服务端获取消息头的时候解析出消息长度,然后向后读取该长度的内容。

设置定长消息,服务端每次读取既定长度的内容作为一条完整消息,当消息不够长时,空位补上固定字符。

设置消息边界,服务端从网络流中按消息编辑分离出消息内容,一般使用‘\n’。

更为复杂的协议,例如楼主最近接触比较多的车联网协议808,809协议。

网络层 没错,又是一个例子

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywwpy.html