TCP三次握手,四次挥手问题总结

TCP三次握手,四次挥手问题总结

文章目录

  • TCP三次握手,四次挥手问题总结
    • TCP三次握手,四次挥手解释
    • TCP协议基础
      • TCP服务模型
      • 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报文段可以携带数据,但是如果不携带数据则不会消耗序列号。

TCP三次握手,四次挥手问题总结_第1张图片


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

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

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连接。


TCP三次握手,四次挥手问题总结_第2张图片

TCP协议基础

TCP服务模型

在了解了建立连接、关闭连接的“三次握手和四次挥手”后,我们再来看下TCP相关的东西。

一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号。一个TCP连接通常分为三个阶段:启动、数据传输、退出(关闭)

当TCP接收到另一端的数据时,它会发送一个确认,但这个确认不会立即发送,一般会延迟一会儿。ACK是累积的,一个确认字节号N的ACK表示所有直到N的字节(不包括N)已经成功被接收了。这样的好处是如果一个ACK丢失,很可能后续的ACK就足以确认前面的报文段了。

一个完整的TCP连接是双向和对称的,数据可以在两个方向上平等地流动。给上层应用程序提供一种双工服务。一旦建立了一个连接,这个连接的一个方向上的每个TCP报文段都包含了相反方向上的报文段的一个ACK。

序列号的作用是使得一个TCP接收端可丢弃重复的报文段,记录以杂乱次序到达的报文段。因为TCP使用IP来传输报文段,而IP不提供重复消除或者保证次序正确的功能。另一方面,TCP是一个字节流协议,绝不会以杂乱的次序给上层程序发送数据。因此TCP接收端会被迫先保持大序列号的数据不交给应用程序,直到缺失的小序列号的报文段被填满。

TCP头部

TCP三次握手,四次挥手问题总结_第3张图片

源端口和目的端口在TCP层确定双方进程,序列号表示的是报文段数据中的第一个字节号,ACK表示确认号,该确认号的发送方期待接收的下一个序列号,即最后被成功接收的数据字节序列号加1,这个字段只有在ACK位被启用的时候才有效。

当新建一个连接时,从客户端发送到服务端的第一个报文段的SYN位被启用,这称为SYN报文段,这时序列号字段包含了在本次连接的这个方向上要使用的第一个序列号,即初始序列号ISN,之后发送的数据是ISN加1,因此SYN位字段会消耗一个序列号,这意味着使用重传进行可靠传输。而不消耗序列号的ACK则不是。

头部长度(图中的数据偏移)以32位字为单位,也就是以4bytes为单位,它只有4位,最大为15,因此头部最大长度为60字节,而其最小为5,也就是头部最小为20字节(可变选项为空)。

ACK —— 确认,使得确认号有效。

RST —— 重置连接(经常看到的reset by peer)就是此字段

SYN —— 用于初如化一个连接的序列号。

FIN —— 该报文段的发送方已经结束向对方发送数据。

当一个连接被建立或被终止时,交换的报文段只包含TCP头部,而没有数据

状态转换

三次握手和四次挥手的状态转换如下图。

TCP三次握手,四次挥手问题总结_第4张图片

为什么要“三次握手,四次挥手”

三次握手

客户端和服务端通信前要进行连接,“3次握手”的作用就是双方都能保证自己和对方的收发是正常的

第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。

第二次握手:服务端发包,客户端收到了。这样得出结论:服务端的接收、发送能力是正常的。

第三次握手:客户端发包,服务端收到了。这样能得出结论:客户端的接收、发送能力都是正常的。

这样经历了三次握手过程,客户端和服务端都确认了自己的接收、发送能力正常以后就可以进行发送数据通信了。

视角 客收 客发 服收 服发
客视角 一+二 一+二
服视角 二+三 二+三

四次挥手

TCP连接是双向传输的对等的模式,就是说双方都可以同时向对方发送或接收数据。当有一方要关闭连接时,会发送指令告知对方,我要关闭连接了。这时对方会回一个ACK,此时一个方向的连接关闭。但是另一个方向仍然可以继续传输数据,等到发送完了所有的数据后,会发送一个FIN段来关闭此方向上的连接。接收方发送ACK确认关闭连接。注意,接收到FIN报文的一方只能回复一个ACK, 它是无法马上返回对方一个FIN报文段的,因为结束数据传输的“指令”是上层应用层给出的,我只是一个“搬运工”,我无法了解“上层的意志”

为什么关闭连接却是四次挥手呢?

这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方ACK和FIN一般都会分开发送

扩展可以了解的知识:

ISN 序列号回绕 syn flood攻击 无效连接的监视释放 延缓TCB分配方法 Syn Cache技术 Syn Cookie技术 Syn Proxy防火墙

全连接队列 半连接队列

你可能感兴趣的:(网络编程)