TCP是什么?
- 就是一种面向连接的协议
- 可以看成字节流
- TCP提供了一种可靠,面向连接,字节流,传输层的服务,采用三次握手建立一个连接,采用四次挥手关闭一个连接。
三次握手的过程
(1)第一次握手
客户端发送 SYN 包 (seq = x) 到服务器,并进入 SYN_SEND状态
(2)第二次握手
服务器收到 SYN 包,必须确认客户的SYN (ack = x+1),同时自己也发送一个 SYN 包(syn = y),即 SYN+ACK包,此时服务器进入SYN_RECV 状态
(3)第三次握手
客户端收到服务器的SYN+ACK包,向服务器发送确认包 ACK(ack = y+1),此包发送完毕,客户端和服务器进入 ESTABLISHED(已确立的)状态。至此完成。
注意:
以上动作发送的包中没有任何数据,等三次握手完成后客户端与服务器才正式开始传送数据。
并且理想状态下,TCP连接一旦建立,在通信双方的任何一方主动关闭连接之前,TCP连接将一直保持。
四次挥手
(1)第一次挥手
客户端主动关闭方发送一个FIN,用来关闭客户端到服务器端的数据传送,也就是客户端告诉服务器端:我已经不会再给你发数据了(在fin包发送出去之前的数据,如果没有收到对应的 ack 确认报文,客户端依然会重发这些数据
)。但是,此时客户端还可以接受数据
。
(2)第二次挥手
服务端收到 FIN包后,发送一个ACK
给客户端,确认序号为收到序号 +1(与SYN相同,一个FIN占用一个序号)
(3)第三次挥手
服务端发送一个FIN
,用来关闭服务器端到客户端的数据传送,也就是告诉客户端,我的数据也发送完了,不会再给你发数据了。
(4)第四次挥手
客户端收到FIN后,发送一个ACK给服务端,确认序号为收到序号 +1。至此完成。
为什么要三次握手?
至少三次握手,才能得出:自己,对方的接收,发送能力都正常。
自己得知道自己的功能正常。
为什么握手是三次,挥手是四次?
这是因为服务端在LISTEN(监听)状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方ACK和FIN一般都会分开发送。
(原作者:xjlgxlgx 链接:https://juejin.cn/post/6844903950181744653)