Linux网络:传输层协议TCP(一)

目录

一、TCP协议的定义

二、确认应答机制ACK

三、序号、确认序号

四、超时重传机制


一、TCP协议的定义

TCP 全称为 "传输控制协议(Transmission Control Protocol"). 人如其名, 要对数据的传 输进行一个详细的控制;

TCP 协议段格式

源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;

32 位序号/32 位确认号: 用于确认报文是否成功发送/接收。博主后面详细讲;

4 位 TCP 报头长度: 表示该 TCP 头部有多少个 32 位 bit(有多少个 4 字节); 所以 TCP 头部最大长度是 15 * 4 = 60

• 6 位标志位:

        服务器可能会同时收到各种各样的报文,通过标志位来判断收到的报文的具体类型,区分具体请求是什么。

         URG: 紧急指针是否有效

         ACK: 确认号是否有效

        ○ PSH: 提示接收端应用程序立刻从 TCP 缓冲区把数据读走

        ○ RST: 对方要求重新建立连接; 我们把携带 RST 标识的称为复位报文段

         SYN: 请求建立连接; 我们把携带 SYN 标识的称为同步报文段

         FIN: 通知对方, 本端要关闭了, 我们称携带 FIN 标识的为结束报文段

16 位窗口大小: 博主之后详谈

16 位校验和: 发送端填充, CRC 校验. 接收端校验不通过, 则认为数据有问题. 此 处的检验和不光包含 TCP 首部, 也包含 TCP 数据部分.

16 位紧急指针: 标识哪部分数据是紧急数据;

40 字节头部选项: 暂时忽略;

二、确认应答机制ACK

这里所谓发送的ACK和SYN不单单是建立连接和应答这一标志位,而是一个完整的报头,一个没有数据的纯报头,当要确认应答时,只需要将ACK改成1即可。而确认应答并不一定要单独发一个报头,可以将其和要发的数据一起发送,这也叫做捎带应答,比如中间的SYN加ACK就可以将其看作一次捎带应答。在日常的通信情况下,一般不会单独发送ACK,一般都是捎带应答,在发数据的同时也对对方做出应答。

结合下面序号和确认序号的部分,TCP发送的数据都有序号,一方发的数据序号假设位1-1000,那么另一方回应时确认应答就应该是1001,表示序号1000之前的数据全部收到了,接下来发的数据块的序号就应该从1001之后开始发。

三、序号、确认序号

TCP 将每个字节的数据都进行了编号. 即为序列号

TCP也叫面向字节流的协议,其通信双方都有发送缓冲区和接收缓冲区,所以将其要发送的数据想象成一个数组时,缓冲区中天然的每个字节都有序号,因为每个字节都有其对应的下标

所以在发送一次数据,收到对方应答后,下次再要发送数据的

新的序号=对方确认的序号+本次要发送的数据长度(如上图)

同样的,确认序号就是在接收到对方的序号后将ACK设置为1,下次再发给对方时,就是收到的对方的序号+1,比如上次对方发送数据为1001-2000序号的,那么这次要发送给对方的应答序号就是2001。

序号存在的意义:按序到达,应答和确认对应。

确认序号&&序号:两者都存在于TCP中的意义在于,同时向对方发送数据的同时,也同时在向对方做应答。(应答对方刚刚发的数据是否收到)

四、超时重传机制

主机 A 发送数据给 B 之后, 可能因为网络拥堵等原因, 数据无法到达主机 B;

如果主机 A 在一个特定时间间隔内没有收到 B 发来的确认应答, 就会进行重发;

结合上面的内容,如果主机A向主机B发送了数据,但是却一直没有等到对方发送过来对应的确认应答,也就是与刚刚发的序列号所对应的确认序列号,此时考虑到或许有特殊情况的发生,比如报文阻塞在某处没有到达对方主机,这时主机A会等待特定的时间,如果时间到了主机B依旧没有发送应答,那主机A就默认丢包了,直接再次发送刚刚的报文。

 

但没有收到应答并不一定是A主机没有发过去,也有可能是B主机收到了但是B主机的应答在发送过程中丢了,这时A主机再发消息,B主机就会收到一份一模一样的报文 。
那么 TCP 协议需要能够识别出那些包是重复的包, 并 且把重复的丢弃掉. 这时候我们可以利用前面提到的序列号, 就可以很容易做到去重的效果.

