TCP,全称 Transmission Control Protocal。从名字可以知道这是一个用于 控制传输 的位于传输层的协议。

TCP 位于 TCP/IP 和 OSI 模型的传输层。我们最常使用的 HTTP 协议,底层通常使用的就是 TCP 协议。

如果要在客户端和服务端创建 TCP 连接,我们需要在开始的时候发送三个请求确认双方的通信能力正常,这三次连接就被称为 TCP 的三次握手。

TCP 的三次握手

下图为 TCP 头部的结构,我们的 TCP 三次握手主要用到其中的标黄的部分。

下面开始讲解这三次握手。

第一次握手

客户端给服务端发送一个 TCP 报文。在 TCP 头部中:

  1. 将 SYN 标志位设置为 1;

  2. 然后给 seq 赋予一个随机数(假设这个随机数是 x)

所谓标志位,其实就是一个比特的数据,设置为 1 ,其实就类似编程中将一个布尔值设置为 true。

SYN 代表同步(sync)的意思,seq 是序列号(Sequence number)的意思,是一个可以装载数值的地方,我们给它设置为随机数,是用来做凭证(token)的,稍后服务端会使用它。

第二次握手

服务端收到 SYN,知悉客户端希望建立 TCP 连接,并拿到了一个 seq 随机数。

服务端于是向客户端发送 TCP 报文,TCP 头中:

  1. 将 ACK 标志位设置为 1,表示已知悉(acknowledge)客户端的连接请求;

  2. ack 的值设置为客户端传过来的 seq 值 + 1(即 x+1);

  3. 将 SYN 标志位设置为 1,表示服务端也要连接;

  4. seq 的值设置一个随机数(假设随机数为 y)

服务端通过 ACK 和 ack 来告知客户端已知悉连接请求,并发送自己的 SYN 和 seq 来请求和客户端的连接。

第三次握手

客户端收到 TCP 请求,首先验证 SYC 是否为 1, seq 是否为 x+1。

如果是,说明服务端的这个发送是对应第一次握手的返回。客户端会再发送一个 TCP 请求:

  1. ACK 设置为 1;

  2. ack 设置为服务端 ack 的值 + 1(即 y + 1)

三次握手后,TCP 连接就建立了。

总结

三次握手,简单来说,就是这样的:

  1. 客户端 -> 服务端:SYN=1, seq=x (x为随机数)

  2. 服务端 -> 客户端:ACK=1, ack=x+1, SYN=1, seq=y (y为随机数)

  3. 客户端 -> 服务端:ACK=1, ack=y+1

我是前端西瓜哥,欢迎关注我,掌握更多前端面试题。

你需要知道的 TCP 三次握手相关推荐

  1. Wireshark验证TCP三次握手四次挥手

    本文介绍如何通过Wireshark抓包工具验证TCP的三次握手四次挥手过程. 首先本地起了一个tomcat服务器,跑了一个简单的基于SpringMVC的rest服务. 打开Wireshark,捕获指定 ...

  2. 你需要知道的 TCP 四次挥手

    大家好,我是前端西瓜哥.今天给大家说说 TCP 的四次挥手. 建立 TCP 连接一段时间后,如果要断开 TCP 连接,就会进行 TCP 四次挥手过程完成断开操作. TCP 四次的过程有点像 TCP 建 ...

  3. TCP三次握手Render Tree页面渲染=从输入URL到页面显示的过程?

    最近工作之余一直在温故js系列,想知新,想提升,以小技术点为节奏去回顾.今天突然想到回顾一下这个http知识,http知识有太多深层次需要学习,今天简要回顾,浅析下这个技术点. 主要通过五个步骤浅析这 ...

  4. 40张图全面解析TCP 三次握手和四次挥手

    每日一句英语学习,每天进步一点点: 前言 不管面试 Java .C/C++.Python 哪种语言的开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我千百遍,我仍待 TCP 如初恋. ...

  5. 吊打面试官!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题

    作者 | 小林coding 来源 | 小林coding(ID:CodingLin) 不管面试 Java .C/C++.Python 等开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我 ...

  6. 从TCP三次握手说起——浅析TCP协议中的疑难杂症(转载)

    [转载] 原博文来自:https://blog.csdn.net/qiansg123/article/details/80126677 作者:黄日成,手Q游戏中心后台开发,腾讯高级工程师. 因为写得太 ...

  7. 从TCP三次握手说起——浅析TCP协议中的疑难杂症

    PeterWang_bupt 贡献值:2 等級:L1 0 发布 0 评论 1 顶 发布链接发布图文   全部主题 我关注的主题 GEEKNEWS Rust Swift 全栈工程师 /home Pres ...

  8. 从TCP三次握手说起–浅析TCP协议中的疑难杂症(2)

    在"从TCP三次握手说起–浅析TCP协议中的疑难杂症(1)"文章中,我们提到第6个疑问:TCP的头号疼症TIME_WAIT状态,下面我们继续这个问题的解答: 6. 疑症(6) TC ...

  9. 淘宝二面,面试官居然把TCP三次握手问的这么详细

    TCP 的三次握手和四次挥手,可以说是老生常谈的经典问题了,通常也作为各大公司常见的面试考题,具有一定的水平区分度.看似是简单的面试问题,如果你的回答不符合面试官期待的水准,有可能就直接凉凉了. 本文 ...

最新文章

  1. 第六课:不要为金钱而工作
  2. go WaitGroup的坑
  3. 变量的分类(按数据类型)
  4. IO流的应用_Copy文件
  5. python fileinput处理多文件
  6. matlab遗传算法tsp程序,遗传算法解TSP问题的程序
  7. 微信小程序原生自定义组件布局问题
  8. 亚马逊AWS EC2服务器配置教程
  9. win10开机自动打开http://go.microsoft.com/fwlink/?LinkID=219472clcid=0x409
  10. 分享一个英语听力资源下载网站
  11. CyclicBarrier多任务协同的利器
  12. 集体照的拍摄及后期合成
  13. 快速学习-ElasticaSearch6.2.1搜索管理
  14. 设计模式之禅-二《上卷》
  15. 新环境-新体验-新生活_发某人南下随笔
  16. cmd操作MySQL 多表查询(日记 day 4)
  17. JQuery-样式篇
  18. ChatGPT简要解读(一) - 原理分析与性能提升篇
  19. 【Windows】win10或win11的资源管理器 文件夹中存在今天、昨天、本周更早时候之类的分割线分组依据如何怎么去除去掉?
  20. 杭电ACM(HDUOJ)试题分类

热门文章

  1. 瑞吉外卖【后台管理系统篇】
  2. 数据结构初阶:二叉树
  3. 悠漓带你浅谈C语言2(数据类型)
  4. 软件工程专业,大学期间最重要的是学好哪些知识?
  5. 如何搭建数据指标监测体系?
  6. 【bootstrap教程】Bootstrap 工具提示(Tooltip)插件
  7. 【虚幻引擎UE】UE5 可编辑动态样条线轨迹及AI跟随路径移动(含工程源码)
  8. 数据仓库介绍:什么是数据仓库、数据仓库功能、数据仓库价值、数仓领域职业发展方向规划
  9. UE4 Socket多线程非阻塞通信【1】
  10. ubuntu重启ssh服务