计算机网络——TCP的握手、挥手、流量控制、拥塞控制
1.Tcp
0.什么是TCP?
TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。
1.3次握手

1.3次握手,双方才能知道彼此的发送、接受能力OK
- 第1次握手成功,服务端知道客户端发送能力ok;(客户端状态:SYN_Send)
- 第2次握手成功,客户端知道服务端接收、发送能力都ok;(服务端状态:SYN_REVD)
- 第3次握手成功,服务端知道客户端接收能力ok;(客户端状态:establised、收到ACK后服务端状态:establised)
2.为什么要3次握手?刚开始时客户端出与closed状态,服务端出与listen状态。
1.如果是1次握手肯定不行,因为客户端并不能确定服务端是否可以接收。
2.如果是2次握手,那么当客户端第1次握手发送的请求被服务端正常接收,服务端的第2次握手因为网络延迟没有及时到达客户端时(但此时服务端已经为此次连接使用了资源,准备接收客户端的发送数据),客户端可能又重发了新的第1次握手请求,所以对于客户端来说前1次握手已经作废,但是对于服务端来说却还在维持着连接,造成资源浪费。
3.如果是3次握手,服务端迟迟收不到客户端的第3次握手,就不会建立无效的连接。
3.第3次握手可以携带数据吗?——可以
第1次握手如果SYN报文携带数据,如果恶意攻击服务器,就可以在SYN报文中放入大量数据,这就会让服务器花费很多时间、内存来接收、解析这些数据,导致服务器瘫痪。
第3次握手,因为客户端已经处于established状态,也就是对于客户端来说它已经建立了连接,并且知道服务器的接收、发送能力正常。
2.4次挥手

1.为什么TIME-WAIT状态必须等待2MSL时间?——为了保证Server收到Client的最后1次ACK
MSL是Maximum Segment Lifetime的缩写,报文最大生存时间。
1.保证Server收到Client的最后1次ACK。 如果Client发送的最后1个ACK丢失了,那么Server会超时重传新的FIN+ACK报文段;
- 2MSL就是Client发送的ACK的MSL + Server重发的新FIN+ACK的MSL
2.使本连接内产生的所有报文段都消失, 防止旧的连接出现在下一个连接中。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。
3.流量控制
- TCP 实现可靠传输的方式之一,是通过序列号与确认应答。

1.重传机制:
1.超时重传
重传机制的其中一个方式,就是在发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方的 ACK 确认应答报文,就会重发该数据,也就是我们常说的超时重传。
-
2种情况发生超时重传:
- 1.数据包丢失
- 2.确认应答丢失

-
超时时间应该设置为多少呢?
超时重传时间 RTO 的值应该略大于报文往返 RTT (Round-Trip Time 往返时延,数据从网络一端传送到另一端所需的时间)的值。


2.快速重传
不以时间为驱动,而是以数据驱动重传,收到3次同样的ACK会触发快速重传。
快速重传的问题
-
快速重传机制只解决了一个问题,就是超时时间的问题,但是它依然面临着另外一个问题。就是重传的时候,是重传之前的一个,还是重传所有的问题。
-
比如对于上面的例子,是重传 Seq2 呢?还是重传 Seq2、Seq3、Seq4、Seq5 呢?因为发送端并不清楚这连续的三个 Ack 2 是谁传回来的。
-
根据 TCP 不同的实现,以上两种情况都是有可能的。
2.滑动窗口
- TCP 是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个。这种方式效率较低。
- TCP 引入了窗口这个概念。即使在往返时间较长的情况下,它也不会降低网络通信的效率。那么有了窗口,就可以指定窗口大小,窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。
窗口大小由哪一方决定?
由接收方的决定的
发送方的滑动窗口

接收方的滑动窗口

接收窗口和发送窗口的大小是相等的吗?
接收窗口的大小是约等于发送窗口的大小的
4.拥塞控制
什么是拥塞窗口?和发送窗口有什么关系呢?
- 拥塞窗口 cwnd是发送方维护的一个 的状态变量,它会根据网络的拥塞程度动态变化的。
- 发送窗口的值是swnd = min(cwnd, rwnd)
拥塞窗口 cwnd 变化的规则:

怎么知道当前网络是否出现了拥塞呢?
只要「发送方」没有在规定时间内接收到 ACK 应答报文,也就是发生了超时重传,就会认为网络出现了用拥塞。
拥塞控制有哪些控制算法?

1.慢启动
- cwnd:拥塞窗口
- ssthresh:慢启动门限
规则:cwnd < ssthresh 时,使用慢启动算法。
当发送方每收到一个 ACK,就拥塞窗口 cwnd 的大小就会加 1。(指数级增长)
2.拥塞避免
规则:cwnd >= ssthresh 时,就会使用「拥塞避免算法」
每当收到一个 ACK 时,cwnd 增加 1/cwnd,(线性增长)
网络就会慢慢进入了拥塞的状况了,于是就会出现丢包现象,这时就需要对丢失的数据包进行重传。
3.拥塞发生
当触发了重传机制,也就进入了「拥塞发生算法」
1.超时重传的拥塞发生算法

2.发生快速重传的拥塞发生算法
他与快速恢复算法联合使用
4.快速恢复
快速重传和快速恢复算法一般同时使用,快速恢复算法是认为,你还能收到 3 个重复 ACK 说明网络也不那么糟糕,所以没有必要像 RTO 超时那么强烈。


5.TCP传输为什么可靠?
1.丢弃重复数据。
- 对于重复数据,能够自动丢弃。
2.应答机制
- 当 TCP 收到发⾃ TCP 连接另⼀端的数据,它将发送⼀个确认。这个确认不是⽴即发送,通常将推迟⼏分之⼀秒;
3.超时重发
- 当 TCP 发出⼀个段后,它启动⼀个定时器,等待⽬的端确认收到这个报⽂段。如果不能及时收到⼀个确认,将重发这个报⽂段;
4.流量控制
- TCP 连接的每⼀⽅都有固定⼤⼩的缓冲空间。TCP 的接收端只允许另⼀端发送接收端缓冲区所能接纳的数据,这可以防⽌较快主机致使较慢主机的缓冲区溢出,这就是流量控制。
更多推荐
所有评论(0)