详细介绍:42.传输层协议TCP(上)

news/2025/9/29 8:36:40/文章来源:https://www.cnblogs.com/ljbguanli/p/19118065

详细介绍:42.传输层协议TCP(上)

报文的理解

倘若应用层正在进行报文的解析,处理,会不会影响OS从网络中读取报文?为什么?

不会,首先,一个进程不是要运行到退了cpu才能运行其他的进程。进程有对应的时间片,时钟中断一直在进行,cpu接受到中断,cpu转而处理OS内置的中断向量表中对应的中断处理途径,进行进程调度,检查时间片,时间片耗尽了,进程会被切换。进程切换进程task_struct会保留上下文数据,不会影响下一个进程的执行。

在OS内部,一定可能会同时存在大量的报文,而这些报文,有的在传输层,有的在网络层,OS就必须管理这些报文 -> 先描述,在组织

struct sk_buff是描述报文的结构体

head成员:指向数据区的头部

end成员:指向数据区的尾部

tail:指向应用层内容的尾部

data:指向的是当前所在层协议报头头部。

所谓的解包和分用,本质就是移动data指针在缓冲区中的指向(+-对应协议层报头的长度)

TCP结构

标准问题:

报头和有效载荷怎么分离?

TCP是不定长报头,其行携带对应的选项,不带选项报头为20字节。其结构中有4位首部长度,4位比特位取值:[0,15],怎么表达20及以上字节呢?4位比特位,基本单位是4字节,能表示的字节数取值:[0,60],但由于TCP最少都是20字节,取值范围是[20,60],4位比特位取值范围[5,15]。

如何交付?16位的目的端口号

怎么没有报文大小?只有报头大小

TCP不必须也不能设置报文大小。TCP是面向字节流的,传输层只要能把报文进行解包分用传给应用层的接收缓冲区就行了,具体处理字节流,应用层怎么保证读到一个完整报文,由应用层来做。

那么既然不清楚TCP报文大小,有没有可能struct sk_buff中同时存在两个TCP报头,黏在一起了?不可能,一个struct sk_buff只存一个报文,这也是TCP不需要设置报文大小的体现。

TCP可靠性的本质

正确理解可靠性:

1)具有应答,可以保证历史消息的可靠性!(100%保证)

2)通信中,最新的报文永远没有应答,最新报文可靠性无法保证

保证可靠性,TCP核心:确认应答机制(让报文不是最新的)

确认应答理解:例如客户端向服务端发送数据,服务端必须应答,只要客户端收到了服务端的应答,就可以100%保证数据被服务端收到了。

TCP的通信过程(32位序号,32位确认序号)

客户端向服务端发送数据,服务端应答,客户端收到应答,由此可以保证客户端到服务器的可靠性。相反则可以保证服务器到客户端的可靠性(且不对应答做应答,防止无穷递归)

TCP传递报文时,更通用的过程:发送一堆请求,等待服务器应答。

TCP结构:32位序号,32位确认序号
确认序号

  • 数值:确认序号 = 序号 + 1
  • 表达意义:指定报文需要之前的所有信息,已经全部收到(下一次发送,从确认序号开始)

序号作用:排序,解决乱序问题(发送顺序和接受顺序不一致,UDP解决不了)

为什么会要有两个序号?

例如:客户端向服务器发送数据,服务器可能进行捎带应答(应答+信息),此时服务器TCP报头的序号填自己独立的,TCP确认序号为client序号+1。因为有捎带应答的情况,此时必须要有两个序号进行区分。

流量控制(16位窗口大小)

16位窗口大小含义:当前连接接收缓冲区剩余大小。

问题:以客户端向服务端发送数据为例,客户端向服务端发送了大量内容,服务端的接收缓冲区装满了数据。客户端再向服务端发的时候,服务端已经满了。这个资料就只能被丢弃,那么tcp怎么能保证可靠性?不影响,没有收到对应的应答,重传就完了。该做法本身没有错误,也能实现,不过问题就是这样做太耗费资源了,费尽千辛万苦送到缓冲区,结果被丢弃了,为什么服务端不早点说接收不了呢?

16位窗口大小:表示当前连接的接收缓冲区剩余大小。经过读取这个字段,客户端就可以知道服务端的接受能力了。

通过流量控制:主要解决的是效率问题,接收缓冲区剩余大小大的话,就发快一点,反之发慢一点,就能够尽可能减少资源的浪费。

标志位存在意义

标志位本质:报头中的比特位

为什么要有标志位?

要有表示报文类型的字段(例如不能对应答做应答,就要区分应答和数据)。接收方收到的TCP报文,一定会存在不同的类型,针对不同报文类型,接收放要有不同的做法。

6个TCP标志位

ACK:确认号是否有效(标明报文是一个应答报文)acknowledge
SYN:同步标志位,连接建立,握手过程应用的标志位(同步报文段)。