最理想的情况下, 找到一个最小的时间, 保证 "确认应答一定能在这个时间内返 回".

但是这个时间的长短, 随着网络环境的不同, 是有差异的.

如果超时时间设的太长, 会影响整体的重传效率;

如果超时时间设的太短, 有可能会频繁发送重复的包;

因为网络的情况是动态变化的,网速时快时慢,所以TCP 为了保证无论在任何环境下都能比较高性能的通信, 因此会动态计算这个最大超时时间.

Linux 中(BSD Unix 和 Windows 也是如此), 超时以 500ms 为一个单位进行控制, 每次判定超时重发的超时时间都是 500ms 的整数倍.

如果重发一次之后, 仍然得不到应答, 等待 2*500ms 后再进行重传.

如果仍然得不到应答, 等待 4 *500ms 进行重传. 依次类推, 以指数形式递增.

累计到一定的重传次数, TCP 认为网络或者对端主机出现异常, 强制关闭连接.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/50121.shtml

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

相关文章

GO发票真伪批量查验方法、数电票查验接口

“教”给机器标注数据的正确率就决定了人工智能判断的正确率。翔云人工智能开放平台的OCR产品经过我们的开发人员精心调“教”,识别率高、识别速度快。 发票,是发生的成本、费用或收入的原始凭证。于公司来说,发票主要是公司做账的依据&…

解决Windows 11更新错误0x800f081f的详细指南

在尝试更新Windows 11时,用户可能会遇到各种错误代码,其中之一是0x800f081f。这个错误通常与Windows更新组件或系统文件的损坏有关。本文将提供解决这一特定错误的详细步骤,并解释可能的原因。 错误代码0x800f081f概述 错误代码0x800f081f指…

【Devops系统】如何构建Devops系统

什么是Devops DevOps是一种软件开发和文化实践,它强调软件开发(Dev)和IT运营(Ops)之间的紧密合作与沟通。DevOps的目标是通过自动化软件的集成、测试、部署和监控来简化流程,从而加快软件交付的速度&#x…

pythonGame-实现简单的贪食蛇游戏

