码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 你需要知道的 TCP 三次握手


    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

    图片

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

  • 相关阅读:
    IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Maven依赖管理,版本号管理,继承和聚合
    [leetcode] 2530. 执行 K 次操作后的最大分数 M
    3ds Max渲染太慢?创意云“一键云渲染”提升3ds Max渲染体验
    【面试题】金九银十,你准备好面试了吗? (30w字前端面试题总结)( React)
    HTML5期末考核大作业,网站——旅游景点。 学生旅行 游玩 主题住宿网页
    Himall商城图形码帮助类二维码中生成图片(1)
    设计模式(三)| 行为型模式(责任链模式、观察者模式等)
    剑指 Offer 33. 二叉搜索树的后序遍历序列
    C语言MFC导出dll回调函数方法详解
    Flink的状态后端(State Backends)
  • 原文地址:https://blog.csdn.net/fe_watermelon/article/details/125629758
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号