TCP三次握手:
-
第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
-
第二次握手:
Server
收到数据包后由标志位
SYN=1
知道
Client
请求建立连接,
Server
将标志位
SYN
和
ACK
都置为
1
,
ack=J+1
,随机产生一个值
seq=K
,并将该数据包发送给
Client
以确认连接请求,
Server
进入
SYN_RCVD
状态。
-
第三次握手:
Client
收到确认后,检查
ack
是否为
J+1
,
ACK
是否为
1
,如果正确则将标志位
ACK
置为
1
,
ack=K+1
,并将该数据包发送给
Server
,
Server
检查
ack
是否为
K+1
,
ACK
是否为
1
,如果正确则连接建立成功,
Client
和
Server
进入
ESTABLISHED
状态,完成三次握手,随后
Client
与
Server
之间可以开始传输数据了。
简单来说,就是
-
建立连接时,客户端发送SYN包(SYN=i)到服务器,并进入到SYN-SEND状态,等待服务器确认。
-
服务器收到
SYN
包,必须确认客户的
SYN
(
ack=i+1
)
,
同时自己也发送一个
SYN
包(
SYN=k
)
,
即
SYN+ACK
包,此时服务器进入
SYN-RECV
状态。
-
客户端收到服务器的
SYN+ACK
包,向服务器发送确认报
ACK
(
ack=k+1
)
,
此包发送完毕,客户端和服务器进入
ESTABLISHED
状态,完成三次握手,客户端与服务器开始传送数据。
TCP四次挥手:
-
第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
-
第二次挥手:
Server
收到
FIN
后,发送一个
ACK
给
Client
,确认序号为收到序号
+1
(与
SYN
相同,一个
FIN
占用一个序号),
Server
进入
CLOSE_WAIT
状态。
-
第三次挥手:
Server
发送一个
FIN
,用来关闭
Server
到
Client
的数据传送,
Server
进入
LAST_ACK
状态。
-
第四次挥手:
Client
收到
FIN
后,
Client
进入
TIME_WAIT
状态,接着发送一个
ACK
给
Server
,确认序号为收到序号
+1
,
Server
进入
CLOSED
状态,完成四次挥手。