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.mzph.cn/news/845427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法简单笔记4

5月31号,明天决赛,今天脑子也是一滩浆糊,踏马的一道题也做不出来,超级难受,只好简单复盘一下两道之前的题目,看完就差不多了,再学也没啥用了,写完这两题题解我就回去打把steam绝地求…

深度学习聚类再升级!新算法实现强悍性能,准确率超98%

深度聚类不仅继承了传统聚类算法的优点,在对高维和非线性数据的处理能力,以及自适应性和抗噪性方面也具有很大优势。 具体来说,结合深度学习的聚类算法通过利用深度神经网络的强大特征提取能力,自动学习和识别数据中的复杂结构和…

全志H616(BIGTREETECH CB1)和 博通BCM2711(树莓派4B)CPU对比测试

一,实物对比图: BIGTREETECH CB1的底板接口的分布和树莓派4B是一样的,但是没有树莓派的音频接口,底板也不能放到树莓派4B的官方外壳里,因为底板的背面有一个DSI接口,高度超出了。 二,开发板硬…

HBSL-22Q/K定时限过电流继电器 板前接线 JOSEF约瑟

HBSL系列静态定时限过电流继电器 系列型号: HBSL-11A/E静态定时限过电流继电器;HBSL-11A/K静态定时限过电流继电器;HBSL-12A/E静态定时限过电流继电器; HBSL-12A/K静态定时限过电流继电器;HBSL-21A/E静态定时限过电…

JS-09-es6常用知识1

目录 1 模板字符串 1.1 模板字符串基本用法 1.2 模板字符串解决了一些痛点 2 解构赋值 2.1 对象的解构赋值 2.2 函数参数的解构赋值 2.3 补写:属性的简写 3 rest参数 3.1 arguments 3.2 rest参数 3.3 补充:判断数据类型 4 箭头函数 4.1 …

SpringBoot-世界杯足球赛网站-28567

Springboot世界杯足球赛网站 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对世界杯足球赛…

jsmug:一个针对JSON Smuggling技术的测试PoC环境

关于jsmug jsmug是一个代码简单但功能强大的JSON Smuggling技术环境PoC,该工具可以帮助广大研究人员深入学习和理解JSON Smuggling技术,并辅助提升Web应用程序的安全性。 背景内容 JSON Smuggling技术可以利用目标JSON文档中一些“不重要”的字节数据实…

C++ 特殊运算符

一 赋值运算符 二 等号作用 三 优先级和结合顺序 四 左值和右值 五 字节数运算符 条件运算符 使用条件运算符注意 逗号运算符 优先级和结合顺序 总结

实战15:bert 命名实体识别、地址解析、人名电话地址抽取系统-完整代码数据

直接看项目视频演示: bert 命名实体识别、关系抽取、人物抽取、地址解析、人名电话地址提取系统-完整代码数据_哔哩哔哩_bilibili 项目演示: 代码: import re from transformers import BertTokenizer, BertForTokenClassification, pipeline import os import torch im…

【linux】docker下nextcloud安装人脸识别插件2

接上文 【linux】docker下nextcloud安装人脸识别插件-CSDN博客 由于作者不再维护此插件,转而开发新的插件 recognize ,因此同步更新插件使用教程。 1、下载人脸识别app:recognize Recognize - Apps - App Store - Nextcloud 2、将插件recog…

Java解析JSON并修改属性值:从JSON到JsonObject的逐层解析

哈喽,大家好,我是木头左! 在Java中,可以使用各种库来解析和操作JSON数据。其中,Gson和Jackson是两个非常流行且功能强大的库。在这篇文章中,将使用Gson库来解析给定的JSON字符串,修改operationB…

python移位操作符(左移位操作符<<、右移位操作符>>)(允许开发者对整数进行位操作,乘2或除2)(左移操作、右移操作)(位掩码操作|=)

文章目录 Python 中的移位操作符详解移位操作符简介左移位操作符 (<<)语法和使用示例代码输出 右移位操作符 (>>)语法和使用示例代码输出 移位操作符的应用场景快速乘除运算&#xff1a;使用移位操作符代替传统的乘法和除法运算&#xff0c;可以提高计算速度。位掩…

生产问题(十六)数据丢失-mysql binlog排查

一、引言 最近作者遇到一个线上问题&#xff0c;是mysql 的数据丢失了&#xff0c;这里记录一下排查过程和binlog的分析。 二、问题 问题出现的表象是应用系统大量报错&#xff0c;各种空指针之类的&#xff0c;这种一看就不可能是代码发布的问题&#xff0c;原因一定在框架、…

第十八节:认识一些经典递归过程

一 暴力递归就是尝试 1&#xff0c;把问题转化为规模缩小了的同类问题的子问题 2&#xff0c;有明确的不需要继续进行递归的条件(base case) 3&#xff0c;有当得到了子问题的结果之后的决策过程 4&#xff0c;不记录每一个子问题的解 二 打印n层汉诺塔从最左边移动到最右边的全…

分形之科赫雪花

前言 分形是一种具有自相似性的几何图形或数学对象。它的特点是无论在任何放大或缩小的尺度下,都能够看到与整体相似的图形。分形的形状可以非常复杂,常常具有分支、重复的图案,以及细节层次丰富的结构。 分形在自然界中广泛存在,如云朵、树枝、山脉、海岸线等,它们都展…

Java常用API(三)

一、Arrays类 1.定义 Arrays是一个用于操作数组的工具类。 2.常用方法 1.toString方法 public class Demo {public static void main(String[] args) {//toString 将数组变成字符串int[] arr {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};System.out.println(Arrays.toString(arr));…

故障——pod状态为pending该如何解决

一、报错问题 当您的虚拟机出现如下报错&#xff0c;您首先快照一下虚拟机如果仍然报错 二、解决方法 2.1 任务管理器 首先进入任务管理器&#xff08;CtrlAltDel&#xff09;内&#xff0c;查看所有vmware是否都处在运行的状态&#xff0c;可能会跳出一个比较突兀的进程&#…

【Spring Cloud】微服务链路跟踪Sleuth

目录 为什么要使用微服务链路跟踪微服务的现状多服务协同工作复杂的调用链条容易出错 微服务链路跟踪需要实现的需求实现监控决策避免技术债务快速定位故障 微服务链路跟踪的技术要求低消耗应用透明延展性可控采样率可视化 Spring Cloud Sleuth简介Spring Cloud Sleuth的4个特点…

自动控制:控制系统的稳定性

自动控制&#xff1a;控制系统的稳定性 在自动控制领域&#xff0c;控制系统的稳定性是一个至关重要的问题。稳定性决定了系统在受到扰动后是否能够恢复到平衡状态。本文将介绍控制系统稳定性的基本概念、如何利用特征值分析稳定性&#xff0c;并通过具体示例和Python代码展示…

【洛谷B3643】图的存储 解题报告

洛谷B3643 - 图的存储 题目描述 给定一个 n n n 个顶点 m m m 条边的无向图。请以邻接矩阵和邻接表的形式输出这一张图。 输入格式 第一行输入两个正整数 n n n 和 m m m&#xff0c;表示图的顶点数和边数。 第二行开始&#xff0c;往后 m m m 行&#xff0c;每行输入…