FIN:通知对方,本端要关闭了(结束报文段)。

PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走(psh让系统调用read的条件就绪,比如read本来要500个字节才能解除阻塞,psh允许改。)

关于三次握手:前两次握手不能携带信息,因为第三次握手没有完成!

RST:对方要求重新建立连接(复位报文段)

例如:TCP通信,客户端向服务端发起连接,三次握手后,客户端在发出去请求,收到服务端的捎带应答后,发出应答,不管这个应答有没有丢失,它都认为自己已经建立连接了。对于服务端而言,要晚一步,服务端要收到该应答才能表明建立连接了。如果在该过程中,客户端发送的应答丢失了,客户端还是认为自己建立好了连接,给服务端发送数据,服务端接受到对应的数据就会发送设置好RST的TCP报头,要求客户端重新建立连接

通信的过程中,连接出现任何问题,都允许进行重置!

否有效就是URG:紧急指针

tcp是保证可靠性的 -> 序号 -> 按序到达的 -> 接收缓冲区 -> 字节流式的接收队列 -> 如果我们有数据,想被优先读取(非主流),优先处理(情况:取消下载,取消上传,需要插队,不要等下载完在取消,效率低)

紧急数据,并不属于常规内容 -> 带外数据。紧急数据,只有一个字节(可用作状态码)。

16位紧急指针含义:当前报文有效载荷中,特定偏移量处,有紧急信息(一个字节)

序列号初步理解

TCP将每个字节的素材都进行了编号,即为序列号。发送缓冲区看成一个字符数组,那么发送缓冲区,每一个字节,天然不就有编号了!

理解丢包,理解应答报文

发送方没有收到ACK,意味着什么?

意味数据包丢失了吗?-> 只能意味着:数据可能丢失,对方可能没收到(例如:信息没丢丢包,ACK丢包了)

否收到消息,无法保证可靠性。就是意味着:要么内容丢,要么应答丢 -> 无法100%保证对方

如何判定是真的丢包了呢?

特定的时间间隔,收不到应答,判定报文丢失! -> 收不到应答 && 超时

如果数据包没丢失,服务端收到了,但由于应答丢了,客户端超时重传了,此时材料就重复了,怎么解决?

序号的作用:确认应答,按序到达,去重

时间间隔应该是多长?

最理想的情况下,找到一个最小的时间。TCP为了保证无论在任何环境都能比较高性能地通信,因此会动态计算这个最大超时时间。

超时以500ms为一个单位进行控制,重传每次叠加,假设超过一定重传次数,依旧收不到应答,那么TCP认为网络或者对端主机出现异常,强制关闭连接

连接管理和连接状态

整数,定义的宏值。就是状态就

连接会大量存在,有的刚建立,有的已经释放,要不要管理?要,先描述,在组织struct link。

connect会发起三次握手(cilent),accept不参与三次握手(server),握手工作由OS自动完成。

如何理解accept不参与三次握手?

客户端调用connect向服务端发起连接,不必须服务端进行accept也能完成,并成功与服务端连接。accept只是把OS中已经建立好的连接(struct link)拿上来用了。

为什么建立连接要三次握手?

两个理由:

1)以最小成本,100%确认双方通信意愿

2)以最短的方式,进行验证全双工(本质验证:我们两个所处网络是通畅的,能支持全双工)

如何理解:

2)以cs举例,客户端向服务端发送SYN报头,服务端收到并捎带应答发送SYN+ACK报头,

此时客户端收到了,客户端的发送(ACK报头)和接收(收到SYN+ACK报头)就好了,服务端的接收(SYN报头)也验证了,客户端发送ACK报头,服务器到,服务端的发送能力也验证了(验证了网络通畅和双方都支持全双工)

1)3次握手,是成本最低的,本质也是4次握手,只不过服务端捎带应答(SYN+ACK)

面对客户端的连接请求,服务器都要无脑接受(捎带应答)

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

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

相关文章

网页设计作业视频网站怎么做好seo内容优化

(1)-V$SESSION_WAIT这是一个寻找性能瓶颈的关键视图。它提供了任何情况下session在数据库中当前正在等待什么(如果session当前什么也没在做,则显示它最后的等待事件)。当系统存在性能问题时,本视图可以做为一个起点指明探寻问题的方向。V$SESSION_WAIT中…

详细介绍:FreeRTOS---任务级和中断级临界区管理使用的理解与源码分析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

怀柔区企业网站设计机构提供网页技术

关于FastDFS FastDFS 是以 C 语言开发的一项开源轻量级分布式文件系统,他对文件进行管理,主要功能有:文件存储,文件同步,文件访问(文件上传/下载)等,特别适合以文件为载体的在线服务…

仿muduo库One Thread One Loop主从Reactor模型实践——介绍 - 实践

仿muduo库One Thread One Loop主从Reactor模型实践——介绍 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

