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

你真的知道TCP协议中的序列号确认、上层协议及记录标识问题吗?

在这里插入图片描述

引言

在前面的内容中,我们已经详细讲解了一系列与TCP相关的面试问题。然而,这些问题都是基于个别知识点进行扩展的。今天,我们将重点讨论一些场景问题,并探讨如何解决这些问题。

序列号确认问题

当A主机与B主机建立了TCP连接后,A主机发送了两个TCP报文,分别大小为500和300字节。第一个报文的序列号为200。那么当B主机接收到这两个报文后,返回的确认号应该是多少呢?

image

当A主机发送第一个TCP报文时,序列号为200,大小为500。因此,A主机发送的数据范围是200-699(包括200和699)。

当A主机发送第二个TCP报文时,序列号为700,大小为300。因此,A主机发送的数据范围是700-999(包括700和999)。

当B主机接收到这两个报文后,确认号应该是下一个预期的序列号。根据TCP的规则,下一个预期的序列号应该是接收到的最后一个字节的序列号加上1。

所以,B主机接收到的最后一个字节的序列号是999,因此,返回的确认号应该是1000。

为什么增加的是tcp包的大小而不是单纯+1呢?为什么增加的是TCP包的大小而不是简单地加1呢?在TCP协议中,确认号是基于接收到的数据字节数来计算的,而不是简单地加1。

当B主机接收到A主机发送的第一个500字节的TCP报文时,B主机期望下一个字节的序列号是200 + 500 = 700。由于TCP是面向字节的传输协议,每个字节都有一个唯一的序列号,因此确认号是基于已接收字节的累积值。所以,B主机返回的确认号是700。

接着,当B主机接收到A主机发送的第二个300字节的TCP报文时,B主机期望下一个字节的序列号是700 + 300 = 1000。因此,B主机返回的确认号是1000。

如何确定上层协议?

收到一个IP数据包后,操作系统中的网络协议栈会进行解析。在解析过程中,有一个关键步骤是确定该数据包应该投递到上层的哪个协议(UDP或TCP)。

为了更好地理解这个过程,我们先来看一下分层协议结构示意图:

image

可以看到,在包装完TCP头信息之后,才会包装IP头信息。因此,在IP头部中应该能够得知当前是什么协议的数据包。接下来,我们来具体查看一下IP头信息的示意图:

image

在IP协议中,协议字段用于区分上层协议。在Linux系统的/etc/protocols文件中定义了所有上层协议对应的协议字段。例如,ICMP的协议字段为1,TCP的协议字段为6,UDP的协议字段为17。

我们知道TCP和UDP是服务器传输数据的常用协议。而ICMP则是用于传输网络传输过程中的一些中间链路的错误信息反馈。正如之前提到的,路由器等网络设备属于三层协议,它们可以判定并修改IP头部中的信息。

因此,通过对IP头部中的协议字段进行解析,操作系统可以确定接收到的数据包应该传递给哪个上层协议进行处理。

应用程序应该如何提供他们自己的记录标识?

TCP提供了一种字节流服务,其中发送方和接收方都不维护记录的边界。这意味着在传输过程中,数据可能会被分割成多个TCP段,而接收方需要确定每个段属于哪个应用程序的记录。应⽤程序应该如何提供他们自己的记录标识呢?

image

为了实现这一点,应用程序可以使用一些方法来提供自己的记录标识。以下是一些常用的方法:

  • 使用特定的协议头或标识符:应用程序可以在发送的数据中添加特定的协议头或标识符,以便接收方能够识别和组合相关的数据段。例如,在Redis的通信协议(RESP协议)中,每个命令或数据都以特定的控制字符"\r\n"作为结束符,这样接收方就能够根据这些结束符来识别和组合记录。
  • 使用固定长度的数据块:应用程序可以将数据划分为固定长度的数据块,并在每个数据块前添加标识信息。接收方可以根据这些标识信息来组合和还原应用程序的记录。
  • 使用消息边界标记:应用程序可以在数据中使用特定的消息边界标记,例如特殊字符或预定的控制序列。接收方根据这些边界标记来确定每个记录的边界。

通过使用这些方法,应用程序可以在数据传输过程中进行分段和还原,从而实现记录的完整性和可靠性。这些方法能够提供自定义的记录标识,使得数据能够准确地组合和还原为应用程序的记录。

