TCP协议的“三握四挥”过程简述

来源:互联网 发布:郭德纲网络节目 编辑:程序博客网 时间:2024/06/05 12:42

TCP协议的连接建立与连接释放是计算机网络的基础,也是很重要的内容。
首先要明确的是,TCP的运输连接管理分为三个阶段:建立连接、数据传送、连接释放。这篇文章主要分析的是建立连接和释放连接的过程。
其次,TCP连接的建立采用了C/S模式(即客户机-服务器模式),因此,接下来的分析都将以此为基础。

初始状态:

在最开始的时候,客户机与服务器各司其职,并没有发生连接。

这里写图片描述

TCP协议建立连接的三次握手过程:

假设此时,我们客户机需要与服务器建立连接。那么A就会向B发出连接请求报文段,其首部中的同步位 SYN = 1,并选择序号 seq = x,表明传送数据时的第一个数据字节的序号是 x。这就是第一次握手:

这里写图片描述

接下来,服务器需要对客户机的连接请求报文段做出回应,这里我们假设服务器同意客户机的连接请求,则B 在确认报文段中应使 SYN = 1,使 ACK = 1,其确认号ack = x + 1,自己选择的序号 seq = y。这就是第二次握手:

这里写图片描述

A 收到此报文段后向 B 给出确认,其 ACK = 1,确认号 ack = y+1。与此同时,A的TCP告诉向上层应用进程,连接已经建立。这就是第三次握手:

这里写图片描述

而当B收到A的确认报文后,也将向上层应用报告,连接已经建立,此时客户机与服务器之间就可以传输数据了。

这里写图片描述


Tips:
对于客户机和服务器的定义并不是绝对的,我们将主动发起连接的一方叫做客户机,将能够应答的一方称为服务器, 如果TCP连接同时打开,那么双方将既是客户机又是服务器。
ACK位和ack位的意义是不一样的,前者只有0/1两个值,1表示这是一个确认报文,后者则表示在此序号之前的数据都已经收到,现在期望收到序号为此值得数据
ack是对对方发来数据的确认号,而seq则是自己发送的数据的序号
SYN(同步位)仅在建立连接的前两个报文段中使用
SYN置1的报文段虽然不携带数据,但也要消耗掉一个序号


TCP释放连接的四次挥手过程

数据传输结束后,通信的双方都可释放连接。假设现在 A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送数据,主动关闭 TCP连接。A 把连接释放报文段首部的 FIN = 1,其序号seq = u,等待 B 的确认。这是第一次挥手:

这里写图片描述

B 发出确认,确认号 ack = u+1,而这个报文段自己的序号 seq = v。TCP 服务器进程通知高层应用进程。从 A 到 B 这个方向的连接就释放了,TCP 连接处于半关闭状态。B 若发送数据,A 仍要接收(此段Tips中有详细解释)。这是第二次挥手:

这里写图片描述

假设到某一时刻B 已经没有要向 A 发送的数据,其应用进程就通知 TCP 释放连接。携带位FIN = 1, ACK = 1, seq = w, ack= u+1。这是第三次挥手:

这里写图片描述

A 收到连接释放报文段后,必须发出确认。ACK = 1, seq = u + 1, ack = w+1。这是第四次挥手:

这里写图片描述


Tips:
客户机与服务器之间,谁有关闭连接的需求,谁就要发送带FIN位的报文段
半关闭状态:数据的传输方向将变为单向,只能由被动关闭方向主动关闭方传输数据
TCP连接的真正关闭并不是在第四次挥手之后马上进行,而是要等待时间 2MSL(最大报文段生存周期) 后才真正释放掉。这种机制是为了:
一,为了保证 A 发送的最后一个 ACK 报文段能够到达 B。
二,防止 “已失效的连接请求报文段”出现在本连接中。A 在发送完最后一个 ACK 报文段后,再经过时间 2MSL,就可以使本连接持续的时间内所产生的所有报文段,都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。

如果有什么理解有误的地方,欢迎指出~

0 0