TCP协议详解及其相关的10个核心机制(面试重点)

TCP协议的报文格式


TCP协议有连接,可靠性传输,面向字节流,全双工。

他的数据格式如图:

根据他的数据格式,在这里我们只知道 16位源端口号(表示客户端这里的端口号),16位目的端口号(服务器这边的端口号),还有16位校验和(这里在UDP中的校验和是一样的)。

这里的选项其实就是 “可选” 或 “不选”,没有更加深层的含义。

在这里学习之前我们只能了解到这几个,在后面介绍10大机制的时候会一一介绍。


TCP的十个核心机制


(1) 确认应答。


确认应答这种机制其实是为了保障,TCP协议可靠传输的这种特性。

那么怎么确认应答的呢?

  当客户端A,发送过来一个数据的时候。服务端B,这里不会立马给出响应,而是先发送一个,ack这样的报文,告知A,已确认收到。这里的ACK其实就是上面,保留位的其中之一。


那么在这里我们就需要考虑一个问题,当A一起发送两个数据的时候,那么,B这边是如何保证发送的ack报文,是怎么一一对应的呢?

  因此在这里我们的TCP协议,包含确认序列号,当A每次发数据的时候都会进行编号,B返回的时候,就会根据这个序列号,来进行一一对应。

  此处的序列号,也就是上述TCP报文格式中的32位序列号和32位确认序列号。

如图:


(2)超时重传。


这里我们先考虑一个问题。当我们客户端A,发送数据包是,经过中间的层层传输,还未传给服务端B的时候,突然丢包了怎么办?此时,A就不会收到B这边的应答报文。

  这里我们就会触发,超时重传。意思就是:等了一会没有A,还没有收到,B这边的ack报文,此时,A就会再发一遍数据。

如图:


还有情况是当B这边返回的ack报文,丢包了怎么办?考虑,超时重传,此时A会再次重新发送一次数据,这种很明显时很不合理的。

如图:

就如上述图中所说的,当发生在转账的时候,A就会发起两次充值,而B只返回一次。此时就是一个非常糟糕的事情。

那么在这里我们怎么解决呢?

  其实在操作系统中,存在一种数据结构,  “接收缓冲区” 类似于阻塞队列这种结构。每当B收到A发到的数据之后,B的这种数据结构会根据序列号,对数据进行排序,序列小的在前序列大的在后。

如图:


当重传多次还未成功怎么办?


如果多次尝试了还未成功此时,就会重置连接,通过复写报文,“RST报文” 来重置连接,也是上述保留位的其中之一。


(3)连接管理。


建立连接的流程:三次握手。

断开连接的流程:四次挥手。

在握手和挥手的过程中,传输的网络数据包,不携带任何的业务上的数据。


三次握手


三次握手形象的表现,其实就是投石问路,传输的数据仅起到的作用,就是确保网络传输通畅,不携带,任何的业务逻辑数据。

建立连接,其实就是通信双方,各自保存对端的信息。

具体完成上述的过程,需要进行三次网路的交互。

如图:

其实上图中的,流程一共进行了三次的交互,只是中间的两次交互,ACK和SYN两个和成了一个数据包了。

这里的SYN也是6个标志位的其中之一,其实是synchronize 的缩写,这里是同步的意思。


那么这里问什么要各自发送syn呢?


当客户端A发送数据后,服务端B返回给A一个ack报文,此时B再给A一个syn确定A的接收能力是否正常。只有这样才能确保通信双方,网络通信正常。


三次握手的过程中还需要,协商一些重要的参数。


在这里序列号往往不是从一开始的,而是通信双方通过协商确定的。


三次握手主要意义三个方面:

1.投石问路,确定通信双方路径是畅通的。

2.验证双方的发送能力和接收能力。

3.协商必要的参数,比如起始序号等。


补充如图:


四次挥手


如图:

这里的四次挥手,不一定是客户端先发出的,也可能是服务端。三次握手,一定是客户端先发出的的。


那么啥叫断开连接?就是通信双方,都把各自的信息都给删了。


这里的FIN(结束报文)其实也是6个标志位之一,就是finally的缩写。

这里,四次挥手中,中间的两次通信是否可以合并?

常规情况下是不可以合并的,再特殊的情况下可以合并。

那么为什么不能合并呢?

三次握手过程中,syn和ack都是内核自动控制发送的(其实是同一时机),因此可以合并。

如图:


TCP状态如图:


(4)滑动窗口。


滑动窗口是提高传输速率的机制。

当我们不引入滑动窗口时 如图:

引入滑动窗口时,如图:

如图中所示,引入滑动窗口会大大提高传输效率。


当上述A,发送的1001-2000的序列号的数据,此时B发送这一序列号的报文丢失了怎么办呢?

  其实这种情况完全不用担心,因为,此时ack丢包了,但是数据已经收到了,后面当B返回给A一个序列号位3001的ack,A就会默认小于3001 的数据B已经全部收到了。


那么,在这里A发送的数据报直接丢失了怎么办?例如:1000-2000 的数据丢失了。

如图:

当丢失了之后,此时B会一直返回1001序列号的应答报文,一直向A索要,等待A发送了之后,B就会返回,已经接收到的应答报文,如图中的7001序列号的报文。

如图B的结构:


(5)流量控制。


这里的流量控制,其实就是控制的窗口的大小,来控制发送方的速度。


具体是怎么控制的呢?

如图:

还有就是,上述的TCP报文格式中的 “选项” ,包含窗口扩展因子,可以控制窗口的大小。


(6)拥塞控制。


这里的拥塞控制是站在,接收方的角度,来控制发送方的发送速度。

就是当发送方以较慢的速度发送数据时,经过中间的链路节点的时候,未发生丢包的现象,此时A会提升窗口的大小,加快速度。相同的道理,当丢包严重时,A会降低窗口的大小,来降低A的发送速度。


(7)延时应答。


  延时应答:ack不会立刻返回,而是等一段时间。

为什么要延时?目的,提升传输的效率。

延时,就是为了,给应用程序,腾出来更多的消费时间。

以次,来提高窗口的大小,提升传输的效率。


(8)捎带应答。


这是建立在延时应答的基础上,来提升速率的机制。

捎带应答在生活中也很常见,比如,叫室友帮忙带个东西等,这种都是。

日常开发中,客户端与服务端都是一问一答的情况。

如图:

如图上述所示,我们就可以把ack和响应合成一次传输,来提高传输的效率。


(9)面向字节流。


在字节流读取数据的时候,经常会发生一种问题 “粘包问题” 。就是发送的各种数据包,读取的时候,分不清结束每个数据包的初始和结束。

此时我们可以次啊用(1)使用分隔符 (2)约定包的长度 来解决以上问题。

如图:


(10)异常情况


1)其中某一个进程,突然崩溃了。


不论是进程崩溃,正常结束,操作系统都会回收对应的PCB,可以释放里面的文件描述符表,也就相当于调用了close。这里的4次挥手也能挥完。


2)某个主机关机了(正常流程的关机)。


这里和第一种情况一样,进程结束之后,进行4次挥手。


3)某个主机电源掉电。


如图例子:

B向A,发送一个心跳包,如果A没挂,就会发回一个ack,若A挂了,发送多次之后,仍没有回应,此时B就会单方面删除A的信息。


4)网线断开。


如图所示:


以上的10中机制,是面试的重点,一定要掌握。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/664344.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【微服务】docker部署redis,一主二从三哨兵,读写分离

配置redis读写分离 3台虚拟机 创建目录用于挂载 mkdir -p /root/redis/{conf,data,logs} #master配置文件 bind 0.0.0.0 //任何ip都能访问 port 6379 //redis端口号 logfile "/data/redis.log" //日志文件存放位置,启动redis之前设置为空&#xff…

资深开发推荐的IDEA 插件

开发如虎添翼 工欲善其事,必先利其器。想要提升编程开发效率,必须选择一款顺手的开发工具,插件不在多,而在精,作为从业10年的程序员,我目前用到这十几个插件,在平时开发,代码review…

OpenCv之简单的人脸识别项目(登录页面)

人脸识别 一、项目准备二、登录页面1.导入所需的包2.设置窗口2.1定义窗口外观和大小2.2设置窗口背景2.2.1设置背景图片2.2.2创建label控件 3.运行脚本3.1定义识别脚本3.2定义提取脚本3.3定义标注脚本3.4定义人脸比对脚本3.5定义动态处理脚本3.6定义属性判断脚本 4.创建一个退出…

微信小程序 自定义 tabBar

自定义 tabBar | 微信开放文档 本文案例使用的Taro 非原生微信小程序 使用流程 1. 配置信息 在 app.json 中的 tabBar 项指定 custom 字段,同时其余 tabBar 相关配置也补充完整。所有 tab 页的 json 里需声明 usingComponents 项,也可以在 app.json 全局…

[已解决]FinalShell连接CentOS失败:java.net.UnknownHostException: centos

报错: 解决办法: 1.查看Windows:C:\Windows\System32\drivers\etc\ 2.拷贝hosts文件,用记事本打开hosts文件 3.添加主机名centos及对应IP地址,保存并粘贴覆盖C:\Windows\System32\drivers\etc\中的hosts文件 4.打开cmd命令窗口输…

发成绩的小程序怎么做?

成绩的发布和管理一直是老师和家长共同关心的问题。传统的成绩发布方式往往存在效率低下、信息泄露风险等问题。有没有一种既安全又高效的解决方案呢? 易查分为成绩查询提供了一个理想的平台。不需要下载安装,用户只需通过在线查询的方式即可快速访问&am…

小程序内使用路由

一:使用组件 1)创建组件 2)在需要的页面的json/app.json可实现局部使用和全局使用 在局部的话,对象内第一层,window配置也是第一层,而在全局配置也是在第一层,window在window对象内.第二层.内部执行遍历不一样. 3)页面使用 上述所写可实现在页面内使用组件.效果是页面内可以将…

HTML5的标签(文本链接、图片路径详解)

