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