TCP三次握手是为了保证客户端和服务端的可靠连接,目的是为了确保双方都有正常的发送和接收能力。下图是TCP三次握手的流程图,描述了从客户端向服务端发起连接的全过程。下面我会逐项解释图中的关键词和术语所代表的含义及作用。
左侧:客户端
-
connect()
是发起连接请求的函数调用,应用程序调用这个函数后,操作系统会发起TCP三次握手。
-
SYN_SENT
是客户端状态,表示SYN报文已经发送,等待服务端响应。
-
ESTABLISHED
表示三次握手完成,连接建立成功,可以进行数据传输了。
右侧:服务端
-
listen()
表示服务端正在监听某个端口,准备接受客户端的连接。
-
LISTEN
是服务端状态,处于监听状态,等待接收连接请求。
-
SYN_RCVD
表示服务端接收到客户端的SYN请求,并已经回复了带有SYN+ACK的响应包。
-
ESTABLISHED
表示服务端状态变为已连接,双方可以开始通信。
-
accept()
是服务端接受客户端连接的函数,在三次握手完成后,这个函数会返回一个新的socket连接实例,用于后续通信。
中间:通信过程的三次握手
-
第一次握手:SYN,seq=x
客户端发送一个SYN报文(同步报文),请求建立连接,seq=x表示客户端的初始序列号为x。
作用:告诉服务端客户端想要建立连接,并传递初始序列号。
-
第二次握手:SYN,seq=y,ACK=x=1
服务端收到后,回复一个同时带有SYN和ACK的报文,seq=y表示服务端的初始序列号为y,ACK=x+1表示服务端确认收到客户端的序列号x,所以返回x+1。
作用:告诉客户端收到了请求,同意连接,并附上自己的初始序列号。
-
第三次握手:ACK=y+1
客户端收到服务端回复的带有SYN和ACK报文后,发送一个ACK确认报文,ACK=y+1表示客户端确认收到服务端的序列号y,所以返回y+1。
作用:告诉服务端收到了回复,至此连接建立完成。
总结
SYN(同步位):用来发起连接。
ACK(确认位):用来确认收到对方的消息。
seq(sequence number):表示序列号,用于TCP的可靠传输。
x/y:是客户端和服务端各自初始选择的随机序列号。
x+1/y+1:是对序列号的确认。