通过python简单复现贪食蛇游戏。 使用到的库函数: import pygame import time import random 游戏源码: import pygame import time import randompygame.init()white (255, 255, 255) yellow (255, 255, 102) black (0, 0, 0) red (213, 50, 80…

代码随想录算法训练营第四十四天|99.岛屿数量 100.岛屿的最大面积

99.岛屿数量 深搜 class Solution:def numIslands(self, grid: List[List[str]]) -> int:def dfs(i, j):if not 0 < i < m or not 0 < j < n or grid[i][j] "0":returngrid[i][j] "0"for x,y in (i1,j),(i-1,j),(i,j1),(i,j-1):dfs(x,y)…

新版海螺影视主题模板M3.1全解密版本多功能苹果CMSv10后台自适应主题

苹果CMS2022新版海螺影视主题M3.1版本&#xff0c;这个主题我挺喜欢的&#xff0c;之前也有朋友给我提供过原版主题&#xff0c;一直想要破解但是后来找了几个SG11解密的大哥都表示解密需要大几百大洋&#xff0c;所以一直被搁置了。这个版本是完全解密的&#xff0c;无需SG11加…

Oracle对数据库行和数据库的监控

前言&#xff1a; Oracle对表的监控分为数据行修改DML的监控、对表的DDL监控 1、对表的DML监控&#xff08;数据的增删改&#xff09; -- 创建测试表 create table tab_test01( id varchar2(100) default sys_guid(), name varchar2(100), insert_date date default sysdate…

学习日记:数据类型2

目录 1.转义字符 2.隐式类型转换 2.1 强制类型转换 2.2 不同类型间赋值 3.运算符 表达式 3.1 算术运算符 3.2 算术运算优先级 3.3 赋值运算 3.3.1 不同类型间混合赋值 3.4 逗号运算 4.生成随机数 5. 每日一练 1.转义字符 \n 表示换行 \t …

基于JSP、java、Tomcat三者的项目实战--校园交易网(1)-项目搭建(前期准备工作)

这是项目的初始页面 接下来我先写下我的初始项目搭建 技术支持&#xff1a;JAVA、JSP 服务器&#xff1a;TOMCAT 7.0.86 编程软件&#xff1a;IntelliJ IDEA 2021.1.3 x64 首先我们打开页面&#xff0c;准备搭建项目的初始准备 1.New Project 2.随后点击Next&#xff0c;勾…

Easy es问题总结

官网教程&#xff1a;https://www.easy-es.cn/pages/ac41f0/#settings 一 测试项目 1 pom <dependencies><!-- 排除springboot中内置的es依赖,以防和easy-es中的依赖冲突--><dependency><groupId>org.springframework.boot</groupId><artifa…

【Golang 面试基础题】每日 5 题(七)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

脊髓小伙伴必看!超全维生素补给站,助力你的每一天活力满满✨

今天咱们来聊聊一个既严肃又暖心的话题——脊髓损伤后的维生素大补帖&#xff01;&#x1f31f; 记住&#xff0c;身体是革命的本钱&#xff0c;补充对的维生素&#xff0c;就是给自己的小宇宙加油哦&#xff01;&#x1f680; 首先&#xff0c;维生素D小太阳&#x1f31e;来啦…

Nestjs使用Redis的最佳实践

前几天在项目中有用到Redis JWT实现服务端对token的主动删除(退出登录功能)。故此介绍下如何在Nestjs中使用Redis&#xff0c;并做下总结。 知识准备 了解Redis - 网上很多简介。了解Nestjs如何使用jwt生成token - 可移步看下我之前的文章 效果展示 一、mac安装与使用 示…

在Webpack中,常见的loader有哪些?

在Webpack中&#xff0c;有许多常见的Loader用于处理不同类型的文件。以下是一些常见的Loader及其主要作用&#xff1a; babel-loader&#xff1a;用于将ES6/ES7等新版本的JavaScript代码转换为向后兼容的旧版本JavaScript代码&#xff0c;以确保在不支持新特性的浏览器…

【矩阵微分】在不涉及张量的前提下计算矩阵对向量的导数并写出二阶泰勒展开

本篇内容摘自CMU 16-745最优控制的第10讲 “Nonlinear Trajectory Optimization”。 如何在不涉及张量运算的前提下&#xff0c;计算矩阵对向量的导数并写出二阶泰勒展开 在多维微积分中&#xff0c;计算矩阵对向量的导数和二阶泰勒展开是一项重要的任务。本文将介绍如何在不涉…

使用命令快速删除项目中的node_modules

描述 直接调用了系统自带的命令行工具&#xff0c;无需额外安装任何第三方库或工具。 同时&#xff0c;这些命令经过优化&#xff0c;能够快速处理大量文件&#xff0c;从而实现快速删除。 步骤 1、进入项目文件夹&#xff1b; 2、如果是Mac/Linux 环境下&#xff0c;执行&a…

php--序列化与反序列化

&#x1f3bc;个人主页&#xff1a;金灰 &#x1f60e;作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ &#x1f34a;易编橙终身成长社群&#…

机器学习 | 计算分类算法的ROC和AUC曲线以随机森林为例

受试者工作特征&#xff08;ROC&#xff09;曲线和曲线下面积&#xff08;AUC&#xff09;是常用的分类算法评价指标&#xff0c;本文将讨论如何计算随机森林分类器的ROC 和 AUC。 ROC 和 AUC是量化二分类区分阳性和阴性类别能力的度量。ROC曲线是针对不同分类阈值的真阳性率&…

云计算day13

一、Git 概述 Git 是一种分布式版本控制系统&#xff0c;用于跟踪和管理代码的变更。它是由 Linus Torvalds 创建的&#xff0c;最初被设计用于 Linux 内核的开发。Git 允许开发 人员跟踪和管理代码的版本&#xff0c;并且可以在不同的开发人员之间进行协作。 Github 用的就…

C#:通用方法总结—第4集

大家好&#xff0c;今天接着写我们的通用方法总结分享。 下面是今天要分享的通用方法&#xff1a; &#xff08;1&#xff09;通过输入信息&#xff0c;返回合并的单元格内容。这个方法比较好用&#xff0c;适合在有合并的单元格时候使用。 /// <summary> /// 返回合并…