TCP 和 UDP 的区别

TCP(传输控制协议)和UDP(用户数据报协议)是两种常见的互联网传输协议,它们在网络通信中有以下几个主要的区别:

  • 连接性:TCP是面向连接的协议,它在通信前需要建立一个可靠的连接,然后再进行数据传输。而UDP是无连接的协议,它不需要建立连接就可以直接发送数据。
  • 可靠性:TCP提供可靠的数据传输,它使用确认机制、重传机制、流量控制、拥塞控制和序列号等技术来确保数据的完整性和有序性。UDP则不提供可靠性保证,它只是简单地将数据包发送出去,并不关心是否能够到达目标。
  • 速度:由于TCP提供了可靠性保证和流量控制等机制,因此它的传输速度相对较慢。而UDP没有这些额外的机制,所以传输速度比TCP快。
  • 占用资源:TCP需要维护连接状态和缓存等信息,因此占用的系统资源较多。而UDP不需要维护连接状态,所以占用的系统资源较少。
  • 适用场景:由于TCP提供了可靠性保证,所以在需要确保数据完整性和有序性的场景下使用较多,如文件传输、网页浏览等。而UDP适用于实时性要求较高的场景,如视频和音频流媒体、在线游戏等。

总结

通过本文的讲解,我们了解了一些关于TCP的场景问题及其解决方法。我们学习了如何确定TCP报文的应答号,通过解析IP头部的协议字段来确定数据包的上层协议,以及应用程序如何提供自己的记录标识。此外,我们还比较了TCP和UDP的区别,包括连接性、可靠性、速度、资源占用和适用场景等方面。通过深入理解这些问题,我们可以更好地应对TCP相关的面试和实际应用场景。

相关文章:

你真的知道TCP协议中的序列号确认、上层协议及记录标识问题吗?

引言 在前面的内容中,我们已经详细讲解了一系列与TCP相关的面试问题。然而,这些问题都是基于个别知识点进行扩展的。今天,我们将重点讨论一些场景问题,并探讨如何解决这些问题。 序列号确认问题 当A主机与B主机建立了TCP连接后…...

一家生物技术企业终止,科创属性可能不足,报告期内专利数猛增

轩凯生物九成以上营业收入来源于植物营养领域,收入来源结构单一,产品下游应用领域较为集中。报告期内公司应收账款账面价值逐年上升,回款比例显著低于前两年,遭交易所问询是否存在较大的坏账风险。 轩凯生物核心技术是否成熟以及是…...

使用 Python 的 BeautifulSoup(bs4)解析复杂 HTML

使用 Python 的 BeautifulSoup(bs4)解析复杂 HTML:详解与示例 在 Web 开发和数据分析中,解析 HTML 是一个常见的任务,尤其是当你需要从网页中提取数据时。Python 提供了多个库来处理 HTML,其中最受欢迎的就…...

Spring Cache Caffeine 高性能缓存库

​ Caffeine 背景 Caffeine是一个高性能的Java缓存库,它基于Guava Cache进行了增强,提供了更加出色的缓存体验。Caffeine的主要特点包括: 高性能:Caffeine使用了Java 8最新的StampedLock乐观锁技术,极大地提高了缓存…...

Python3入门--数据类型

文章目录 一、基础语法编码标识符注释单行注释以 # 开头多行注释用多个 # 号,还有 和 """ 空行行与缩进同一行显示多条语句多行语句 二、数据类型Number(数字)type和isinstance查询变量类型数值运算 String(字符串…...

开发运维警示录-20241024

开发警示录 1、作为开发,不要私自修改业务人员给的SQL语句,虽然个人感觉SQL很冗余,效率低等。 2、开发前,要明确需求,必要时通过图和文字形成文档与需求方确认、留痕。 3、开发复杂的业务逻辑代码前,先疏通…...

Linux运维_搭建smb服务

