栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

TCP连接三次握手与四次挥手

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

TCP连接三次握手与四次挥手

目录

前言TCP头部三次握手四次挥手为什么连接三次而挥手四次

前言

面试老是爱问,平时也就知道个大概,简单记录一下三次握手与四次挥手过程,顺便画个图加深记忆。

TCP头部
    1位(bit),1字节(byte),1字节=8位。tcp头部图示可以一行32位也就是4字节,固定头部5行共计20字节,选项最大可到40字节,也就是tcp头部最大60字节。SYN、ACK、FIN是我们的标志位,标志位一个只占一位,一位只能表示是与否(1和0)。小写seq指的是我们的32位序号,ack指的是我们的32位确认号。
三次握手
    客户端与服务端初始都处于CLOSE状态。大写的SYN和ACK都是tcp头部的标志位,值只有0和1,图中都省略了=1,不等于1没有意义,在三次握手中seq序号是作为SYN的关联,因此我表示为SYN(seq=x)比较好记,真正的表示可以写成SYN=1,seq=x,ACK(ack=x+1)同理,也就是ACK=1,ack=x+1。由服务端主动进入LISETN状态,然后客户端向服务端发送SYN(req=x),第一次握手,此时客户端处于SYN_SEND状态。服务端接收客户端发来的SYN,服务端向客户端发送自己的SYN(req=y)与表示已经接收到客户端发来的SYN的ACK(ack=x+1),第二次握手,服务端进入SYN_RECV状态。客户端接收到服务端的SYN与ACK,客户端向服务端发送表示已经接收到服务端发来的ACK的ACK(ack=y+1),三次握手完成,客户端进入ESTABLISETEN状态。服务端接收到最后的ACK之后也进入ESTABLISTEN状态。
四次挥手
    四次挥手过程可以参考三次握手简述。需要注意的是,四次挥手最后一次客户端发送ACK并没有直接进入CLOSE状态,而是等待2MSL再进入,为的是保证发送的ACK会成功发送到对方,因为关闭连接了,无法通过接收信息来保证,因此需要进行等待时间,MSL是任何报文段被丢弃前在网络内的最长时间,设置2倍非常严谨安全。
为什么连接三次而挥手四次

因为服务端收到客户端返回FIN仅仅表示客户端不再发生数据,但是客户端还可以接收数据,而需不需要客户端关闭接收还需要服务端的上层应用决定,因此FIN与ACK不同时发送。服务端提前发送ACK防止客户端重复发送FIN,然后再去询问上层是否向客户端发送应FIN。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/737576.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号