TCP在传输之前会进行三次沟通,一般成为三次握手,传输完数据断开的时候要进行四次沟通,一般称为四次挥手
TCP 是应用之间进行通信的 传输控制协议,是面向连接的、可靠的、基于字节流之间的传输层通信协议,由IETF的RFC 793定义
重要的三个标识位(位于TCP报文头部)
ACK : 只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1
SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。
FIN (finis)即完,终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。
1、TCP 建立连接的时候是三次握手
(1)客户端向服务器端发送SYN=1 ACK=0,请求创建链接
(2)服务器端收到创建连接的请求使 SYN=1 和ACK = 1 发送给客户端 表示服务端已经收到请求
(3)客户端拿到ACK=1 进行确认 此时不用SYN 了 发送给服务端 建立连接
为什么要两次确认呢
为了防止服务端资源的浪费
A 发请求 到 B
假设A 发到 B 的某个请求 因为某些原因搁置了,以至于到释放连接后的时间点才到达B B确认了A的请求,以为是新的请求,于是发送确认请求 建立连接, 若是 不采用三次握手。那新的连接就会确认,此时B就会等待A 发送数据过来,浪费B的资源
2、TCP 释放连接的时候是四次挥手
(1)当客户端没有数据要传输的时候 会发送一个 FIN =1 表示传输完毕的 报文给服务端
(2)服务端收到客户端请求,发送ASK= 1 表示确认给客户端 此时客户端
(3)服务端处理数据 发送FIN=1报文给客户端
(4)客户端收到发送确认消息 释放连接 (客户端会进入一个TIME_WAIT 状态 等待 2MSL 时间)
为什么要进入等待状态
服务端 向 客户端 发送 FIN = 1 的释放连接请求,但这个报文丢失了, 客户端 没有接到不会发送确认信息, 服务端 超时会重传,这时客户端在 WAIT_TIME 还能够接收到这个请求,这时再回复一个确认就行了。(客户端收到 FIN = 1 的请求后 WAIT_TIME会重新记时)
另外服务器B存在一个保活状态,即如果客户端突然故障死机了,那服务端那边的连接资源什么时候能释放呢? 就是保活时间到了后,服务端会发送探测信息, 以决定是否释放连接。