Iwen's blog Iwen's blog
首页
  • 前端文章

    • JavaScript
    • Vue
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 小程序笔记
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • Linux
  • 学习
  • 面试
  • 心情杂货
  • 友情链接
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
复盘
关于

Iwen

不摸鱼的哥哥
首页
  • 前端文章

    • JavaScript
    • Vue
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 小程序笔记
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • Linux
  • 学习
  • 面试
  • 心情杂货
  • 友情链接
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
复盘
关于
  • Vue

  • Vue进阶

  • CSS

  • ES6

  • Base

  • Core

  • Array

  • Object

  • String

  • Async

  • Browser

  • Http

    • HTTP 和 HTTPS
    • TCP三次握手和四次挥手
      • 三次握手
      • 四次挥手
      • 参考
    • TCP 和 UDP 区别
    • HTTP 状态码
    • 回流重绘
    • HTTP 基础知识
  • 性能优化

  • 正则

  • 经典总结

  • 设计模式

  • 数据结构

  • 算法

  • 手写

  • TypeScript

  • 复盘
  • Http
Mr.w
2020-11-29

TCP三次握手和四次挥手

# TCP三次握手和四次挥手

建立TCP链接是为了保证稳定有序的收发数据,那么就要保证双方的发送能力和接收能力都是OK的。

  • FIN = finish
  • ACK = acknowledge

# 三次握手

三次握手之所以三次,是保证client和server都要让 "对方" 知道自己发送能力和接收能力都OK的最小次数。

client => server server判断出client具备发送能力

server => client client可以判断出server具备发送和接收能力

client => server client还需让server知道自己接收能力没问题

  • 客户端:我准备好了,你准备好了么,收到请回答?
  • 服务端:我收到了,我也准备好了,你收到了么?
  • 客户端:我也收到了

双方均保证了自己的接收和发送能力没有问题

TCP连接建立,两次不安全,四次浪费资源,三次刚刚好。

从最开始双方都处于CLOSED状态。然后服务端开始监听某个端口,进入了LISTEN状态。

  • 第一次握手

客户端主动发起连接,发送SYN, 发送完毕后,客户端进入SYN-SENT状态。

  • 第二次握手

服务端接收到,返回SYN和ACK(对应客户端发来的SYN),发送完毕后,服务器端进入SYN_RCVD状态。

  • 第三次握手

客户端再发送ACK给服务端,发送完毕后,客户端进入ESTABLISHED状态;服务端收到ACK之后,也进入ESTABLISHED状态,TCP 握手结束。

# 四次挥手

client => server client请求关闭连接,发送FIN到server

server => client server接收关闭连接请求,发送ACK进行最后数据传输

server => client server向client发送可以进行关闭连接的请求FIN

client => server client接收请求,发送确认关闭ACK,等待2msl后关闭

  • 学生:老师,下课了
  • 老师:好了,我知道,还有一部分没讲完
  • 老师:讲完了,下课
  • 学生:好的

四次挥手后,client和server成功地断开了连接~

刚开始双方处于ESTABLISHED状态。

  • 第一次挥手

客户端想要关闭连接,向服务器发送FIN报文,发送完毕后,客户端进入FIN_WAIT_1状态。

  • 第二次挥手

服务端收到该FIN报文后,就向客户端发送ACK应答报文,接着服务端进入CLOSED_WAIT状态。

客户端接收到服务端的ACK应答报文后,进入FIN_WAIT_2状态。

  • 第三次挥手

服务端处理完数据后,向客户端发送FIN报文,发送完毕后,服务器端进入LAST_ACK状态。

  • 第四次挥手

客户端接收到来自服务端的FIN报文后,回一个ACK应答报文,并进入TIME_WAIT状态。

服务端接收到这个确认包之后,关闭连接,进入CLOSED状态,至此服务端已经完成连接的关闭。

客户端等待了2MSL之后,自动进入CLOSED状态,至此客户端也完成连接的关闭。

# 参考

  • 谈谈你对 TCP 三次握手和四次挥手的理解 (opens new window)
  • 【面试】图解 TCP 常见面试题! (opens new window)
HTTP 和 HTTPS
TCP 和 UDP 区别

← HTTP 和 HTTPS TCP 和 UDP 区别→

最近更新
01
flex布局页面自适应滚动条问题
12-28
02
前后端分离开发请求接口跨域如何携带cookie的问题
12-28
03
怎么实现div长宽比固定width-height4比3
12-28
更多文章>
Theme by Vdoing | Copyright © 2017-2022 Iwen | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式