TCP与UDP有什么区别
- 首先,TCP和UDP都作用与传输层,用于程序之间的数据传输。
区别:
TCP 是基于连接的,而UDP 是基于非连接的TCP 传输数据稳定可靠,适用于网络通讯质量较高的场景。需要准确无误的传输个对方。比如传输文件、浏览网页等。UDP 的优点是速度快,但可能产生丢包,所以适用于对实时性要求较高,但是少量丢包没有太大影响的场景。比如语音通话等等。
TCP协议如何保证可靠传输
TCP协议传输的主要特点是:面向字节流 、传输可靠、面向连接等等,他是依靠以下来保证通讯安全的。
1. 校验和
????在数据传输过程中,将发送的数据段当做一个16位的整数,将这些整数加起来,并且前面的位不能丢弃,补在后面,最后取反 ,得到校验和。
????接收方: 在发送数据前计算校验和,并进行校验和的填充。 ????接收方: 收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方的进行比对。
2(3).序列号与确认应答
????序列号: TCP传输时将每个字节的数据都进行了编号,这就是序列号 ????确认应答: TCP传输的过程中,每次接收方收到数据后,都会对传输放进行应答。也就是ACK报文 。这个ACK报文当中带有对应的确认序列号,告诉发送方,接受了那些数据,下一次的数据从哪里发。
3.超时重传
????在进行TCP传输时,由于确认应答 与序列号 机制,也就是说发送方在发送一部分数据后,都会等待接收方发送的ACK报文,并解析来判断数据是否发送成功。如果发送完数据后,迟迟没有等到接收方的ACK报文,那该怎么办呢?
????首先,发送方没有发送ACK报文的原因有:
- 数据在传输过程中,由于网络原因全部丢包,接收方根本没接收到。
- 接收方接收到了响应的数据,但是发送的ACK报文响应由于网络原因丢包了。
????TCP在解决这个问题时引入了新的机制,超时重传机制。就是发送方在发送数据后的一段时间内会等待接收方响应的ACK报文,如果超时了就对刚才的数据再重新发送。如果是第一个原因,接收方收到二次重发的数据后,便进行ACK应答。如果是第二个原因,接收方发下重新发送的数据已存在(判断存在的根据就是序列号),那么直接丢弃,仍发送ACK应答。
由于TCP传输时保证能够在任何环境下都有一个高性能的通信,因此这个最大超时时间(也就是等待的时间)是动态计算的。
在Linux中(BSD Unix和Windows下也是这样)
超时以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。
重发一次后,仍未响应,那么等待2500ms的时间后,再次重传。
等待4500ms的时间继续重传。以一个指数的形式增长。
累计到一定的重传次数,TCP就认为网络或者对端出现异常,强制关闭连接。
4.连接管理
三次握手与四次挥手
5.流量控制
????接收端在接收到数据后,对其进行处理。如果发送端的发送速度太快,导致接收端的接收缓冲区被填满。此时如果发送端还要发送数据,那么接下来发送的数据会丢包,接着会导致一系列的丢包反应,比如超时重传等等… 而TCP根据接收数据的处理能力,决定发送端发送数据的速度,这个机制就是流量控制。
6.拥塞控制
????拥塞控制的前提是超时重传,两台主机在传输数据包的时候,如果发送方迟迟没有收到接收方反馈的ACK,那么发送方就会认为它发送的数据包丢失了,进而会重新传输这个丢失的数据包。然而实际情况有可能此时有太多主机正在使用信道资源,导致网络拥塞了。重传数据浪费了资源,所以要进行拥塞控制。发送发不知道一次发多少数据合适,所以设置一个拥塞窗口 。
- 慢开始算法 在主机开始发送报文时先设置拥塞窗口cwnd=1;在每次收到新报文的确认后,拥塞窗口加1增加MSS(Max Segment Size)的数值;注意事项:每经过一个传输轮次拥塞窗口cwnd就加倍。
- 拥塞避免算法 慢开始门限:ssthresh:
????当cwnd<ssthresh时,使用慢开始。 ????当cwnd>ssthresh时,使用拥塞避免算法。 ????当cwnd=ssthresh时,慢开始和拥塞避免都可以使用。 ????拥塞避免算法的做法是:发送端的拥塞避免窗口每经过一个往返时延RTT就增加一个MSS大小。无论在慢开始还是拥塞避免算法期间,只要判断网络中出现拥塞,ssthresh设置为拥塞发生时窗口值的一半,拥塞窗口设置为cwnd=1。执行慢开始算法。 - 快重传算法 要求接收方每收到一个失序的报文后就立即发出重复确认,发送方只要连续收到3个重复的确认就立即重传对方尚未收到的数据段。
- 快恢复算法 当发送端收到连续3个重复确认时,就将慢开始门限ssthresh设置当前拥塞窗口的一半;把cwnd值设置成新的ssthresh;按拥塞避免算法继续发送报文
TCP的三次握手和四次挥手 & TCP连接的时候为什么是三次,关闭的时候却是四次
详解TCP三次握手和四次挥手
TIME_WAIT和CLOSE_WAIT的区别在哪?
为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接?
|