三次握手
三次握手(Three-Way Handshake)是TCP协议在建立连接时使用的过程,用于确保客户端和服务器之间的连接是可靠的,并且双方都准备好发送和接收数据。具体过程如下:
- 第一次握手(SYN):
- 客户端向服务器发送一个SYN(Synchronize)报文,表示客户端希望建立连接,并且告知客户端的初始序列号(Sequence Number)。
- 第二次握手(SYN-ACK):
- 服务器收到SYN报文后,回复一个SYN-ACK报文,表示同意建立连接,并且告知服务器的初始序列号。同时,服务器确认收到客户端的SYN报文,将客户端的序列号加1作为ACK(Acknowledgment Number)。
- 第三次握手(ACK):
- 客户端收到服务器的SYN-ACK报文后,回复一个ACK报文,确认收到服务器的SYN报文,将服务器的序列号加1作为ACK(Acknowledgment Number)。此时,连接建立完成,双方可以开始传输数据。
以下是三次握手的简化示意图:
客户端 服务器
SYN ---------------------------->
SYN-ACK
<------------------------------
ACK ---------------------------->
客户端 服务器
SYN ---------------------------->
SYN-ACK
<------------------------------
ACK ---------------------------->
具体步骤如下:
- 第一次握手(客户端 -> 服务器):
- 客户端发送一个SYN报文,报文中包含一个初始序列号(例如,
seq = x
)。
- 客户端发送一个SYN报文,报文中包含一个初始序列号(例如,
- 第二次握手(服务器 -> 客户端):
- 服务器收到SYN报文后,发送一个SYN-ACK报文。报文中包含服务器的初始序列号(例如,
seq = y
)和对客户端SYN报文的确认号(ack = x + 1
)。
- 服务器收到SYN报文后,发送一个SYN-ACK报文。报文中包含服务器的初始序列号(例如,
- 第三次握手(客户端 -> 服务器):
- 客户端收到SYN-ACK报文后,发送一个ACK报文。报文中包含对服务器SYN报文的确认号(
ack = y + 1
)。
- 客户端收到SYN-ACK报文后,发送一个ACK报文。报文中包含对服务器SYN报文的确认号(
通过这三次握手,双方确认了彼此的初始序列号,并且确保了连接的可靠性。三次握手的设计使得TCP连接能够在不可靠的网络环境中可靠地建立连接,从而进行后续的数据传输。
四次挥手
TCP连接的断开需要四次挥手(Four-Way Handshake)来确保连接的两端都能优雅地关闭通信。具体过程如下:
- 第一次挥手(FIN):
- 主机A(主动关闭方)发送一个FIN报文给主机B,表示主机A不再发送数据,但是可以接收数据。
- 第二次挥手(ACK):
- 主机B收到FIN报文后,返回一个ACK报文,确认已经收到主机A的FIN请求。同时,主机B可以继续发送数据给主机A。
- 第三次挥手(FIN):
- 主机B发送一个FIN报文给主机A,表示主机B也不再发送数据。
- 第四次挥手(ACK):
- 主机A收到主机B的FIN报文后,发送一个ACK报文给主机B,确认已经收到主机B的FIN请求。此时,主机A和主机B都会等待一定的时间,以确保ACK报文能够被对方成功接收,然后再关闭连接。
TCP协议中的FIN(Finish)报文用于表示发送方已经完成了数据发送,不会再发送任何数据。具体来说,FIN报文的作用是告诉对方:“我这边的数据已经全部发送完毕了,不会再发送新的数据了。”
但是,收到FIN报文的一方仍然可以继续发送数据,直到它也发送一个FIN报文来表示它的数据发送也已经完成。
因此,TCP连接的关闭过程需要双方都发送和接收FIN报文,从而确保双方都能完成数据发送并确认连接的关闭。