当前位置: 首页 > news >正文

字节一面:说说TCP的三次握手

上周有朋友去了字节面试,问到了 TCP 三次握手的问题,当时回答的不是很好,对于三次握手的发送的报文信息都不太熟,本文主要做一下总结和记录。

TCP 全称为 Transmission Control Protocol (传输控制协议),是一种 面向连接的、可靠的、基于字节流 的传输层通信协议。 TCP 也是全双工通信协议,表示客户端可以给服务端发送消息,服务端也可以向客户端发送消息。

报文

TCP 处于 ISO 七层模型的 传输层 ,传输层的单位是 报文 ,报文信息如下:

Source port 和 Destination port

其中 Source port 和 Destination port 分别代表 发送端口 和 接收端口 。两个不同机器上的进程通信,需要通过 端口 和IP协议中的 IP 标识唯一的进程。

Sequence number 和 Acknowledgment number

Sequence number 表示 序列号 ,表示要发送数据的起始号,在下面的三次握手使用 seq 表示, Acknowledgment number 表示 确认号 ,返回确认号,表示消息已经接收,返回下次要发送的起始号。在下面的三次握手使用 ackNum 标识。

TCP flag

TCP flag 表示 TCP 标志位,主要介绍两个 ACK 和 SYN :

SYN
ACK

Windows Size

TCP 使用 滑动窗口 来实现 流量控制 ,根据窗口大小,确认要发送数据包的个数。

TCP 三次握手

TCP 三次握手,是指建立一个 TCP 连接时,需要客户端和服务器总共发送 3 个包。三次握手的目的是连接服务指定端口,建立 TCP 连接,并 确认 连接双方的 序列号 和 确认号 ,确认 TCP 窗口大小信息。

三次握手详解:

  • 第一次握手 SYN=1,seq=x
    • 客户端发送一个 TCP 的 SYN 标志位为 1 的包,指定客户端连接的服务器端口,初始序列号 seq 为 x 。发送完毕之后客户端进入 SYN_SEND 。
  • 第二次握手 SYN=1,ACK=1,seq=y,ACKnum=x+1
    • 服务器发回确认包 ACK 应答。即 SYN 标志位和 ACK 标志位均为1。服务器端发送序列号 seq 为 y ,同时将确认序号 ackNum 设置为客户端的序列号 seq+1 , ackNum 表示要下次要发送数据包序列号的起始值。发送完毕后,服务端进入 SYN_SEND 状态。
  • 第三次握手 ACK=1,ACKnum=y+1
    • 客户端再次发送确认包 ACK ,ACK 标志位为 1 ,并且把服务器发来的 ackNum 作为起始序号 seq 发送给服务端,确认号 ackNum 为服务端发送的序列号 +1 也就是 y+1 ,放在确认字段中发送给对方,
    • 发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,开始数据传输。

wireshake 抓包

为了更好理解三次握手,使用 wireshake j进行抓包。首先请求访问链接, TCP 三次握手对应下面编号 57 、 63 、 64 :

  • 第一步: 192.168.5.150 ----> 47.98.202.133 [SYN] seq=0
  • 第二步: 47.98.202.133 ----> 192.168.5.150 [SYN ACK] seq=0 ack=1
  • 第三步: 192.168.3.150 ----> 47.98.202.133 [ACK] seq=1 ack=1

记忆口诀

