当前位置: 首页 > 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是其它数据分析及机器学习库的底层库&…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 原创笔记&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;《数据结构第4章 数组和广义表》…...

数据库正常,但后端收不到数据原因及解决

从代码和日志来看&#xff0c;后端SQL查询确实返回了数据&#xff0c;但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离&#xff0c;并且ai辅助开发的时候&#xff0c;很容易出现前后端变量名不一致情况&#xff0c;还不报错&#xff0c;只是单…...