目录
TCP
传输控制协议
一种在不可靠的网络上实现可靠数据传输的协议,工作在传输层
TCP如何保证可靠的传输
TCP一般采取6种方法保证数据可靠传输
1、校验和
校验和是指,通过某种计算方式,将要传输的数据计算成为一个值。等到数据传输到位时,接收方可根据再次计算数据并比对校验和来检测数据是否有在传输过程中被改动。注意,校验和正确不一定能说明数据在传输途中没有被改动,但错位一定不对。
计算校验和方式简介:在数据传输的过程中,将发送的数据段都当做一个16位的整数。将这些整数加起来。并且前面的进位不能丢弃,补在后面,最后取反,得到校验和。
具体校验和计算方式参考:https://blog.csdn.net/qq_15437629/article/details/79183076
2、***和确认应答(seq和ack)
***seq:TCP将要传输数据的每个字节的数都都进行编号,这个编号就是***。
确认应答ack:接收方每次接收到数据时,都会进行确认应答。这个应答根据发送方的***seq+1得到,告知发送方已经收到数据的seq,请发送方发生后seq的数据。
***的除确认应答功能外,还有将接收到的数据根据***排序,并且去掉重复***的数据登功能。
3、超时重传
当发送方每次传输数据报文时都会开设一个定时器,该定时器时长为动态计算得到,称之为RTO(Retransmission time-Out,重传超时时间)。若在定时器结束前未收到接收方的确认消息,则会再次发送该数据报文,以增加获得报文的成功率。
(我问了你一些问题,你不回答我就再问一遍,问了几次你还不回答。哼你果然不爱我了,累了,分手吧!)
关于TCP中的其他定时器:https://www.xuebuyuan.com/3264934.html
4、连接管理
在开始传输数据前进行三次握手,并在结束传输时进行四次挥手。
保证可靠数据传输前应当(低成本)保证连接可靠,这样可避免资源浪费、也可减少传输传输时可能发生异常。
三次握手能在传输真正“大”数据前检测双边网络通畅性,四次挥手也能在结束传输时正常关闭双方通信端口。
TCP的三次握手:https://blog.csdn.net/qq_40764917/article/details/107134377(捂脸)
5、流量控制
根据接收方的缓冲区剩余量来调整发送方发送数据的速度,避免因发送速度过快,缓冲区满了而导致的接收方发生丢包现象。
简单来说就是接收方处理不过来的时候,就把窗口缩小,并把窗口值rwnd告诉发送端。
流量控制较详解:https://www.cnblogs.com/kubidemanong/p/9987810.html
关于滑动窗口:https://blog.csdn.net/yao5hed/article/details/81046945
6、拥塞控制
当网络变得拥塞时(传输速度变慢),发送方会调整发送速率,时网络拥塞得以缓解。
拥塞控制采用四个算法实现:慢开始、拥塞避免、快恢复、快重传
{ 拥塞窗口cwnd、 慢开始门限ssthresh }
简单来说:ssthresh=16
慢开始:初始设置cwnd=1,cwnd指数级增加,1,2,4,8...
拥塞避免:但cwnd>=ssthresh ,cwnd开始加法增大。16,17,18...
当网络发送拥塞状况ssthresh/2,cwnd=0,重新开始慢启动
快重传:快重传算法要求首先接收方收到一个失序的报文段后就立刻发出重复确认,而不要等待自己发送数据时才进行捎带确认。接收方成功的接受了发送方发送来的M1、M2并且分别给发送了ACK,现在接收方没有收到M3,而接收到了M4,显然接收方不能确认M4,因为M4是失序的报文段。如果根据可靠性传输原理接收方什么都不做,但是按照快速重传算法,在收到M4、M5等报文段的时候,不断重复的向发送方发送M2的ACK。如果接收方一连收到三个重复的ACK,那么发送方不必等待重传计时器到期,由于发送方尽早重传未被确认的报文段。(呃,感觉有点网络拥塞无关,也有点有关)
快恢复:当收到三个重复的ACK,cwnd=ssthresh/2而不上cwnd=1(慢启动)
四个算法细节:https://www.cnblogs.com/bincoding/p/8976157.html