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

TCP报头详解及TCP十种核心机制(一)

目录

前言:

TCP报头

TCP核心机制

一、确认应答

二、超时重传

小结:


前言:

    这篇文章详细介绍了TCP报头中的一些核心数据,及两种TCP核心机制。其他的一些机制会在后面文章中详细介绍。

TCP报头

解释:

1)源端口号,目的端口号

    源端口号,目的端口号就是在网络通信中五元组之二。由于是16位,那么就存在数据的取值范围。0 -- 1023为知名端口号,和UDP这里是一样的,上篇文章中有详细介绍。

2)32位序号

    TCP为了实现可靠性,提出了确认应答和超时重传来主要保证TCP的可靠性。32位序号就是针对TCP发送的数据按照字节进行编号(累加进行编号)。

    因此只需要确定第一个字节的序号,根据数据长度就可以推算出其他字节的序号。那么在数据传输时只需要将第一个字节序号传输过去即可。

    由于数据传输存在 “后发先至” 的问题,那么接收方回复的数据就不知道是针对那一条。因此在应答报文中,就可以利用序号确定对哪一条数据进行应答(回复时针对编号进行回复)。

3)32位确认序号

    当接收方接收到数据后,按照接收到的数据最后一个字节序号 + 1 作为确认序号。如果返回的应答报文这个确认序号是上一条数据最后一字节序号加1,就证明这个序号以前的数据发送成功了。

4)4位首部长度

    描述了TCP报头的长度(单位4字节),4位最大就是15,即报头长度最大就是60字节。

    报头除过选项,其他长度是固定的20个字节。

5)保留六位

    为以后的扩展提供位置,便于TCP扩展。

6)六位标志位

    – URG: 紧急指针是否有效。
    – ACK: 确认号是否有效(应答报文有效)。
    – PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走。
    – RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段。
    – SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段。
    – FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段。

    ACK这位如果为1证明就是应答报文,如果为0就不是。确认序号只有在应答报文中才有意义。其他几位后续的十种核心机制中会提到。

    六位标志位,就是为了确定了这个报文是哪一类。

7)16位窗口大小

    后面的滑动窗口中详细介绍。

8)16位校验和

    这里和UDP原理一样。根据一些算法计算出校验和,在接收的数据再计算一遍,然后对比是否相等,来确定数据是否准确。UDP这里有详细介绍。

9)16位紧急指针

    标识了那部分数据为紧急数据。

10)选项

    TCP报头除过选项其他固定20位,即:首部长度 - 20 = 选项长度。TCP报头大小是可变的,就是因为选项的存在,选项对TCP报文一些属性进行解释说明。

TCP核心机制

一、确认应答

问题:    

    网络中后发先至这个现象是客观存在的,无法避免。因此报文到达的顺序也是会有变化的。

解决方案:

    针对数据进行编号,按照字节为单位进行编号。字节序号进行累加,因此只需要标注起始字节序号,其他字节序号就可以推断出来。对于后一条数据起始序号就是前一条数据最后字节序号加1。在响应数据时只需要针对序号进行响应即可。

    当客户端接收到响应后,按照应答报文中的确认序号,就可以确定这个序号之前的数据已经发送成功了。

确认序号取值:

    针对收到数据后最后一个字节序号 + 1。返回的ACK,如果这个确认序号是上一条数据最后一字节序号加1,就证明数据发送成功了。接下来发送方就从上一条数据最后一字节序号 + 1 为下一条      数据的起始序号进行发送。

小结:

    TCP可靠传输能力,最主要就是通过确认应答和超时重传体现的。通过应答报文,就可以让发送方清楚知道数据传输是否成功。进一步引入序号和确认序号,针对多组数据进行区分。

二、超时重传

问题:

    丢包分为两种情况:1.发送的数据包丢了。2.返回的应答数据包丢了。发送方看到的结果就是没有响应,那么一致认为丢包了。(丢包的概率非常小,但是存在)

TCP重传机制:

    引入一个时间阈值。发送方发送数据后,开始计时。如果时间阈值内没有收到响应,就认为是丢包了。然后就进行重新传输。(超时重传,超过一定的时间,没有响应,就重新传输)

    如果重传多次都失败(时间间隔会增大,非常小概率事件),TCP会认为网路出现故障。TCP就会断开重新连接。如果重置还是失败,就彻底断开连接了。

