博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP三次握手和四次挥手
阅读量:4110 次
发布时间:2019-05-25

本文共 787 字,大约阅读时间需要 2 分钟。

TCP三次握手和四次挥手

TCP 三次握手

看图就明了

这里主要说明一下 为什么TCP建立连接不是4次
很简单 因为TCP是全双工,所以服务端接收到请求后可以将ACK和SYN一起发送,客户端最后只需要一次ACK
至于问为什么不是2次的。。。。。。。。。。。。。。
下面会说既然是全双工为什么挥手要4次不是3次

在这里插入图片描述

TCP 四次挥手

  • 上面既然说了TCP是全双工,为什么断开连接不是3次而是4次?

    看看具体过程

  • 第一次:客户端发送FIN,状态变为FIN_WAIT1

  • 第二次:服务端接收到断开请求,发送ACK ,状态变为CLOSE WAIT,客户端变为FIN_WAIT2

    重点来了,第二次的时候服务端为什么不直接FIN+ACK?因为服务端不知道客户端什么时候会突然发送一个FIN,在接收到客户端第一次发送的FIN之前可能正好服务端write了一条正常数据,所以服务端需要等这条数据的ACK,不能接收到客户端的FIN后直接发送FIN+ACK。所以只能先发个ACK给客户端了
  • 第三次:服务端发FIN,状态变为LAST-ACK

  • 第四次:客户端发送ACK 状态变为TIME_WAIT

在这里插入图片描述

  • 为什么服务端发送FIN后客户端需要等待2MSL才能从TIME_WAIT转为CLOSED?
    TCP协议设计时考虑到了很多因素,为什么客户端不在接收到服务端的最后一次FIN后发送ACK直接变为CLOSED呢?
    首先需要知道: 每个数据包能保持 1MSL 时长的寿命。
    客户端最后发送的ACK也许没有被服务端接收到,过一段时间后服务端尝试重新发送FIN,如果没有这个TIME_WAIT,也许客户端建立新连接后又收到了服务端的上一次的FIN这次的SYN的ACK(老的FIN+新的ACK),这时客户端发现SEQ对不上了,发送RST请求复位。新的连接无法建立,报错终止。
    等待2MSL就是为了保证不会出现上面这种情况。

转载地址:http://xtlsi.baihongyu.com/

你可能感兴趣的文章
vue打包时候提示:Cannot read property compilation of undefined
查看>>
推荐:vue解决引入外部css问题和解决css引入背景问题
查看>>
vue.js页面加载数据时加载动画过渡效果
查看>>
推荐Node.js跨域问题实用解决方法
查看>>
初始化一个React项目create-react-app
查看>>
npm安装json-stable-stringify使用
查看>>
react 解决警告Warning: Each child in a list should have a unique “key” prop.
查看>>
安装react初始化项目报错 :无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\create-react-app.ps1,因为在此系统上禁止运行
查看>>
babel-plugin-import配置babel按需引入antd模块
查看>>
浏览器对ES6新语法支持兼容处理
查看>>
ajax请求中自定义添加请求头token两种方式
查看>>
前端常用加密处理vue使用md5加密
查看>>
vue 前端常用加密处理 md5 加密
查看>>
Vue前端常用加密处理base64加密解密
查看>>
VUE前端常用加密处理des加密和解密
查看>>
nodemon代替node自动重启项目
查看>>
react 解决重命名生命周期componentWillMount
查看>>
vs code编写react代码 jsx中html标签Tab键自动补全
查看>>
vue.js限制输入框只能输入整数不含小数点
查看>>
字符串数组初始化转化
查看>>