TCP详解(二) : TCP三次握手、四次挥手

系列文章

TCP详解(一):什么是TCP

TCP详解(二): TCP三次握手、四次挥手

TCP详解(三):TCP流量控制——Flow Control

TCP详解(四):TCP拥堵控制——Congestion Control

TCP详解(五):TCP与UDP的区别

本篇目录

TCP三次握手

TCP连接为什么是三次握手而不是两次握手

TCP四次挥手

TCP握手是三次,为什么挥手是四次

主动方发送最后一个ACK包后,为什么要等待一段时间


TCP三次握手

通过TCP传输真正的数据之前,通信双方需要建立TCP连接,这个建立的过程称为TCP三次握手。

  1. 第一次握手。客户端发送一个特殊的数据包,即SYN包,其SYN控制位设置为1,向服务器表达建立连接的请求,生成一个随机数作为序列号,即seq = x。
  2. 第二次握手。服务端回复一个特殊的数据包,即SYN + ACK包,其ACK控制位设置为1,表示同意了对方的连接请求,其SYN控制位设置为1,表示也想与客户端建立连接的意愿,生成一个随机数作为序列号,即seq = y,确认号设置为ack = x + 1,即在对方数据包的序列号x基础上再加1,表示已确认收到数据。
  3. 第三次握手。客户端回复一个特殊的数据包,即ACK包,其ACK控制位设置为1,自己也同意了服务端的连接请求,确认号设置为ack = y + 1,双方愉快地建立TCP连接。

TCP连接为什么是三次握手而不是两次握手

  1. 避免已经失效的SYN包到达服务端后直接建立连接,浪费资源。
    Case①:客户端发送了一个SYN包,由于网络堵塞,迟迟没能到达服务端。客户端得不到服务端的应答,再次发起一个SYN包,最后两个SYN包都到达服务端,服务端分别回复两个ACK包,如果连接只需要两次握手,那么会建立两个TCP连接,造成不必要的资源浪费。但如果是三次握手,服务端不会针对没有得到客户端确认的SYN包建立TCP连接。
    Case②:客户端只发出了一个SYN包,迟迟未到达服务端,等到达服务端的时候,客户端程序退出了,如果不进行第三次握手,同样会建立不必要的连接,浪费资源。
  2. 为了确认双方发送真正的数据时的起始序列号。在TCP详解(一):什么是TCP一文提到过,TCP会为待传递的数据的每个字节编一个整数编号,假设第一个字节的编号为x,后续字节的编号依次加1。一个TCP数据包的编号(即序列号seq)是该数据包最后一个字节数据的编号。序列号是TCP进行可靠传输的保证,数据的有序重组及数据的完整性都依赖于此。TCP规定,SYN包虽然不携带真正传输的数据,但会消耗一个序列号,而且,SYN包的序列号是一个随机数,纯ACK包(不携带数据且SYN标志位不为1)不消耗序列号。假如客户端SYN包的序列号seq = m,那么服务端回应一个(SYN + ACK)包,即(ack = m + 1,seq = r ,ACK = 1,SYN = 1),表示以收到seq = m的数据包,等待接收seq = m + 1的包。此时如果客户端不回应一个ACK包的话,服务端就不知道seq = r的SYN包对方有没有收到,无法发送下一个数据包给客户端。客户端因为没有确认seq = r的数据包,也不知道接下来服务端发的数据包的序列号是多少。

TCP四次挥手

TCP断开连接时,需要四次挥手。

  1. 第一次挥手。主动关闭的一方发出一个特殊的数据包,其FIN控制位设为1,即FIN包,向对方表达单向断开请求,表示不再向对方发送数据,但仍可接收对方的数据。
  2. 第二次挥手。被动关闭方回复一个特殊的数据包,其FIN控制位设为1,即ACK包,表示同意对方的单向断开请求,断开自己的数据接收通道,不再尝试从对方获取更多数据。但由于自己尚有数据未发送结束,还不能立即关闭数据发送通道。
  3. 第三次挥手。一段时间后,被动方数据发送完毕,发送一个FIN包给对方,表示已无数据再发送。
  4. 第四次挥手。主动方发送一个ACK包给对方,表示双方彻底断开连接,并在等待一段时间后关闭连接。被动方收到ACK包后关闭连接。

TCP握手是三次,为什么挥手是四次

因为在收到主动方的断开请求时,被动方可以关闭数据接收通道,但可能发送通道尚有数据在发送,不能立即关闭数据发送通道,所以这一步不可以直接发一个数据包,同时将ACK和FIN标识位置为1。

主动方发送最后一个ACK包后,为什么要等待一段时间

 是为了确保最后一个ACK包能到达服务端。如果在发送最后一个ACK包后直接关闭。那么如果这个ACK包丢失,那么对方会一直处于LAST_ACK状态而等待该ACK包。

相反如果在发送最后一个ACK包后等待,即使该包丢失,会触发对方重发FIN包,我方再次发送ACK包。

等待的时间的2MSL,MSL表示一个报文在网络中生存的最大时间。

下一篇:TCP详解(三):TCP流量控制——Flow Control

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vincent(朱志强)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值