问题:

    如果返回的应答数据报丢了,重传就会使接收方收到多个一样的数据。

解决方案:

    TCP存在接收缓冲区(内核中的一块内存),每个socket对象都有一个接收缓冲区(也有发送缓冲区)。缓冲区可以认为是一个阻塞的优先级队列,利用序号针对重复数据进行去重(丢包重传产生的),利用序号对数据进行排序。然后接收端从缓冲区接收的数据就是,有序且去重的。

小结:

    可靠传输是TCP的最核心部分。TCP的可靠传输就是通过 确认应答 + 超时重传 来体现的。确认应答描述的是传输顺利的情况,超时重传描述的是传输出现问题的情况。两种相互配合,共同体现TCP的可靠性。

相关文章:

TCP报头详解及TCP十种核心机制(一)

目录 前言: TCP报头 TCP核心机制 一、确认应答 二、超时重传 小结: 前言: 这篇文章详细介绍了TCP报头中的一些核心数据,及两种TCP核心机制。其他的一些机制会在后面文章中详细介绍。 TCP报头 解释: 1&#xff…...

Linux用户的添加、修改和删除以及相关配置文件:useradd、passwd、usermod、userdel、相关配置文件

目录 账户的创建(useradd) 第一步:创建账号 第二步:创建密码 useradd参考文件 CROUP100 HOME/home INACTIVE-1 EXPIRE SHELL/bin/bash SKEL/etc/skel UID/GID密码参数参考:/etc/login.defs 密码参数显示命…...

进程地址空间

目录 回顾C/C语言的程序地址空间 感性认识虚拟地址空间 虚拟地址空间与物理空间如何建立映射关系 为什么要虚拟地址空间? 回顾C/C语言的程序地址空间 在学习C/C语言时我们知道了一个概念叫程序地址空间。通俗来说就是如下一张表,从中可以得知系统的几…...

数楼梯(加强版)

数楼梯(加强版) 题目背景: 小明一天放学回家,看到从1楼到2楼共有n个台阶,因为好奇,他想尝试一下总共有几种方案到二楼?他可以1步,2步,3步的跳,不能跳3步以上. 他试了很多次都没有解决这个问题,于是请求聪明的你帮忙解决这个问题. 题目描述: 1楼到2楼楼梯有n级台阶。小明每…...

MySQL-数据类型

数据类型简介数据表由多列字段构成,每一个字段指定了不同的数据类型,指定了数据类型之后,也就决定了向字段插入的数据内容。不同的数据类型也决定了 MySQL 在存储它们的时候使用的方式,以及在使用它们的时候选择什么运算符号进行运…...

剑指 Offer 32 - II. 从上到下打印二叉树 II(java解题)

剑指 Offer 32 - II. 从上到下打印二叉树 II(java解题)1. 题目2. 解题思路3. 数据类型功能函数总结4. java代码5. 踩坑记录1. 题目 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。 例如: 给定二叉…...

C#网络爬虫开发

1前言爬虫一般都是用Python来写,生态丰富,动态语言开发速度快,调试也很方便但是我要说但是,动态语言也有其局限性,笔者作为老爬虫带师,几乎各种语言都搞过,现在这个任务并不复杂,用我…...

Fastjson 总结

0x00 前言 这一篇主要是针对已经完成的fastjson系列做一个知识点总结,一来是为了更加有条理的梳理已经存在的内容,二来是为了更好的复习和利用。 0x01 Fastjson基础知识点 1.常见问题: 问:fastjson的触发点是什么?…...

文件路径模块os.path

文件路径模块os.path 文章目录文件路径模块os.path1.概述2.解析路径2.1.拆分路径和文件名split2.2.获取文件名称basename2.3.返回路径第一部分dirname2.4.扩展名称解析路径splitext2.5.返回公共前缀路径commonprefix3.创建路径3.1.拼接路径join3.2.获取家目录3.3.规范化路径nor…...

Kerberos简单介绍及使用

