Linux:详解TCP协议段格式

文章目录

  • 认识TCP
  • TCP协议段格式

本篇主要总结的是TCP协议的一些字段

认识TCP

TCP协议全称是传输控制协议,也就是说是要对于数据的传输进行一个控制

在这里插入图片描述
以上所示的是对于TCP协议进行数据传输的一个理解过程

全双工

至此就可以对于TCP协议是全双工的来进行理解了,所谓全双工其实就是有自己对应的接收缓冲区和发送缓冲区,所以这就意味着TCP协议的发送和接受是完全可以分开独立进行的,这就和UDP协议有很大的不同,因此我们说TCP协议是全双工的

发送接收的本质

对于发送和接受的本质来说,其实都是一种拷贝,以系统调用read和write来说,站在操作系统上是把数据从磁盘加载到内存当中,而这样的加载过程的本质其实就是一个拷贝的过程,经过这样的拷贝从而把数据从磁盘中拷贝到内存中

而以recv和send为例,这两个系统调用展现出的本质实际上也是一种拷贝的过程,只不过这里的拷贝是把数据从内存拷贝到网络,或是把数据从网络拷贝到内存,这其实也是一种拷贝

TCP协议段格式

下面就要进行的是对于TCP协议段的阐述,也是本篇的重点内容

在这里插入图片描述
在进行UDP的学习当中,可以看到UDP的协议段定制是比较简单的,它是面向数据报的,所以只需要根据数据长度来进行判断发送成功或者是失败,并且它并不关心数据是否递达,而对于TCP来说就不是这样,它关心的点更多,它需要确保数据是否送达,这就必定意味着它需要传递更多的消息

报头和有效载荷的分离

在整个网络协议栈中,首先要关心的内容必然是对于报头和有效载荷分离的这个过程,因为对于任何一种协议来说都必须有这样的功能,结合报头和与报头进行分离,有这样的操作能力才能使得信息可以在网络协议栈中进行传输

那对于报头和有效载荷分离的这个过程来说,必然涉及到的一个点是如何把数据传输到上层当中,于是就要引入第一个报头参数,4位首部长度

4位首部长度

对于TCP的标准报头来说,它占据的是20个字节,而有效载荷则是最下面的数据区,那中间的选项其实严格意义来说也属于报头中的一种,因此就有了这个首部长度的概念

4位首部长度的最大取值是15,那如何表示20个字节呢?其实是因为在计算的时候四位首部长度是有基本的计算单位的,计算单位是4字节,这就意味着这个范围实际上是0-60字节,所以将报头和有效载荷的分离就直接借助这个4位首部长度就可以,本质上是通过固定长度和自描述字段

源端口号和目的端口号

这个字段其实和UDP是一样的,都是用来确认发送双方的一些信息,这样可以准确的通过端口号找到所需要传递的进程

16位窗口大小

TCP协议是面向字节流的,所以它和文件其实是有些相似的,那么现在的问题是对于这个协议来说,通信的双方该如何进行判断,对方的缓冲区中的数据到底满了还是没满?换句话说,发送数据的速度该如何进行判断呢?这就用到了这个窗口大小的概念了

对于窗口大小来说,值得是自己的接收缓冲区中剩余空间的大小,那么基于这个数据段,就能告诉对方我当前的缓冲区还有多少内容,如果此时剩余空间已经没有了,那么就代表我的接收缓冲区已经满了,不要再给我发送数据了,反之就是可以快点继续发,我当前缓冲区可以接受数据

32位序号

提到32位序号,就必须要提及确认应答机制了

在这里插入图片描述
TCP协议是传输可靠的协议,那么这个可靠该如何理解?它必然是因为有它特定的机制来保证它的传输是可靠的,因此下面就要介绍可靠的来源:确认应答机制

通俗来讲,这个机制的意思就是当前有主机A和主机B,当主机A向主机B发送数据的时候,主机B在接收到消息之后会传递给主机A一个消息,表示自己收到了这个消息。根据这个原理,我们说这就叫做是一次可靠的传输,落实到具体的来说,当我传输出去的数据收到了应答,那么就说明这次的传输是可靠的,意味着对方已经收到了我的消息,那反过来说,对于没有应答的数据,就不能保证它的可靠性,因此最新的一条消息是没有应答的,这也就意味着是不知道这个消息到达的结果如何,也就说明并不存在100%可靠的网络协议,不过TCP可以很大程度上帮助使得协议本身变得可靠

序号问题

下面要谈的一个问题是,数据的乱序问题