那么在面试的时候应该如何记忆三次握手的流程?三次握手是为了建立连接,其中主要是为了确认客户端和服务端的序列号 seq ,那么 确认序列号 就需要接收方返回序列号,来确保自己发送的序列号能成功发送。

  • 第一次握手和第二次握手 确保客户端的序列号 ,所以第一次发送 seq ,第二次返回 ack ,当接收到返回信息,表明 确认了客户端序列号 。第一次和第二次都是建立连接过程,所以都带有 SYN 标记位。而第二次返回号,所以第二次带 ACK 标志位。
  • 第一次发送了序号 seq 为 x ,返回确认号 ackNum 为 x+1 ,因为发送消耗了一个序号,所以 ackNum 要加 1 。
  • 第二次握手和第三次握手是为了确保服务端的序列号,服务端发送序列号 seq ,客户端返回确认号 ackNum ,值为 seq+1 。第二次握手要发送序号和返回上一次的握手的确认号,所以第二次握手带有 SYN 和 ACK 标志位。并且要发送序列号 seq 和确认号 ackNum 。第三次握手是确认服务端发送序列号,所以带有标志位 ACK ,返回确认号 ackNum 。

为啥 TCP 需要三次握手,不是两次,四次

TCP 三次握手是为了确认双方的序列号,这就像一个 发送—应答 机制,客户端发序列号,服务端返回确认号,此时确认了客户端的序列号。如果是两次握手,只能确认客户端的序列号,无法确认服务端的序列号。三次握手是确认两个序列号最小的连接次数。四次也可以,但是没有必要,需要减少握手的次数,加快连接速度。

总结

  • 本文先介绍了报文头信息,三次握手主要用到了:
    • 序列号 seq ,确认号 ackNum 。
    • TCP 标记位, SYN 同步序号,表示建立连接过程。 ACK 确认序号标识,标识表示发送信息已确认接收
  • 三次握手详解:
    • 第一次握手,客户端发送带有 SYN 标记位的包,带有初始化序列号 x ,发送完毕客户端进入 SYN_SEND 状态。
    • 第二次握手,服务端返回应答标记位 ACK ,并返回确认号 ackNum 为 x+1 , x+1 表示发送消耗了一个序列号。返回了确认号表示 确认 了客户端序列号。服务端也要发送序列号 y ,所以也要带有 SYN 的标记位。
    • 第三次握手客户端发送确认包 ackNum 为 y+1 ,所以带确认序号标志 ACK 。建立连接,发送序号 x+1 ,开始传输数据。

相关文章:

  • 数据中台不是万能钥匙,企业需求才是数据中台建设的根本
  • Hadoop 集群时间同步设置
  • yarn : 无法将“yarn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
  • Android——Activity和Fragment的通信方式
  • 【校招VIP】前端项目开发之正则表达
  • Vite创建Vue2项目中,封装svg-icon组件并使用——插件之vite-plugin-svg-icons和fast-glob
  • 洛谷题单 Part2.1 模拟
  • Selenium 中的 JUnit 注解
  • ES6中的set、map
  • 基python的毕业设计题目超市进存销系统
  • 云计算基础
  • C语言文件基本操作
  • 2022年全球及中国疏水阀行业头部企业市场占有率及排名调研报告
  • java6.2 springCloud
  • 第6章Linux实操篇-开机、重启和用户登录注销
  • [译]前端离线指南(上)
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • Java小白进阶笔记(3)-初级面向对象
  • October CMS - 快速入门 9 Images And Galleries
  • React Native移动开发实战-3-实现页面间的数据传递
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • 关于 Cirru Editor 存储格式
  • 机器学习中为什么要做归一化normalization
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 深度解析利用ES6进行Promise封装总结
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #1015 : KMP算法
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • %@ page import=%的用法
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (十六)一篇文章学会Java的常用API
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (一)80c52学习之旅-起始篇
  • (转)fock函数详解
  • (转)程序员疫苗:代码注入
  • .gitignore文件_Git:.gitignore
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net core webapi 大文件上传到wwwroot文件夹
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net 受管制代码
  • .Net接口调试与案例
  • .pop ----remove 删除
  • @FeignClient注解,fallback和fallbackFactory
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [.net]官方水晶报表的使用以演示下载
  • [100天算法】-不同路径 III(day 73)
  • [20150629]简单的加密连接.txt
  • [android学习笔记]学习jni编程
  • [C++]二叉搜索树
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解