# TCP 三次握手和四次挥手的理解
非常形象的比喻图解:
四次挥手一定是存在的——由于TCP连接是全双工的,因此每个方向都必须单独进行关闭,所以即使没有最后一个包,也需要先回复断开连接的请求,然后再发送关闭请求。
- 第一次client => server 只能server判断出【client具备发送能力】
- 第二次 server => client client就可以判断出【server具备发送和接受能力】,此时client还需让server知道自己接收能力没问题于是就有了第三次
- 第三次 client => server 【双方均保证了自己的接收和发送能力没有问题】
这里有几个参数需要了解一下:SYN、seq、ACK、FIN:
TCP 有6中标志位:
- SYN(synchronous 建立连接)
- ACK(acknowledgement 确认)
- PSH(push 传送)
- FIN(finish 结束)
- RST(reset 重置)
- URG(urgent 紧急)
另外数据包:
- Sequence number(顺序号码)
- Acknowledge number(确认号码)
非常通俗的解释:
- 第一次握手中 SYN = 1,代表客户端 Client 要建立连接,同时随机产生 seq(Sequence number)= x 的数据包,然后传输到 Server;
- Server 收到 Client 的信息,通过 SYN = 1 知道是要建立连接,然后向 Client 发送信息,ACK = 1 代表确认,ack(Acknowledge number)= x + 1,SYN = 1 代表建立连接,随机产生 seq = y 的数据包;
- Clien 收到 Server 的信息,通过 SYN = 1 知道是要建立连接,然后检查 ack 是否正确,即第一次发送的 seq + 1,同时检查 ACK 是否为 1,若正确,Client 再发送 ack = y + 1,ACK = 1 到 Server,Server 收到确认 seq 值和 ACK = 1 后则连接建立成功。