java网络编程三次握手四次挥手

第一次握手:client设置syn=1,随机产生一个序列号seq=x,将数据包发送到server。client进入syn_send状态,
等待server确认。
第二次握手:server查看client发来的数据包syn=1,得知是client发来的连接请求。server设置syn=1 ACK=1
ack = x+1 seq = y,并将数据包发送到客户端。server进入syn_rcvd状态。
第三次握手:client得到server的确认,查看ACK=1 ack=x+1。然后,再给server一个确认,设置ACK=1 ack=y+1.
server接收client包,查看ACK是否为1,ack是否为y+1,如果正确建立连接。同时进入established.

第一次挥手:A 设置 FIN=1 seq = x,将数据包发送到B,A进入FIN_WAIT_1状 态。等待B的确认。
第二次挥手:B 查看FIN,知道A是要释放连接。B设置ACK=1 ack = x+1 ,将确认返回A。B
进入CLOSE_WAIT。A接收该确认,进入FIN_WAIT_2状态。等待B的连接释放。
第三次挥手:B 设置 FIN=1 seq = y,将数据包发送到A,B进入LAST_ACK状态。等待A的确认。
第四次挥手:A 查看FIN,知道B是要释放连接。A设置ACK=1 ack = y+1 ,将确认返回B。A
进入TIME_WAIT。B接收该确认,进入CLOSED状态。

三次握手的原因:防止已经失效的报文发送到服务器端。
握手要3次,挥手要4次原因:连接时,服务器一直处于LISTEN状态,server接收到syn报文后,会将syn和ack同时返回。
释放连接时,只是一端不在发送报文,但还是可以接收的。另一端可以直接close。也可以等待发送完毕之后,再发送FIN
报文,所以是将,FIN和ACK发开发送。

posted on 2017-08-14 20:28  乐学习  阅读(1259)  评论(0编辑  收藏  举报

导航