2025 年国内电容品牌最新推荐排行榜:固态电容,高压电容,安规电容,CBB电容,超级电容等多品类优质厂商权威盘点,助力企业精准选型

在当前电子产业高速发展的背景下,电容作为核心基础元件,广泛应用于消费电子、工业控制、新能源汽车、储能等众多领域,其品质与性能直接影响终端产品的稳定性和使用寿命。然而,随着电容市场需求激增,各类厂商纷纷涌…

【光照】[PBR][法线分布]GGX实现方法对比

GGX是Unity URP渲染管线中的核心法线分布函数,由Walter等人在2007年提出。相比传统分布函数,GGX具有长尾特性,能更真实地模拟材质高光衰减,同时保证能量守恒。URP通过BRDF.hlsl实现了GGX分布及其各向异性版本,支持…

【GitHub每日速递 250929】告别手动查资料!这两个开源项目(17.8k+星)让 AI 帮你做深度研究,报告自动生成

原文:https://mp.weixin.qq.com/s/uxRt8xAdWX59n3RkoDJ5Vg AI + 搜索引擎 = 无敌研究助手?这个开源项目让深度调研效率翻倍项目概述 Open Deep Research 是一个基于 AI 的研究助手,通过结合搜索引擎、网页抓取和大型…

企业门户网站开发背景韩国小游戏网站

不好意思,我要放大招了! 在今天的杭州云栖大会上,阿里巴巴首次公布人工智能调用规模: 每天调用超 1万亿 次 服务全球 10亿 人 日处理图像 10亿 张 视频 120万 小时 语音 55万 小时 自然语言 5千亿 句 在AI芯片、AI云服务、AI算…

订单模块

首先,订单模块是家政项目的 “核心枢纽”—— 它衔接了用户端(下单需求)、服务端(服务信息)、支付模块(资金流转)和优惠券模块(权益核销),核心目标是管理订单从创建到完成 / 取消的全生命周期,确保流程合规…

网站数据库是什么dz网站模板

在Spring框架中,TransactionSynchronizationManager扮演着事务同步管理的核心角色,它不仅负责跟踪当前活动事务的状态,还提供了在事务生命周期中注册回调方法的能力,使得开发者能够在事务开始、提交、回滚等关键时刻执行自定义逻辑…

PS中如何让文字中两行文字实现左对齐且中间部分文字对齐

背景 见图片:如果仅靠添加空格很难实现,我当时就是空格空格对齐(结果被T了) ============================================================================================== 前面的两个还好,因为前面文字一样…

通王网站内容管理系统安徽建站系统

继续梳理以太网的DMA描述符。 以太网DAM描述符的结构 有两种结构,链式结构和环形结构。 常用的是链式结构。 标准库中,关于DMA描述符的数据结构 以gd32f4xx_enet.c为例。 先说发送描述符。 系统分配了5个发送描述符。每个描述符对应的缓冲区大小为152…

手写MyBatis第78弹:装饰器模式在MyBatis二级缓存中的应用:从LRU到防击穿的全方案实现 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

前端获取接口材料流程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Lucene 8.7.0 版本中dvd、dvm文件详解 - 教程

Lucene 8.7.0 版本中dvd、dvm文件详解 - 教程2025-09-29 08:12 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

APEX实战第5篇:利用APEX程序直观体验向量近似检索能力

APEX实战第5篇:利用APEX程序直观体验向量近似检索能力2025-09-29 08:14 AlfredZhao 阅读(0) 评论(0) 收藏 举报在圈内朋友看来,Oracle 数据库的 多模能力 已经不是什么新鲜话题。它不仅在关系型数据管理方面独树…

告别复制粘贴!Chat2File-DeepSeek 让 DeepSeek 对话成果直接变“成品” - 指南

告别复制粘贴!Chat2File-DeepSeek 让 DeepSeek 对话成果直接变“成品” - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-f…

详解 PHP 中的命名空间 Namespace 与 PSR4 自动加载

详解 PHP 中的命名空间 Namespace 与 PSR4 自动加载 随着 PHP 项目规模增长,文件管理和类加载问题逐渐凸显:散乱的目录结构、频繁的 require_once 调用、难以维护的类依赖关系。本文通过 namespace 和自动加载技术,…

html5购物网站模板艾佳工业设计

动态调用的作用 类似于其他语言的反射能够开发框架性代码 Call调用语法 (bool success, bytes data) <address>.call(bytes calldata)call是address的方法call返回值(bool success, bytes data)忽视返回值success&#xff0c;会造成严重问题 calldata的结构 call的…

构建易受攻击的AWS DevOps环境:CloudGoat场景实践

本文详细介绍如何在CloudGoat中构建易受攻击的AWS DevOps环境,包含完整的攻击路径分析,从初始权限提升到供应链安全漏洞利用,展示了真实的云安全测试场景。构建易受攻击的AWS DevOps环境作为CloudGoat场景 CloudGoa…