多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 关于三次握手 ![](https://box.kancloud.cn/2b2c1266ee365806731e914624526f8c_668x623.png) ## 作用 1. client和server各自同时确认接受能力和发送能力是否正常。 2. 指定初始序列号ISN,为之后的报文传输做准备。 3. https协议下,数字证书加密 ## client和server的状态 * CLIENT * closed:默认状态 * SYN-SENT:client往server发送syn报文之后 * established:client接收到server的syn+ack,并发送ack报文之后 * SERVER * listen:默认状态 * SYN_RECEIVED:收到client发出的syn,并且发送ack+syn报文之后 * established:收到client发出的ack报文之后 ## 序列号ISN的作用 syn报文和ack报文中包含了序列号ISN,通过对比ISN来判断syn和ack是否匹配。 syn和ack报文中的序列号ISN相减,差等于1。 ISN序列号的另外一个功能是,在接收方收到多个包之后根据序列号组装数据 # 关于四次挥手 ![](https://box.kancloud.cn/52d04b2261838ec5aa1e21bf3e757ad7_674x834.png) ## client和server的状态基 * client * 发送FIN package:establish -> FIN_WAIT_1 * 接收ACK package:FIN_WAIT_1 -> FIN_WAIT_2 * 接收FIN package,发送ACK package:FIN_WAIT_2 -> TIME_WAIT * 等待2MSL之后:TIME_WAIT -> CLOSED * server * 接收FIN packet,发送ACK packet:establish -> CLOSE_WAIT * 等待数据包发送完毕,发送FIN package:CLOSE_WAIT -> LAST_ACK * 接收ACK package:LAST_ACK -> CLOSED ## Client从TIME_WAIT切换到CLOSED Client确认ACK报文已到达Server之后将状态由TIME_WAIT切换到CLOSED。 确认到达的方式: 1. Server在没有收到AKC报文的情况下,会重新往Client发送FIN报文,再等待Client返回AKC报文。如果在一个请求的来回周期内Client没有重复收到FIN报文,表示Server已经收到了client发送的ACK报文。 ***** # 3次握手,4次挥手,TIME_WAIT的意义 ## 3次握手 * 确认client,server双方各自的收发能力正常 * 假如server不需要发送syn包,在接收完client的syn包之后就进入establish状态,由于网络传输的不稳定性,可能出现已被client确认无效的syn包,延迟到达了server,server进入空等client数据的状态。 ## 四次挥手 * 因为TCP连接是全双工的网络协议,需要确认client和server都完成了数据发送 ## TIME_WAIT状态的意义 client在等待两个两个最长等待时间之后,由TIME_WAIT切换为CLOSED。client发送的ack package可能意外丢失,需要重新发送ack package