TCP超详细解析之三次握手,四次挥手,流量控制,滑动窗口)?

0.499字数 2292阅读 116

前面有写了TCP协议的一些介绍,只是说明了,这时一个可靠性的协议,传输具备可靠性。现在就想来专门分析一些,TCP为了保证传输可靠性,提供了什么功能?或者说是如何保证的?
(所有首发数据包的操作都是网卡操作的)

建立可靠的链接(三次握手)

首先在TCP协议进行通信之前,会建立一个连接通道,而这个通道在进行建立之前,需要进行判断,这就是三次握手的主要精髓:

三次握手协议
image.png

主机A为发送端,主机B为客户端。

第一步: 主机A会先发送一个SYN/Seq的信号给主机B,SYN是一个标志位,这是一个同步序号,当TCP建立时会设置为1,而Seq为数据包序号。这时候主机A的状态为SYN/SEND 需要等待主机B的回复,如果在一定的时间没有收到主机B的回复,则会进行重新发送。假设SYN/seq为 SYN=1,seq=200

(先说下这个seq,也叫序列号,代表要发送的数据中的每个字节代表的编号,这里我们需要知道要发送的数据有时候很大,没办法一次性发送完,所以在TCP中会分成好几次发送)

第二步: 主机B如果在网络传输中,主机A发送的数据没有丢失,主机B接收到了,这时候主机B,会解析主机A发送的Seq数据,把主机A中通过序列号,也就是Seq来判断,后面需要发送的数据从哪一个数据开始发送,这里主要是有几个作用:
1.防止SYN攻击,当主机B作为接收端,已经确认发送数据,把ACK发送给主机A确认了,但是主机A如果接收不到的话,为了保证通道能连接,会进行重发,这时候主机B发送完ACK确认应答后,会处于AYN-SEND状态,这时候可能会被恶意的去接收很多没必要的数据,浪费资源。
2.还有一点是会收到主机A发出的重复性的SYN的数据(ACK没收到的情况下)。
3.可以通过这个序列号来判断后面的数据从哪里开始读取,进行数据重新组合。保证顺序性和数据可靠性。

然后继续说,主机B收到主机A的SYN/seq数据后,会返回一个SYN/ACK/seq/ack的信号给主机A。状态变为SYN_REVD,可以接收数据,这个期间容易被SYN攻击。然后返回的信号为
SYN=1,ACK=1(代表确认连接),seq=200,ack=201(代表从201序列号下次从开始传输)

第三步: 如果主机B发回来的应答没有丢失,主机A就接收到SYN/ACK/seq/ack这个信号,这时候主机A状态变为established 已确定连接,并且根据这个信号,再次连接向主机B发送数据。

这就是三次握手。

另外我们上面讲的一些内容有涉及到,重发控制(控制进行重发),确认应答处理(主机B发送给主机A的确认应答)、重复控制(主机B重复接手后,怎么控制是否接收),都是通过SYN 标志位以及seq序列号和确认应答号进行控制的,你们可以思考下,答案都在上面。

四次挥手协议

上面讲的是关于三次握手的,接着讲需要断开连接的时候,是怎么处理的。

如图所示:

具体的步骤如下:

1.主机A发送FIN=1到主机接收端B,主机A的状态变成FIN_WAIT_1
这个时候是处于等待阶段,如果未接收到确认应答还会接着发送。
2.主机B接收到主机A发送的消息后,给主机A回复一个ACK,相当于确认接收到需要关闭连接的消息了,但是这时候因为可能还有其他任务在执行或者其他连接,主机B不会立刻连接。主机A接收到确认应答消息了,这时候不会马上关闭,会更改状态为FIN_WAIT_2,如果在一定的时间段内,主机B没有发来,可以关闭连接的信号,这时候,主机A会主动发送关闭连接的信号,关闭主机B的连接。
3.第三步,主机B在经过一些处理后,发送一个FIN给主机A,告诉他,这时候可以关闭连接了。
4.主机A接收到主机B发来的可以关闭连接信号后,发送一个ACK,表示确认关闭了。

这就是四次挥手协议。

滑动窗口去控制流量的传输

在TCP连接中,如果已经建立连接了,这个时候就会发送数据包,在发送数据包的过程中,如果接收方不能及时接收的话(A发送给B,B发送给A的时候就会网络拥堵,这里主要需要知道在TCP连接过程中,发送端和接收端是全双工的,两个都可以同同时工作(发送和接收)),着就会需要发送方进行控制以避免数据丢失,利用滑动窗口控制可以实现对发送方的流量控制。

如果每次数据传输都要进行包的确认的话,往返之间的越长,网络的吞吐量就越大,为了解决这个问题引入了窗口的概念。

一般来说,TCP传输以分段和分片的方式进行传输的,而窗口能够以更大的单位进行传输,而无需等待每一次的确认应答。但是在最后传输完成后,会在整个窗口进行确认应答。如果有丢失,还是会进行重传的。

image.png

在数据发送端以及数据接收端,都会存在一个缓冲区,当发送端给接收端发送数据时,会先把数据放在缓冲区,这个时候,发送端是无法发送数据的,必须要等到接收端接收到数据给了一个确认接收数据(ACK)以后,这个时候发送端的缓冲区才会被清空,然后会继续往前滑动,如图示。然后才能继续发送数据而接收端,同样需要等待TCP接收端缓冲区的数据被接收后,才能继续接收数据。

在这里我们会把滑动窗口的大小,认为是缓冲区的大小。
这个缓冲区的大小是可以配置的。


image.png
image.png

接收到ACK以后窗口会继续往前滑。

image.png

发送窗口

就是发送端允许连续发送的幀的序号表。发送端可以不等待应答而连续发送的最大幀数称为发送窗口的尺寸。

接收窗口

接收方允许接收的幀的序号表,凡落在 接收窗口内的幀,接收方都必须处理,落在接收窗口外的幀被丢弃。接收方每次允许接收的幀数称为接收窗口的尺寸。
在线滑动窗口演示功能
https://media.pearsoncmg.com/aw/ecs_kurose_compnetw
ork_7/cw/content/interactiveanimations/selective-repeatprotocol/
index.html
TCP
窗口的单位是字节,不是报文段,发送方的发送窗口不能超过接收方接收窗口的值。

关于发送数据的大小的概念。

在建立连接的时候,会通过三次握手的时候确定接收端能够接收的最大消息长度(MSS)。

关于流控制

就是控制让发送端根据接收端能接收的实际接受能力去控制发送数据量的大小。存放在TCP首部。有接收端去设置。不过如果接收端的缓冲区溢出的时候,窗口大小也会变成更小的值,发送给接收端。

结论:
以上所讲的一些包括三次握手,四次挥手,流量控制以及滑动窗口的协议,都是TCP协议为了保证可靠性连接所进行的一些保障。

感谢您阅读我的文章,整理不易,喜欢帮我点个赞,谢谢哈。

推荐阅读更多精彩内容