TCP通信协议( 五 )


② 初始序列号 ISN 是如何随机产生的?
起始 ISN 是基于时钟的,每 4 毫秒 + 1,转一圈要 4.55 个小时 。RFC1948 中提出了一个较好的初始化序列号 ISN 随机生成算法 。
ISN = M + F (localhost, localport, remotehost, remoteport)
M 是一个计时器,这个计时器每隔 4 毫秒加 1
F 是一个 Hash 算法,根据源 IP、目的 IP、源端口、目的端口生成一个随机数值 。要保证 Hash 算法不能被外部轻易推算得出,用 MD5 算法是一个比较好的选择
UDP

TCP通信协议

文章插图
总结
TCP 向上层提供面向连接的可靠服务,UDP 向上层提供无连接不可靠服务
UDP 没有 TCP 传输可靠,但是可以在实时性要求搞的地方有所作为
对数据准确性要求高,速度可以相对较慢的,可以选用TCP
TCP数据可靠性
一句话:通过校验和、序列号、确认应答、超时重传、连接管理、流量控制、拥塞控制等机制来保证可靠性 。
(1)校验和
在数据传输过程中,将发送的数据段都当做一个16位的整数,将这些整数加起来,并且前面的进位不能丢弃,补在最后,然后取反,得到校验和 。
发送方:在发送数据之前计算校验和,并进行校验和的填充 。接收方:收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方进行比较 。
(2)序列号
TCP 传输时将每个字节的数据都进行了编号,这就是序列号 。序列号的作用不仅仅是应答作用,有了序列号能够将接收到的数据根据序列号进行排序,并且去掉重复的数据 。
(3)确认应答
TCP 传输过程中,每次接收方接收到数据后,都会对传输方进行确认应答,也就是发送 ACK 报文,这个 ACK 报文中带有对应的确认序列号,告诉发送方,接收了哪些数据,下一次数据从哪里传 。
(4)超时重传
在进行 TCP 传输时,由于存在确认应答与序列号机制,也就是说发送方发送一部分数据后,都会等待接收方发送的 ACK 报文,并解析 ACK 报文,判断数据是否传输成功 。如果发送方发送完数据后,迟迟都没有接收到接收方传来的 ACK 报文,那么就对刚刚发送的数据进行重发 。
(5)连接管理
就是指三次握手、四次挥手的过程 。
(6)流量控制
如果发送方的发送速度太快,会导致接收方的接收缓冲区填充满了,这时候继续传输数据,就会造成大量丢包,进而引起丢包重传等等一系列问题 。TCP 支持根据接收端的处理能力来决定发送端的发送速度,这就是流量控制机制 。
具体实现方式:接收端将自己的接收缓冲区大小放入 TCP 首部的『窗口大小』字段中,通过 ACK 通知发送端 。
(7)拥塞控制
TCP 传输过程中一开始就发送大量数据,如果当时网络非常拥堵,可能会造成拥堵加剧 。所以 TCP 引入了慢启动机制,在开始发送数据的时候,先发少量的数据探探路 。
TCP协议如何提高传输效率
一句话:TCP 协议提高效率的方式有滑动窗口、快重传、延迟应答、捎带应答等 。
(1)滑动窗口
如果每一个发送的数据段,都要收到 ACK 应答之后再发送下一个数据段,这样的话我们效率很低,大部分时间都用在了等待 ACK 应答上了 。
为了提高效率我们可以一次发送多条数据,这样就能使等待时间大大减少,从而提高性能 。窗口大小指的是无需等待确认应答而可以继续发送数据的最大值 。
(2)快重传
快重传也叫高速重发控制 。
那么如果出现了丢包,需要进行重传 。一般分为两种情况:
情况一:数据包已经抵达,ACK被丢了 。这种情况下,部分ACK丢了并不影响,因为可以通过后续的ACK进行确认;
情况二:数据包直接丢了 。发送端会连续收到多个相同的 ACK 确认,发送端立即将对应丢失的数据重传 。
(3)延迟应答
如果接收数据的主机立刻返回ACK应答,这时候返回的窗口大小可能比较小 。
假设接收端缓冲区为1M,一次收到了512K的数据;如果立刻应答,返回的窗口就是512K;
但实际上可能处理端处理速度很快,10ms之内就把512K的数据从缓存区消费掉了;
在这种情况下,接收端处理还远没有达到自己的极限,即使窗口再放大一些,也能处理过来;
如果接收端稍微等一会在应答,比如等待200ms再应答,那么这个时候返回的窗口大小就是1M;
窗口越大,网络吞吐量就越大,传输效率就越高;我们的目标是在保证网络不拥塞的情况下尽量提高传输效率 。


推荐阅读