三次握手
三次握手过程:
第一次握手:建立连接时,客户端发送syn包(seq=X)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=X+1),同时自己也发送一个SYN包(seq=Y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=Y+1),并置seq=X+1此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
TCP连接需要三次握手的原因:
TCP 连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。以下步骤概述了通常情况下客户端计算机联系服务器计算机的过程:
1. 客户端向服务器发送一个SYN置位的TCP报文,其中包含连接的初始序列号x和一个窗口大小(表示客户端上用来存储从服务器发送来的传入段的缓冲区的大小)。
2. 服务器收到客户端发送过来的SYN报文后,向客户端发送一个SYN和ACK都置位的TCP报文,其中包含它选择的初始序列号y、对客户端的序列号的确认x+1和一个窗口大小(表示服务器上用来存储从客户端发送来的传入段的缓冲区的大小)。
3. 客户端接收到服务器端返回的SYN+ACK报文后,向服务器端返回一个确认号y+1和序号x+1的ACK报文,一个标准的TCP连接完成。
四次挥手
四次挥手过程:
第一次挥手:客户端给服务器发送FIN包,用来关闭客户端到服务器的数据传送。
第二次挥手:服务器收到FIN后,发回一个确认信号ACK
第三次挥手:服务器发送FIN包,请求关闭服务器到客户端的数据传送
第四次挥手:客户端收到服务器发送的FIN之后,发回ACK确认
TCP断开连接需要三次握手的原因:
由于TCP连接是双向连接, 因此关闭连接需要在两个方向上做。因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭关闭连接,也即第二次挥手后你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
注: 确认比特ACK, 同步比特SYN,终止比特FIN