目录 前言 一、文本链接 超链接表述 二、图片路径详解 绝对路径 相对路径 网络路径 前言 一、文本链接 超链接表述 HTML 使用标签<a>来设置超文本链接 超链接可以是一个字&#xff0c;一个词&#xff0c;或者一组词&#xff0c;也可以是一幅图像&#xff0c;…

vscode编辑器创建分支注意事项?!

最近在公司开发项目时&#xff0c;不小心将自己分支的东西提交到公司的master的分支&#xff0c;大家看看是什么情况&#xff1f; 先上图&#xff1a; 从图上看&#xff0c;我这边用了GITLENS这个插件&#xff0c;在创建分支时&#xff0c;有个create branch from&#xff0c;有…

Windows 权限维持之 Shift 后门

正常情况下我们连按五次 shift 键会弹出粘滞键 粘滞键是电脑使用中的一种快捷键&#xff0c;一般连按五次 shift 会出现粘滞键提示&#xff0c;粘滞键是专为同时按下两个或多个键有困难的人而设计的&#xff0c; 粘滞键开启后&#xff0c;可以先按一个键位&#xff0c;再按另一…

如何识别并选择正规、优质的外汇交易平台?

外汇市场的日益繁荣吸引了越来越多的投资者&#xff0c;但同时也带来了众多外汇平台的涌现。如何在这些平台中筛选出正规、可信的平台&#xff0c;成为了每位外汇交易者必须面对的首要问题。以下&#xff0c;我们将为您揭示如何鉴别外汇平台真伪的几个关键方法&#xff1a; 首先…

生成 PDF 用 Turborepo 管理,简单的事情复杂化?

最近在做一个生成报告的项目&#xff0c;稍微了解过这方面知识的同学大概都可以想到直接 HTML 写模板&#xff0c;利用 html2canvas jspdf 两个库就可以实现&#xff0c;非常简单。但是为什么我采用 Turborepo 来管理这个项目呢&#xff1f; 有兴趣的同学在看本文前应先了解一…

从了解到掌握 Spark 计算框架(二)RDD

文章目录 RDD 概述RDD 组成RDD 的作用RDD 算子分类RDD 的创建1.从外部数据源读取2.从已有的集合或数组创建3.从已有的 RDD 进行转换 RDD 常用算子大全转换算子行动算子 RDD 算子综合练习RDD 依赖关系窄依赖宽依赖宽窄依赖算子区分 RDD 血统信息血统信息的作用血统信息的组成代码…

部署k8s的DashBoard

1. 部署 Dashboard UI [rootk8s-master ~]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recomme nded.yaml一般上面的网站访问不了 可以下载我上传的资源DashBoard的recommended.yaml vim recommended.yaml 复制粘贴我上…

SQL查询太慢?实战讲解YashanDB SQL调优思路

本文是 Meetup 第十期 “调优实战专场” 的第二篇技术文章&#xff0c;上一篇《高效查询秘诀&#xff0c;解码 YashanDB 优化器分组查询优化手段》中&#xff0c;我们揭秘了 YashanDB 分组查询优化秘诀&#xff0c;本文将通过一个案例&#xff0c;助你快速上手 YashanDB 慢日志…

爱堡集团数智掘金—共绘上市蓝图

&#xff08;本台记者报&#xff09;2024年5月26日爱堡集团在浙江省杭州市上城区瑞莱克斯大酒店隆重召开规模达500人的盛会。这场聚焦智慧与创新的会议&#xff0c;旨在加速爱堡集团的数智化转型进程&#xff0c;并为其上市之路绘制蓝图&#xff0c;吸引了众多行业领袖和媒体的…

统信UOS桌面操作系统1070安装vmware workstation 17

原文连接&#xff1a;统信UOS桌面操作系统1070安装vmware workstation 17 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在统信UOS桌面操作系统1070上安装VMware Workstation 17.5.2的文章。VMware Workstation是一款强大的虚拟化软件&#xff0c;可以让您在一台计…

未来工厂新篇章:大型工厂3D可视化技术引领工业新潮流

在科技日新月异的今天&#xff0c;大型工厂不再是我们印象中机器轰鸣、尘土飞扬的钢铁丛林&#xff0c;而是变成了智慧与效率并存的现代化生产中心。这一切的改变&#xff0c;都离不开一项革命性的技术——3D可视化。 一、何为大型工厂3D可视化&#xff1f; 大型工厂3D可视化&…

vue3 setup 使用 beforeRouteEnter 组件内路由守卫

vue3 setup 使用 beforeRouteEnter 组件内路由守卫 setup 中只有onBeforeRouteLeave、onBeforeRouteUpdate两个钩子函数&#xff0c; 没有beforeRouteEnter对应的钩子函数&#xff0c;所以无法在setup中直接使用 <script setup> onBeforeRouteLeave((to, from) > {// …

pytorch使用tensorboardX面板自动生成模型结构图和各类可视化图像

总结&#xff1a; 在原本代码中额外添加如下几行即可实现查看模型结构&#xff1a; from tensorboardX import SummaryWriter # 用于进行可视化# 1. 来用tensorflow进行可视化with SummaryWriter("./log", comment"sample_model_visualization") as sw: …