20170906_我是如何讲清楚TCP的三次握手和四次挥手的

来源:互联网 发布:小米盒子破解软件 2016 编辑:程序博客网 时间:2024/04/27 17:49

20170906_我是如何讲清楚TCP的三次握手和四次挥手的

参考博客:http://blog.csdn.net/cmm0401/article/details/68482799

20170330_请说出TCP连接的三次握手和TCP关闭的四次握手


SYN 包:建立连接请求的包

FIN 包:切断TCP 连接的包

ACK 包:针对SYN 包和FIN 包的确认应答包


1、TCP 的特点及其目的:

(1)TCP 是通过校验和、序列号、确认应答信号、重发机制、连接管理以及窗口控制、流量控制、拥塞控制等许多机制来实现数据的可靠性传输。

(2)在TCP 中,当发送端的数据达到接收端主机的时候,接收端主机会返回一个已收到消息的通知,这个通知被称之为“确认应答信号”ACK

(3)TCP 通过肯定的确认应答信号ACK 实现可靠的数据传输。当发送端将数据发出之后便会等待接收端主机的确认应答信号。如果有确认应答,这说明数据已经成功到达了接收端,否则的话,数据包丢失的可能性很大。

*******************************************************************************************************

*******************************************************************************************************

2、TCP建立连接的三次握手:

(1)首先,画出如图1 所示的TCP 三次握手连接示意图,包括客户端主机A 和服务器端主机B。

(2)首先,从网络编程的角度来看,我们会发现,服务器端会首先创建传输控制块TCB 准备接受客户端的连接请求,然后,服务器端就会处于监听状态(LISTEN 状态)以等待客户端的连接请求。如果有请求到来,则作出受理连接请求的响应(accept动作)。

(第1次握手)对于客户端,也是首先创建 传输控制块TCB,然后向服务器端发出 TCP 连接请求报文段 SYN 包(其中,SYN 包 的初始序列号 seq=x,SYN 包中的同步位 SYN=1),发送完该数据包之后,客户端会进入 SYN_SENT 状态(同步已发送状态)。

        这里要知道,TCP 协议规定,SYN 包(即同步位 SYN=1的报文段)不能够携带数据,但是要消耗掉一个序列号。

(第2次握手)服务器端接收到客户端发送过来的连接请求报文段SYN 包 过之后,则会同意建立TCP 连接,所以会反馈一个针对这个SYN 包的 确认应答信号ACK包确认序列号是 ack =x+1;与此同时,服务器自己也会发送一个SYN 包 用来同步连接用SYN 包初始序列号 seq=y)。

因此,在第二阶段,服务器端会把 刚才的 ACK包和SYN包(确认位ACK=1,同步位SYN=1)统一起来形成一个包ACK+SYN包,作为一个包发送给客户端。发送完该数据包之后,服务器端进 SYN_RCVD状态(同步消息收到状态)。

(第3次握手)客户端接收到服务器端反馈回来的 ACK+SYN包 过之后,最后还要向服务器端给出确认,确认应答信号是 ACK包(确认序列号是ack=y+1,确认位ACK=1,而自己的数据包序列号seq=x+1)      当这个包发送完毕后,客户端和服务器端就连接成功了,共同进入 ESTABLELISHED 状态(TCP 连接成功),完成了三次握手。之后的话,就是客户端与服务器端进行数据的交互了。

        这里要知道,TCP 协议规定,ACK报文段可以携带数据,但是如果不携带数据则不会消耗序列号。



*******************************************************************************************************

*******************************************************************************************************

3、TCP 断开连接的四次挥手:

(1)首先,画出如图2所示的TCP 断开连接四次挥手示意图,包括客户端主机A 和服务器端主机B。

(2)当客户端和服务器端的数据交互完成过之后,通信双方就可以释放 TCP连接了。在释放 TCP连接之前,两者都是处于ESTABLISHED 状态的。

(第1次挥手)首先,作为主动关闭TCP 连接的一方,客户端会先向服务器端(被动关闭的一方)发送一个FIN 包序列号seq=u,TCP包首部结束位 FIN位=1) 作为己方准备与对端断开连接的数据包,它说明客户端已经没有数据再需要发送给服务器端了。之后,客户端会进入 FIN_WAIT_1 状态(终止等待1)。

        这里要知道,TCP 协议规定,FIN 包即使不携带数据,也要消耗掉一个序列号。

(第2次挥手)服务器端收到客户端发送过来的 FIN包 过之后,会反馈一个对应的确认应答信号 ACK包(序列号seq=v,确认号ack=u+1,ACK位=1),然后,服务器端就进入 CLOSE_WAIT 状态 了(关闭等待状态)。

    此时,从客户端到服务器端的输出流就关闭了,此时的 TCP 连接 是处于半关闭状态的,即 客户端已经没有数据要发送给服务器端了,但是,若服务器端仍有数据需要发送给客户端,客户端仍然需要接收这个数据,也就是说从服务器端到客户端的这个方向上的连接并未关闭,而且这个状态可能会持续一段时间。

(第3次挥手)当客户端接收到服务器端反馈回来的确认应答信号 ACK包 过之后,就会进入 FIN_WAIT_2 状态 了(终止等待状态2),这时,客户端正在等待着服务器端的 FIN 包。

    与此同时,如果服务器端没有要向客户端发送的数据了,这时,服务器端就可以向对端发送FIN 包(数据包的结束位 FIN位=1),现在假定这个 FIN包 的序列号是 seq=w(在半关闭状态时服务器端可能又发送了一些数据),同时,数据包的确认号仍然是第二次握手中的 ack=u+1。当服务器端发送完这个 FIN包 过之后,服务器端就进入了  LAST_ACK 状态了(最后确认状态),等待着客户端发送过来最后的确认应答信号。

(第4次挥手)在客户端接收到服务器端的 FIN 包 过之后,必须要对这个 FIN 包 进行确认,因此,它会发送给服务器端一个对应的ACK 包(确认号 ack=w+1,序列号 seq=u+1),然后就会进入 TIME_WAIT 状态(时间等待状态),而不是直接进入 CLOSED 状态!

请注意,此时,TCP 连接还没有被释放掉,必须 经过 时间等待计时器(TIME_WAIT timer)设置的时间2MSL之后,客户端才能够进入CLOSED 状态 。与此同时,一旦服务器端顺利接收到这个ACK 包 过之后,服务器端就进入CLOSED 状态了。

另外,MSL,指的是 最长分节生命长度,一般情况下被设置为2分钟。因此,从客户端进入到TIME_WAIT 状态 后,需要经过 2MSL (约等于4分钟)的时间才能进入到 CLOSED 状态,才能开始建立下一个新的TCP 连接。当客户端销毁掉自己的传输控制块TCB过之后,就彻底结束了这次的TCP连接。








原创粉丝点击