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

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

二维FDTD算法仿真

二维FDTD算法仿真&#xff0c;并带完全匹配层&#xff0c;输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...

SQL注入篇-sqlmap的配置和使用

在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap&#xff0c;但是由于很多朋友看不了解命令行格式&#xff0c;所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习&#xff0c;链接&#xff1a;https://wwhc.lanzoue.com/ifJY32ybh6vc…...