假设现在TCP的服务端向客户端发送了10条消息,那抵达到客户端后,这10条消息是依次抵达的吗?理想状态下是这样,但是实际上在进行基站的传输过程中,肯定不是这样的,所以带来的一个问题是,TCP数据传输造成的乱序,本身就是TCP协议不可靠的一种体现,我们以下图为例

在这里插入图片描述
上图所示的就是TCP最基本,最原始的通信过程,也是一种理想的通信过程,但是实际上传输遇到乱序是很正常的现象,那么TCP是如何处理这样的现象的呢?

TCP协议引入了序号的概念,TCP将每个字节的数据都进行了编号,每一个编号就叫做是序列号

在这里插入图片描述
该如何理解这个概念呢?我们可以认为TCP的发送缓冲区就是一个数组,而在这当中填入了很多的数据,天然的每一个字节就会有一个字节编号,这个编号本质上就数组的下标,而在发送的报头中会有对应32位序号,当发送一个TCP数据的时候,就会在报头中填写对应的数据块的最后一个字符的下标,这就意味着是当前发送的报文序号,这样就把数据发送过去了

32位确认序号

反之我们对应的是32位确认序号,这个确认序号代表的是确认序号之前的数据已经全部收到了,那这个确认序号填多少呢?它填充的是收到报文序号+1,比如第一次发报文序号是1000,第二个报文的序号是2000,那么在进行应答的时,对应的确认序号就是1001和2001,以下图为例

在这里插入图片描述
为什么要这样进行规定呢?这里我目前给出的解释是,表示的是1001之前的报文已经全部收到了,它表示的是当前确认序号之前的数据已经都收到了,那现在假设,发送了很多的报文,其中有一个报文丢失了,虽然我此时没有收到1001之前的内容和2001之前的内容,但是3001之前的内容已经收到了,那么就意味着服务器已经安全的把3001的报文接受了,那么就算要进行重传,也只需要把1001和2001进行传递就可以了

6个标记位

下面要谈的内容是6个标记位的问题,对于服务端来说,它会收到各种各样的来自很多客户端的TCP请求,那么在这些请求中其实是有很多类型的,比如说有请求连接,请求断开,请求申请数据,请求发送数据,那么这些请求该如何进行区分呢?就依靠这6个标记位,就可以实现不同类型的TCP请求进行识别

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode热题100】124.二叉树的最大路径和(二叉树)

一.题目要求 二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root …

Spring-IoC-属性注入的注解实现

1、创建对象的注解 Component 用于声明Bean对象的注解,在类上添加该注解后,表示将该类创建对象的权限交给Spring容器。可以直接将这些类直接创建,使用的时候可以直接用。 注解的value属性用于指定bean的id值,value可以省略&…

中国草地类型分布图

中国是草地资源大国,拥有的各类天然草地39 283万公顷,约占国土面积的41%,仅次于澳大利亚,居世界第二位。它主要分布在年降水量400毫米以上的干旱、半干旱地区,南方和东部湿润、半湿润地区以及东部和南部海岸带等。 北方…

浏览器工作原理与实践--块级作用域:var缺陷以及为什么要引入let和const

在前面《07 | 变量提升:JavaScript代码是按顺序执行的吗?》这篇文章中,我们已经讲解了JavaScript中变量提升的相关内容,正是由于JavaScript存在变量提升这种特性,从而导致了很多与直觉不符的代码,这也是Jav…

【Pt】马灯贴图绘制过程 03-制作油渍、积尘效果

目录 效果 一、制作油渍效果 1.1 基本油渍 1.2 流淌的油渍痕迹 二、制作浮尘效果 三、制作积尘效果 效果 一、制作油渍效果 1.1 基本油渍 将上篇制作的“锈迹_深色”和“锈迹_浅色”两个文件夹再次合并为一个文件夹 这里就命名为“锈迹” 添加一个填充图层 设置Base …

Redis中的客户端(三)