Samba(SMB)是一个开源软件,允许Linux和Unix系统与Windows系统共享文件和打印机。以下是一些关于Samba和SMB的基本信息和操作步骤: Samba 和 SMB 基本概念 Samba:实现了SMB(Server Message Block&#xff…...

vue3移动端可同时上传照片和视频的组件

uni-app中的uni-file-picker可单独上传照片或视频,但不支持同时上传照片和视频。本篇博客使用image标签和video标签实现移动端(H5app小程序)中照片和视频的同时上传。 本篇博客采用的是照片和视频的单独上传,但可同时展示&#xf…...

PyQt入门指南二十七 QTableView表格视图组件

# 创建一个QStandardItemModel实例,用于存储表格数据model QStandardItemModel(4, 2) # 4行2列# 填充模型数据for row in range(4):for column in range(2):item QStandardItem(fRow {row}, Column {column})model.setItem(row, column, item)# 创建一个QTableVi…...

AI学习指南深度学习篇-自注意力机制(Self-Attention Mechanism)

AI学习指南深度学习篇—自注意力机制(Self-Attention Mechanism) 在深度学习的研究领域,自注意力机制(Self-Attention Mechanism)作为一种创新的模型结构,已成为了神经网络领域的一个重要组成部分&#xf…...

【JAVA毕业设计】基于Vue和SpringBoot的校园管理系统

本文项目编号 T 026 ,文末自助获取源码 \color{red}{T026,文末自助获取源码} T026,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 管…...

你对MySQL的having关键字了解多少?

在MySQL中,HAVING子句用于在数据分组并计算聚合函数之后,对结果进行进一步的过滤。它通常与GROUP BY子句一起使用,以根据指定的条件过滤分组。HAVING子句的作用类似于WHERE子句,但WHERE子句是在数据被聚合之前进行过滤&#xff0c…...

【STM32编码器】【STM32】

提示:一般情况下我们会设计一个硬件电路模块来自动完成简单重复而高频的计算 文章目录 一、为什么通常情况下不使用外部中断来对编码器的脉冲进行计数?二、编码器速度测量程序设计思路三、正交编码器四、初始化流程五、STM32正交编码器输入捕获模式配置示…...

Python轴承故障诊断 (13)基于故障信号特征提取的超强机器学习识别模型

往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客 Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客 Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客 三十多个开源…...

VScode分文件编写C++报错 | 如何进行VScode分文件编写C++ | 不懂也能轻松解决版

分文件编写遇到的问题 分文件编写例子如下所示: 但是直接使用 Run Code 或者 调试C/C文件 会报错如下: 正在执行任务: C/C: g.exe 生成活动文件 正在启动生成… cmd /c chcp 65001>nul && D:\Librarys\mingw64\bin\g.exe -fdiagnostics-col…...

洞察前沿趋势!2024深圳国际金融科技大赛——西丽湖金融科技大学生挑战赛技术公开课指南

在当前信息技术与“互联网”深度融合的背景下,金融行业的转型升级是热门话题,创新与发展成为金融科技主旋律。随着区块链技术、人工智能技术、5G通信技术、大数据技术等前沿科技的飞速发展,它们与金融领域的深度融合,正引领着新型…...

Unity3D学习FPS游戏(4)重力模拟和角色跳跃

前言:前面两篇文章,已经实现了角色的移动和视角转动,但是角色并没有办法跳跃,有时候还会随着视角移动跑到天上。这是因为缺少重力系统,本篇将实现重力和角色跳跃功能。觉得有帮助的话可以点赞收藏支持一下!…...

C#基础知识-枚举

目录 枚举 1.分类 1.1普通枚举 1)默认情况 2)指定起始值 1.2标志枚举(Flag Enum) 位运算符与标志枚举 1)组合标志 2)检查标志 2.枚举与不同类型之间的转换 1)枚举->整型 2&#…...

系统架构设计师教程 第2章 2.1-2计算机系统及硬件 笔记

2.1计算机系统概述 ★☆☆☆☆ 计算机系统 (Computer System) 是指用于数据管理的计算机硬件、软件及网络组成的系统。 一般指由硬件子系统和软件子系统组成的系统,简称为计算机。 将连接多个计算机以实现计算机间数据交换能力的网络设备,称为计算机网…...

通过使用Visual Studio将你的程序一键发布到Docker

通过使用Visual Studio将你的程序一键发布到Docker 代码 阿里云容器镜像服务 https://www.aliyun.com/product/acr 添加Docker CE阿里云镜像仓库 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 安装Docker CE、Doc…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则&#xf…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息&#xff0…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...