TCP协议之连接管理、三次握手及四次挥手

连接管理/建立连接的目的

  1. 为什么需要 TCP 连接
    因为连接管理是对不同五元组描述的通信通道进行管理
  2. 什么是连接
    抽象层面上,就是五元组标识的唯一一条通信通道
    TCP 通信过程中,需要保存连接(本地序列号和对方的确认序列号),所以,TCP 协议栈需要针对每个连接,管理上述信息,管理用计算机的语言来讲,就是先描述再组织
    描述:先定义类,每个连接都是一个 Connection 对象
    组织:通过 List/Map组织起来
    OS 层面上,连接就是一个 Connection 对象,包括五元组信息,序号,确认序号等
  3. 建立连接是为了同步初始序列号
  4. 初始序列号是随机的,防止伪造 segement,发起攻击
  5. Socket 和连接的关系
    在这里插入图片描述
    套接字:OS 提供的连接应用层和网络协议栈通信的一组标准接口
    套接字上会绑定相应的连接,实现通信,需要建立连接(握手)和销毁连接(挥手)
  6. 连接的生命周期
    在这里插入图片描述

TCP 三次握手

在这里插入图片描述
起初都是 CLOSE 状态
第一次握手:客户端向服务器发送 SN(初始序列号)、ASN(确认序号) = 0,SYN(请求和服务器建立连接),发送后进入 SYN_SENT 状态,等待服务器确认
第二次握手:服务器收到客户端发来的 SYN 包,向客户端发送 ACK,确认收到包,同时服务器向客户端发送一个自己的 SN(初始序列号),ASN(希望客户端下次发送的序列号)SYN(请求和客户端建立连接)包,服务器进入 SYN_RECV 状态
第三次握手:客户端收到服务器的数据后,向服务器发送 ACK,确认收到包,客户端进入 ESTABLISHED 状态,服务器收到客户端发来的 SYN 包后,变为 ESTABLISHED 状态,完成三次握手,即建立好了连接

TCP 四次挥手

在这里插入图片描述
第一次挥手:A 向 B 发 FIN 包,请求释放连接,序列号等于前面已发送过来的数据的最后一个字节的序号加 1 ,此时,A 进入FIN_WAIT_1(终止等待1)状态
第二次挥手:B 收到 A 释放连接的请求后,向 A 发送 ACK,携带上自己的序列号,此时 B 进入 CLOSE_WAIT(关闭等待状态),A 此时还是终止等待1状态。TCP 服务器通知高层的应用进程,A 向 B 方向的连接就释放了,这时候处于半关闭状态,A 接收到 B的应答后,变为 FIN_WAIT2(终止等待2)状态,等待 B 发送释放连接报文
第三次挥手:B 想要释放连接时,向 A 发送 FIN 包,此时 B 就进入了LAST_ACK(最后确认)状态
第四次挥手:A 收到 B 的连接释放报文后,向 B 发送 ACK,确认收到了,此时,A 进入 TIME_WAIT(时间等待状态),此时连接还没有释放,必须经过 2MSL 后,A 进入 CLOSED 状态,当 B 收到了 ACK后,进入 CLOSED 状态

为什么连接的时候是三次握手,释放的时候是四次挥手?

客户端向服务器发送 SYN 包,服务器收到后,可以直接发送SYN+ACK,ACK 是用来应答客户端,SYN是服务器向客户端发送的建立连接的请求,最后客户端向服务器发送 ACK,所以是三次。
在关闭连接时,A 向 B 发送连接释放报文,B 回应 ACK,但是此时 B 不一定要释放自己的连接,B 可能还要再发送数据,等到 B 数据发送完了,B才会给 A 发送 FIN 包,这两步是不能合并的,等到 A 收到 B 的释放连接,会给 B 回一个 ACK,所以需要四次挥手

为什么不能两次握手?

如果是两次握手,最后客户端不会给服务器回 ACK,只建立好了客户端和服务器之间的连接,没有建立好服务器和客户端的连接,不能通信

为什么不是四次握手?

服务器应答客户端和服务器给客户端发 SYN,两个可以合并,能少则少

为什么不能三次挥手?

A向B发送释放报文,B 回 ACK,但是 B 此时不一定要释放自己的连接,他可能还会发数据,等到 B 不发送数据了,才会向 A 发送 FIN 包,这两步是不能合并的,所以不能三次

为什么 TIME_WAIT 状态需要经过 2MSL(最大报文段生存时间)才能回到 CLOSED 状态?

一般来讲,A 向 B 发送 ACK 时,其实已经可以进入 CLOSED 状态了,但是我们必须假想网络是不可靠的,当 A 向 B 发送 ACK 后,由于网络拥堵或者其他原因,B 在一定时间内没有收到 A 的回应,就会向 A 源源不断地发 FIN 包,告诉 A ,我要断开连接了,所以在 A 发送完 ACK 后,不能立刻关闭,A 必须确认 B 收到了该 ACK,A 就需要重新向 B 发送 ACK,A 在发送完 ACK 后进入 TIME_WAIT 状态(也就是等待 B 确认的时间)A 会设定一个计时器,等待一段时间,这段时间就是 2MSL,在 2MSL 内,如果 A 还收到了 B 发送的 FIN 包,就会重新发 ACK 给 B,再等 2MSL 时间。所谓的 MSL 是指一个片段在网络中最大存活时间, 2MSL 就是一个发送和一个回复所需要的最大时间,过了 2MSL,A 没收到 B 再次发送 FIN 包,则推断 B 已经成功接收了 ACK,A 断开连接进入 CLOSED 状态

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值