三次握手
三次握手是指的TCP连接建立的过程,是在客户端和服务器之间进行的,并且是由客户端开始的。
客户端
- 客户端在握手开始之前是CLOSED状态。
- 当客户端向服务器开放的端口发送请求(SYN)以后,客户端就处于SYN-SEND状态
- 收到服务器返回的连接确认消息(SYN+ACK)以后,客户端向服务器再发送消息(ACK)确认连接,发送完确认消息之后,客户端就处于ESTABLISHED状态。
服务器
- 服务器端口本次连接的的端口在握手开始之前处于LISTEN状态
- 在收到客户端发来的请求(SYN)之后,服务器同意请求就会向客户端回执消息(SYN+ACK),然后服务器端口本次连接的端口处于SYN-RCVD状态。
- 收到客户端返回的连接确认(ACK)之后,服务器端口本次连接的端口处于ESTABLISED状态。
SYN-SEND状态表示客户端已经发送了TCP连接请求(SYN),只有客户端才会有该状态。
SYN-RCVD状态表示服务器回执了TCP连接请求(SYN+ACK),只有服务器才会有该状态。
ESTABLISED状态表示连接已经建立,服务器和客户端都有该状态。
四次挥手
四次挥手是指的tcp连接断开的过程,客户端和服务器都可以主动断开连接。
以client主动断开的方式为例,主动断开方是客户端,被动断开方是服务器。
客户端
- 发送FIN报文,此时客户端的状态为FIN-WAIT1,此时FIN报文的含义是“客户端没有数据要发给你了,客户端要断开;如果服务器还有数据的话可以发给客户端,然后发送断开消息”。
- 收到服务器回执的ACK报文,此时客户端的状态为FIN-WAIT2,此时ACK报文的含义是“服务器已经收到断开请求了,稍后会发给客户端断开回执”。
- 收到服务器回执的FIN报文,然后发送给服务器ACK报文,此时客户端的状态为TIME-WAIT,并保持该状态2MS。此时FIN报文的含义是“服务器没有数据要发送了,断开”,ACK报文的含义是“客户端收到服务器的断开消息了”。
服务器
- 收到客户端发过来的FIN报文,回执ACK报文,服务器端口本次连接的状态为CLOSE-WAIT
- 向客户端发送FIN报文,服务器端口本次连接的状态为LAST-ACK(等待最后的ACK报文)
- 收到客户端发过来的FIN报文,服务器端口本次连接的状态为CLOSE。
主动断开连接的一方会有以下状态
FIN-WAIT1表示已经发送了主动断开连接的消息(FIN)。
FIN-WAIT2表示已经确认被动断开方收到了我的断开消息(ACK)。
TIME-WAIT表示已经发送了最后的确认报文(ACK)。但是为了确保被动断开方收到了确认报文,会保持该状态2MS。期间如果还有从对方发来的FIN报文的话,还会再次回执ACK报文。
被动断开连接的一方会有以下状态
CLOSE-WAIT表示已经收到了对方的断开消息(FIN)并进行了回执(ACK)。
LAST-ACK表示已经向对象发送了断开消息,等待对方回执(ACK)。
CLOSE 表示本次连接结束。
参考文章:
http://blog.youkuaiyun.com/whuslei/article/details/6667471/
本文为自己对三次握手和四次挥手的一些理解,如有不当,还望指出,谢谢。