客户端 身份验证 客户端状态的authenticated属性用于记录客户端是否通过了身份验证: typedef struct redisClient {// ...int authenticated;// ... } redisClient;如果authnticated的值为0,那么表示客户端未通过身份验证;如果authenticated的值为1&a…

快速上手Pytrch爬虫之爬取某应图片壁纸

一、前置知识 1 爬虫简介 网络爬虫(又被称作网络蜘蛛、网络机器人,在某些社区中也经常被称为网页追逐者)可以按照指定的规则(网络爬虫的算法)自动浏览或抓取网络中的信息。 1.1 Web网页存在方式 表层网页指的是不需要提交表单&…

【Java面试题】Redis上篇(基础、持久化、底层数据结构)

文章目录 基础1.什么是Redis?2.Redis可以用来干什么?3.Redis的五种基本数据结构?4.Redis为什么这么快?5.什么是I/O多路复用?6.Redis6.0为什么使用了多线程? 持久化7.Redis的持久化方式?区别?8.…

基于.NET Core开发的轻量级分布式配置中心

前言 今天给大家推荐一个基于.NET Core开发的轻量级分布式配置中心:AgileConfig。 AgileConfig官方介绍 AgileConfig秉承轻量化的特点,部署简单、配置简单、使用简单、学习简单,它只提取了必要的一些功能,并没有像Apollo那样复…

代码随想录算法训练营第36天|738.单调递增的数字|968.监控二叉树|总结

代码随想录算法训练营第36天|738.单调递增的数字|968.监控二叉树|总结 738.单调递增的数字 https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9A%84%E6%95%B0%E5%AD%97.html class Solution { public:int monotoneIncreasingDigits(int n) {string s…

python(一)网络爬取

在爬取网页信息时,需要注意网页爬虫规范文件robots.txt eg:csdn的爬虫规范文件 csdn.net/robots.txt User-agent: 下面的Disallow规则适用于所有爬虫(即所有用户代理)。星号*是一个通配符,表示“所有”。 Disallow&…

c++中public和private继承怎么影响了变量的使用,今天一篇文章给你讲清楚

文章目录 准则一:继承关系不会改变子类访问基类的变量权限举个例子 准则二:继承关系只会改变基类中的变量继承到子类中后,权限的改变举个例子 准则三:基类中的protected变量在外部是不可访问的,类似private。但可以在继…

【WebJs 爬虫】逆向进阶技术必知必会

前言 在数字化时代,网络爬虫已成为一种强大的数据获取工具,广泛应用于市场分析、竞争对手研究、舆情监测等众多领域。爬虫技术能够帮助我们快速、准确地获取网络上的海量信息,为决策提供有力支持。然而,随着网络环境的日益复杂和…

【热门话题】Yarn:新一代JavaScript包管理器的安装与使用

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 Yarn:新一代JavaScript包管理器的安装与使用引言一、Yarn的安装1. 系…

sonar+gitlab提交阻断 增量扫描

通过本文,您将可以学习到 sonarqube、git\gitlab、shell、sonar-scanner、sonarlint 一、前言 sonarqube 是一款开源的静态代码扫描工具。 实际生产应用中,sonarqube 如何落地,需要考虑以下四个维度: 1、规则的来源 现在规则的…

【学习笔记】java项目—苍穹外卖day01

文章目录 苍穹外卖-day01课程内容1. 软件开发整体介绍1.1 软件开发流程1.2 角色分工1.3 软件环境 2. 苍穹外卖项目介绍2.1 项目介绍2.2 产品原型2.3 技术选型 3. 开发环境搭建3.1 前端环境搭建3.2 后端环境搭建3.2.1 熟悉项目结构3.2.2 Git版本控制3.2.3 数据库环境搭建3.2.4 前…

git配置SSH 密钥

git配置SSH 密钥 1.window配置ssh1.安装ssh2.安装 Git(安装教程参见安装Git)并保证版本大于 1.9![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e59f4e16b83c45649f1d9d7bd6bf92c0.png)3.SSH 尽量保持最新,6.5之前的版本由于使用…

SpringBoot国际化配置流程(超详细)

前言 最新第一次在做SpringBoot的国际化,网上搜了很多相关的资料,都是一些简单的使用例子,达不到在实际项目中使用的要求,因此本次将结合查询的资料以及自己的实践整理出SpringBoot配置国际化的流程。 SpringBoot国际化 "i…

猫,路由器,WIFI

家庭网络常识 1:猫、路由器、wifi_哔哩哔哩_bilibili 入户光纤插到猫上面,网线连接猫和路由器,网线连接路由器和电脑。路由器可以发射WIFI。 手机通过WIFI连接到路由器。 左边是猫,右边是光猫。 (modem) …

JAVA面试八股文之集合

JAVA集合相关 集合?说一说Java提供的常见集合?hashmap的key可以为null嘛?hashMap线程是否安全, 如果不安全, 如何解决?HashSet和TreeSet?ArrayList底层是如何实现的?ArrayList listnew ArrayList(10)中的li…