您好,登录后才能下订单哦!
图1:TCP 套接字的数据交流进程
上图给出了主机A分2次(分2个数据包)向主机B传递200字节的进程。起首,主机A经过1个数据包发送100个字节的数据,数据包的 Seq 号设置为 1200。主机B为了确认这一点,向主机A发送 ACK 包,并将 Ack 号设置为 1301。
为了包管数据精确抵达,目的机械在收到数据包(包含SYN包、FIN包、通俗数据包等)包后必需立刻回传ACK包,如许发送刚才能确认数据传输胜利。
此时 Ack 号为 1301 而不是 1201,缘由在于 Ack 号的增量为传输的数据字节数。假定每次 Ack 号不加传输的字节数,如许固然可以确认数据包的传输,但无法明白100字节全体准确传递照样丧失了一局部,比方只传递了80字节。因而按如下的公式确认 Ack 号:
Ack号 = Seq号 + 传递的字节数 + 1
与三次握手协定相反,最初加 1 是为了通知对方要传递的 Seq 号。
下面剖析传输进程中数据包丧失的状况,如下图所示:
图2:TCP套接字数据传输进程中发作毛病
上图表现经过 Seq 1301 数据包向主机B传递100字节的数据,但两头发作了毛病,主机B未收到。经由一段工夫后,主机A仍未收到关于 Seq 1301 的ACK确认,因而测验考试重传数据。
为了完成数据包的重传,TCP套接字每次发送数据包时都邑启动准时器,假如在必定工夫内没有收到目的机械传回的 ACK 包,那么准时器超时,数据包会重传。
上图演示的是数据包丧失的状况,也会有 ACK 包丧失的状况,一样会重传。
这个值太大了会招致不用要的等候,太小会招致不用要的重传,实际上最好是收集 RTT 工夫,但又受制于收集间隔与瞬态时延变更,所以实践上运用自顺应的静态算法(例如 Jacobson 算法和 Karn 算法等)来肯定超不时间。
往复工夫(RTT,Round-Trip Time)表现从发送端发送数据开端,到发送端收到来自接纳端的 ACK 确认包(接纳端收到数据后便立刻确认),总共阅历的时延。
TCP数据包重传次数依据零碎设置的分歧而有所差别。有些零碎,一个数据包只会被重传3次,假如重传3次后还未收到该数据包的 ACK 确认,就不再测验考试重传。但有些请求很高的营业零碎,会不时地重传丧失的数据包,以尽最大能够包管营业数据的正常交互。
最初需求阐明的是,发送端只要在收到对方的 ACK 确认包后,才会清空输入缓冲区中的数据。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。