专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

TCP/IP中你应该知道的事

1. 停止等待协议

简单的说就是每次发送一个分组就停下来等待接收端的回应,如果再“超时重传时间”内还未收到回应就重新发送分组,所以应该注意:

  • 每发送完和一个分组后,都要暂时保存已经发送的分组的副本;
  • 分组必须进行编号;
  • “超时重传”应该比分组传输的平均往返时长更长一些。

这里所用到的超时重传在不可靠的传输网络上实现了可靠的通信,这种协议也被称为“自动重传请求”ARQ

2. 连续ARQ

发送发维护“发送窗口”,在发送窗口中的分组都能连续发送出去,不用一个个挨着确认,这样就提高了信道的利用率。

接收方一般都是以累计确认方式发送确认,而不必挨个确认。一般对按序到达的最后一个分组发送确认。

3. TCP报文段首部格式

86_1.png

TCP首部中的标志位:

  • RST:复位,当RST=1时,表示连接出现了严重差错,必须释放连接并且重新建立新的连接;
  • SYN:同步,当SYN=1且ACK=0时表示这是一个建立连接的请求;若接收方同意建立连接,则SYN=1、ACK=1;
  • ACK:确认,仅当ACK=1时确认号字段才有效,在建立连接后,所有的报文段都必须把ACK置1;
  • FIN:终止,当FIN=1时表示报文的发送方的数据已经发送完毕,并请求释放连接。

4. 流量控制

使发送方的发送速率不要太快,要让接收方来得及接受。发送方的发送窗口不能超过接收窗口,并且TCP窗口的单位为字节,而不是报文段。

当接收端进行流量控制时将接收窗口减为0时,表示不允许发送方发送数据了,等到接收方有空余缓冲区时再将接收窗口调大并发送给发送方通知他可以再次发送数据了。但是若这条通知数据再传输的过程中丢失,则发送方会一直等待,为了打破这种死循环,TCP中为每一个连接设置了持续计数器,每次计数完成发送方就会发送一个数据段为1字节的“探测报文段”进行探测。

5. 拥塞控制

拥塞控制与流量控制不同,流量控制是因为接受双方的缓冲区有限而做出的控制,拥塞控制与互联网资源、带宽有关,当网络线路上有太多数据需要发送并且超过网络的承载力时,互联网上的节点就可能丢弃部分数据。

拥塞控制就是防止过多的数据注入到网络中,TCP的拥塞控制有4种方法:慢开始、拥塞避免、快重传、快恢复。

首先,这4种算法都是基于窗口的拥塞控制算法,发送方维护了一个“拥塞窗口”的变量,而拥塞窗口的大小依赖于网络的拥塞程度。发送方让自己的发送窗口等于拥塞窗口。

我们控制拥塞窗口的原则就是:如果没有发生拥塞,就将拥塞窗口增大,如果发生了拥塞,就减小窗口。那么我们如何判断网络是否拥塞?

如果出现了超时就说明网络发生了拥塞。

慢开始:初始时拥塞窗口从1个“最大报文段”SMSS开始以2倍速增长

慢开始门限

当阻塞窗口<慢开始门限,使用慢开始算法;

当阻塞窗口>慢开始门限,使用拥塞避免算法;

当阻塞窗口=慢开始门限,两者都可。

拥塞避免

拥塞避免是指让拥塞窗口每次增加1个SMSS进行缓慢增长,而不是慢开始那样每次都是上一次的2倍的速度增长。

86_2.png

如上图所示,初始状态拥塞窗口从1个报文段开始,然后以“慢开始”算法进行增长,当拥塞窗口>慢开始门限时转为使用拥塞避免算法;当拥塞窗口=24时,即“2”点,发生了超时,则重置拥塞窗口为1个报文段,并且将慢开始门限置为超时前的一半=24/2=12;在“4”点发生了3次冗余ACK,是利用了“快速重传”算法立即通知发送方某个报文段丢失,由于是部分报文段的丢失,所以不启用“慢开始”算法,而是启用“快恢复”算法:调整慢开始门限=拥塞窗口/2,并将拥塞窗口置为当前的一半,然后直接以“拥塞避免”算法开始。

6. TCP连接的建立与释放

三次握手:

86_3.png

四次挥手:

86_4.png

这里需要注意的是TIME-WAIT状态,他表示发送端在接收到接收端的FIN信息后仍需要等待2MSL(最长报文段寿命)才能进入CLOSED状态。原因有很多方面:

(1)当客户端发出最后的ACK后如果立即关闭,如果这条ACK丢失没有传送到接收端,那么接收端还以为这个连接存在,继续维持这个连接。为了防止这种情况,发送方如果在2MSL时间内接收到接收端的重发信息,则可以重发ACK信息,使连接正常关闭;

(2)防止“已失效的连接请求报文段”出现在本连接中,发送端发送完最后ACK后的2MSL可以使本次连接的所有信息都从网络中消失,届时建立新的连接就不会受到“已失效的连接请求报文段”的干扰。

保活计时器

当客户端发生严重错误断开连接时,服务器可能长时间不知道客户端已经被动断开连接而继续维持连接资源,造成资源浪费。为了消除这个问题,TCP设有一个保活计时器,服务器每接收到一个来自客户端的报文段就重置保活计时器,若在保活计时器时间段内无信息来往服务器就主动发送探测报文段,若连续10个探测报文段仍无回应,就可以认为客户端出现故障,关闭连接(类似心跳包)。

文章永久链接:https://tech.souyunku.com/42507

未经允许不得转载:搜云库技术团队 » TCP/IP中你应该知道的事

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们