三次握手
服务器端的
accept
才会返回。
一般情况下服务器端在调用完
socket,bind
和
listen
后会调用
accept
并阻塞等待客户端发起连接
l
第一次握手
:客户端调用
connect
时,触发了连接请求,源主机发送一个同步标志位(
SYN
)置
1
的
TCP
数据段。此段中同时标明初始序号(
Initial Sequence Number
,
ISN
)
,
假设
ISN
为
J
。向服务器发送了
SYN(ISN=J)
包,这时
connect
进入阻塞状态,等待服务器确认。
l
第二次握手
:服务器监听到连接请求,即收到
SYN(ISN=J)
包,目标主机发回确认数据段,此段中确认标志位(
ACK
)置
1
,确认序号字段
(acknowledgement number
)+1
(即表明前一个数据段已收到并且没有错误)。同时同步标志位(
SYN
)同样被置
1
,而且标明初始序号
ISN
为
K
,开始第二次握手。该阶段发生在
accept
函数内,该函数接收请求向客户端发送确认
ACK(ISN=J+1)
,同时发送一个
SYN
包
(ISN=K)
,即
SYN+ACK
包,然后等待客户端确认。
l
第三次握手
:客户端收到服务器的
SYN(ISN=K)
,
ACK(ISN=J+1)
之后,即对
SYN(ISN=K)
进行确认,发送
ACK(ISN=K+1)
;服务器收到
ACK(ISN=K+1)
时,至此三次握手完毕,连接建立。