Kerberos作用 简单来说安全相关一般涉及以下方面:用户认证(Kerberos的作用)、用户授权、用户管理.。而Kerberos功能是用户认证,通俗来说解决了证明A是A 的问题。 认证过程(时序图) 核心角色/概念 KDC&…...

DOM编程-全选、全不选和反选

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>全选、全不选和反选</title> </head> <body bgcolor"antiquewhite"> <script type"text/jav…...

C++11可变模板参数

C11可变模板参数一、简介二、语法三、可变模版参数函数3.1、递归函数方式展开参数包3.2、逗号表达式展开参数包一、简介 C11的新特性–可变模版参数&#xff08;variadic templates&#xff09;是C11新增的最强大的特性之一&#xff0c;它对参数进行了高度泛化&#xff0c;它能…...

Linux多线程

目录 一、认识线程 1.1 线程概念 1.2 页表 1.3 线程的优缺点 1.3.1 优点 1.3.2 缺点 1.4 线程异常 二、进程 VS 线程 三、Linux线程控制 3.1 POSIX线程库 3.1 线程创建 3.3 线程等待 3.4 线程终止 3.4.1 return退出 3.4.2 pthread_exit() 3.4.3 pthread_cancel…...

Webpack5 环境下 Openlayers 标注(Icon) require 引入图片问题

Webpack5 环境下 Openlayers 标注&#xff08;Icon&#xff09; require 引入图片问题环境版本Openlayers 使用 require 问题Webpack5 正确配置构建新环境的时候&#xff0c;偶然发现 Openlayers 使用 require 的方式加载图片&#xff08;Icon&#xff09;报错&#xff0c;开始…...

Zookeeper安装部署

文章目录Zookeeper安装部署Zookeeper安装部署 将Zookeeper安装包解压缩&#xff0c; [rootlocalhost opt]# ll 总用量 14032 -rw-r--r--. 1 root root 12392394 10月 13 11:44 apache-zookeeper-3.6.0-bin.tar.gz drwxrwxr-x. 6 root root 4096 10月 18 01:44 redis-5.0.4 …...

Cow Acrobats ( 临项交换贪心 )

题目大意&#xff1a; N 头牛 &#xff0c; 每头牛有一个重量(Weight)和一个力量(Strenth) &#xff0c; N头牛进行排列 &#xff0c; 第 i 头牛的风险值为其上所有牛总重减去自身力量 &#xff0c; 问如何排列可以使最大风险值最小 &#xff0c; 求出这个最小的最大风险值&am…...

MySQL:为什么说应该优先选择普通索引,尽量避免使用唯一索引

前言 在使用MySQL的过程中&#xff0c;随着表数据的逐渐增多&#xff0c;为了更快的查询我们需要的数据&#xff0c;我们会在表中建立不同类型的索引。 今天我们来聊一聊&#xff0c;普通索引和唯一索引的使用场景&#xff0c; 以及为什么说推荐大家优先使用普通索引&#xf…...

Spring Cloud alibaba之Feign

JAVA项目中如何实现接口调用&#xff1f;HttpclientHttpclient是Apache Jakarta Common下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持Http协议的客户端编程工具包&#xff0c;并且它支持HTTP协议最新版本和建议。HttpClient相比传统JDK自带的URL Connection&a…...

零信任-Google谷歌零信任介绍(3)

谷歌零信任的介绍&#xff1f; "Zero Trust" 是一种网络安全模型&#xff0c;旨在通过降低网络中的信任级别来防止安全威胁。在零信任模型中&#xff0c;不论请求来自内部网络还是外部网络&#xff0c;系统都将对所有请求进行详细的验证和审核。这意味着每次请求都需…...

Numpy基础——人工智能基础

文章目录一、Numpy概述1.优势2.numpy历史3.Numpy的核心&#xff1a;多维数组4.numpy基础4.1 ndarray数组4.2 内存中的ndarray对象一、Numpy概述 1.优势 Numpy(Nummerical Python),补充了Python语言所欠缺的数值计算能力&#xff1b;Numpy是其它数据分析及机器学习库的底层库&…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

WebRTC调研

WebRTC是什么&#xff0c;为什么&#xff0c;如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...