2.4 网络概念(分层、TCP)

网络层与传输层概述

网络层:
  • 抽象概念:网络层是基于 IP 的抽象概念,与数据链路层用 MAC 地址标记设备不同。MAC 地址是一种具体化的概念,绑定于所在的物理网络,而 IP 地址可以是固定的,也可以通过路由动态变化。
  • 功能:所有“网络”的“网”是基于 IP 的抽象概念,而链路层的“路”是基于 MAC 的具体化概念。
传输层:
  • 协议决定内容:传输层与物理信号的形式(光信号、电信号、无线信号)或目的地无关,传输层的协议决定了传输的内容是可靠的还是不可靠的。例如:
    • 不可靠传输协议:适用于允许丢帧和数据丢失的流媒体传输。
    • 可靠传输协议:适用于需要保密、稳定且不允许数据损坏或丢失的场景,并能控制传输的速度和质量。

数据链路层的作用与网卡驱动

数据链路层的命名

数据链路层之所以称为“链路层”,是因为它负责在物理链路上传输数据。链路指网络中相邻节点之间的物理连接(例如两台计算机或交换机)。

数据链路层的主要作用
  1. 帧的封装和拆解

    • 把网络层的数据打包成帧(Frame)。
    • 在接收端解包帧,提取网络层数据。
  2. 差错检测与纠正

    • 使用校验和机制(如 CRC)检测传输过程中的错误。
    • 部分情况下还能纠正错误。
  3. 流量控制与重传

    • 控制数据流速,防止发送过快导致接收端无法处理。
    • 在数据帧丢失时请求重传。
  4. MAC 地址管理

    • 确保数据在局域网内正确发送到目标设备。
数据链路层与网卡驱动的关系
  • 数据链路层的职责:定义如何在物理链路上传输帧,并确保数据传输的可靠性。
  • 网卡驱动的职责
    • 是数据链路层的一部分。
    • 负责从网卡接收数据并传递给网络层。
    • 与操作系统协作完成数据链路层功能。
数据链路层与网络层的关系
  1. 网络层的职责:负责逻辑寻址和跨网络的数据路由。
  2. 网络层的工作方式
    • 接收来自链路层的帧,解封装出 IP 数据包。
    • 基于 IP 地址和路由信息,将数据传递到目的地。

TCP/IP 协议栈

 tcp组包时 校验和 计算 -- 按照协议中指出,校验和本身在校验时 作为0计算。

校验和前面 还包含了 伪包头 包含了IP地址,是为了防止路由错IP 

主要组成部分
  1. 链路层(Link Layer):对应 OSI 模型中的数据链路层。
  2. 网络层(Internet Layer):主要协议是 IP,负责跨网络的数据路由。
  3. 传输层(Transport Layer):如 TCP 和 UDP,提供端到端的数据传输。
  4. 应用层(Application Layer):处理应用数据和服务,如 HTTP、FTP。
数据包的传递流程
  • 链路层负责在物理网络中传输数据帧。
  • 网络层通过路由实现数据的跨网络传递。
  • 传输层提供可靠或不可靠的数据传输服务。

网卡驱动与 sk_buff 结构体

sk_buff 的作用
  • 是 Linux 内核中描述网络数据包的重要数据结构。
  • 用于存储和管理网络协议栈的所有数据包。
典型的数据包接收流程
  1. 网卡驱动接收数据
    • 网卡驱动接收到数据包后,分配一个 sk_buff
    • 将数据存储到 sk_buff 的缓冲区中。
  2. 传递给协议栈
    • 通过 netif_rx() 等函数将 sk_buff 传递给网络层。
  3. 网络层处理
    • 解封装数据,提取 IP 包进行进一步处理。
sk_buff 的主要字段
  • data:指向数据部分。
  • len:数据长度。
  • protocol:上层协议类型。
  • dev:关联的网络设备。
  • 头部信息指针:mac_headernetwork_headertransport_header
sk_buff 示例
struct sk_buff *skb = netdev_alloc_skb(dev, len);
if (!skb) {return -ENOMEM;
}
memcpy(skb_put(skb, len), data, len);
skb->protocol = eth_type_trans(skb, dev);
netif_rx(skb);

传输层与 TCB 结构体

TCB 的作用
  • **传输控制块(TCB, Transmission Control Block)**用于管理和维护 TCP 连接。
  • 在 Linux 内核中,TCB 主要由 struct tcp_sock 表示。
tcp_sock 定义位置
  • 定义于 include/net/tcp.h
tcp_sock 的主要字段
  • snd_nxt:发送窗口的下一个序列号。
  • rcv_nxt:接收窗口的下一个序列号。
  • snd_una:未被确认的序列号。
  • sk_receive_queue:接收队列。
  • sk_write_queue:发送队列。
tcp_sock 的连接生命周期
  1. 初始化:三次握手时分配并初始化。
  2. 状态更新:更新发送和接收窗口的序列号。
  3. 关闭连接:释放 tcp_sock,完成连接关闭。
传输层的数据流向
  • 发送方向
    • 数据通过 send() 进入传输层,存储到发送缓冲区。
    • 在合适时机发送到网络。
  • 接收方向
    • 数据通过网卡驱动传递到 sk_buff,存储到接收缓冲区。
    • 应用层通过 recv() 获取数据。
tcp_sock 示例
struct tcp_sock {__u32 snd_nxt;__u32 rcv_nxt;__u32 snd_una;struct sk_buff_head write_queue;struct sk_buff_head receive_queue;// 其他状态变量
};

总结

  • 数据链路层处理物理链路上的数据传输,网卡驱动是其一部分。
  • 网络层负责跨网络的数据路由,是 TCP/IP 协议栈的重要组成。
  • sk_buff 是 Linux 内核中描述网络数据包的核心数据结构。
  • tcp_sock 用于管理 TCP 连接,是传输层的重要组件。


传输控制块(TCB)简介

在 Linux 网络协议栈中,传输控制块(TCB, Transmission Control Block) 是用于管理和维护传输层连接的核心数据结构。对于 TCP 协议来说,TCB 主要由 struct tcp_sock 结构体表示,它定义了 TCP 连接的状态和相关的控制信息。


1. struct tcp_sock 的定义位置

tcp_sock 结构体定义在内核代码的 include/net/tcp.h 文件中,是 Linux 内核对 TCP 连接进行管理的主要结构体。


2. tcp_sock 的作用

  • TCP 连接状态信息:保存 TCP 连接的四元组(源 IP、目的 IP、源端口、目的端口)和状态(如 ESTABLISHED, SYN_SENT 等)。
  • 窗口大小与重传信息:用于管理 TCP 滑动窗口大小、重传计时器和拥塞控制。
  • 发送和接收缓冲区:包括发送队列和接收队列,分别存储未发送的数据和已接收但未处理的数据。
  • 序列号管理:跟踪和管理 TCP 的序列号和确认号,以保证数据包的顺序和可靠性。

3. tcp_sock 的主要字段

以下列举了 tcp_sock 中的一些关键字段及其作用:

字段名作用
rcv_nxt接收窗口的下一个序列号
snd_nxt发送窗口的下一个序列号
snd_una第一个未被确认的字节的序列号
copied_seq接收队列中已被应用程序读取的字节序列号
write_seq发送队列中已被写入但未发送的下一个字节序列号
sk_receive_queue已接收但未处理的数据包队列
sk_write_queue待发送的数据包队列

4. tcp_sock 的连接生命周期

1. 初始化

当一个新的 TCP 连接建立时,内核会为该连接分配并初始化一个 tcp_sock 结构体,记录四元组并设置初始状态(如 SYN_SENTSYN_RECV)。

2. 状态更新

随着 TCP 三次握手及后续通信的进行,tcp_sock 的状态和字段不断更新。例如:

  • 数据发送时,更新发送窗口中的 snd_nxtsnd_una
  • 数据接收时,更新接收窗口中的 rcv_nxt
3. 关闭连接

TCP 连接关闭时,tcp_sock 状态会更新为 CLOSE_WAITFIN_WAIT,最终释放内存。


5. 从哪里到哪里

1. 发送方向

当应用层调用 send() 时,数据经由套接字接口进入传输层,TCP 层通过 tcp_sendmsg() 处理这些数据,将其存入 tcp_sock 的发送缓冲区,待网卡驱动发送到网络中。

2. 接收方向

当网卡驱动接收到 TCP 数据包后,数据会通过 sk_buff 传递到 TCP 层。TCP 根据数据包的序列号将其存入 tcp_sock 的接收缓冲区,供应用层调用 recv() 获取。


6. 简单示例:tcp_sock 部分定义

以下是 tcp_sock 的简化定义:

struct tcp_sock {__u32  snd_nxt;            // 发送窗口的下一个序列号__u32  rcv_nxt;            // 接收窗口的下一个序列号__u32  snd_una;            // 第一个未被确认的字节的序列号struct sk_buff_head  write_queue;  // 待发送的 skb 队列struct sk_buff_head  receive_queue; // 已接收但未处理的 skb 队列// 其他用于管理 TCP 连接的状态变量
};

总结

  1. TCB(传输控制块) 在 Linux 中主要由 struct tcp_sock 表示,是 TCP 协议管理的核心数据结构。
  2. 它的定义位于 include/net/tcp.h 文件中,保存了 TCP 协议中的关键信息,包括连接状态、序列号、窗口大小、发送与接收队列等。

Sign in · GitLab


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

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

相关文章

LabVIEW伸缩臂参数监控系统

LabVIEW开发伸缩臂越野叉车参数监控系统主要应用于工程机械中的越野叉车,以提高车辆的作业效率和故障诊断能力。系统通过PEAK CAN硬件接口和LabVIEW软件平台实现对叉车作业参数的实时监控和故障分析,具有良好的实用性和推广价值。 系统组成 系统主要由P…

多目标优化常用方法:pareto最优解

生产实际中的许多优化问题大都是多目标问题,举个例子:我们想换一份工资高、压力小、离家近的新工作,这里工资高、压力小、离家近就是我们的目标,显然这是一个多目标问题,那我们肯定想找到这三个目标同时最优的工作&…

跨站脚本攻击的多种方式——以XSS-Labs为例二十关详解解题思路

一、XSS-Labs靶场环境搭建 1.1、XSS介绍 跨站脚本攻击(XSS)_跨站脚本测试-CSDN博客https://coffeemilk.blog.csdn.net/article/details/142266454 1.2、XSS-Labs XSS-Labs是一个学习XSS攻击手法的靶场,方便我们系统性的学习掌握跨站脚本攻击…

【win10+RAGFlow+Ollama】搭建本地大模型助手(教程+源码)

一、RAGFlow简介 RAGFlow是一个基于对文档深入理解的开源RAG(Retrieval-augmented Generation,检索增强生成)引擎。 主要作用: 让用户创建自有知识库,根据设定的参数对知识库中的文件进行切块处理,用户向大…

54、库卡机器人轴的软限位设置

步骤1:将用户组改为“专家”。 步骤2:点击“投入运行”----“售后服务”-----“软件限位开关” 步骤3:就可以针对每个轴修改对应的角度值,然后点击“保存”。

0基础学前端-----CSS DAY9

0基础学前端-----CSS DAY9 视频参考:B站Pink老师 今天是CSS学习的第九天,今天开始的笔记对应Pink老师课程中的CSS第四天的内容。 本节重点:常见网页布局以及清除浮动 2. 常见网页布局 2.1 常见网页布局 有以下三种: 参考代码…

【自动化】Python SeleniumUtil 工具 开启开发者模式 自动安装油猴用户脚本等

【自动化】Python SeleniumUtil 工具 【Python】使用Selenium 操作浏览器 自动化测试 记录-CSDN博客文章浏览阅读58次。文章浏览阅读42次。【附件】Selenium chromedriver 驱动及浏览器下载。【附件】Selenium chromedriver 驱动及浏览器下载-CSDN博客。3.安装Chrome浏览器驱动…

UE5 移植Editor或Developer模块到Runtime

要将源码中的非运行时模块移植到Runtime下使用,个人理解就是一个解决编译报错的过程,先将目标模块复制到项目的source目录内,然后修改模块文件夹名称,修改模块.build.cs与文件夹名称保持一致 修改build.cs内的类名 ,每…

全志H618 Android12修改doucmentsui选中图片资源详情信息

背景: 由于当前的文件管理器在我们的产品定义当中,某些界面有改动的需求,所以需要在Android12 rom中进行定制以符合当前产品定义。 需求: 进入file文件管理器后,点击选中图片资源,选中功能按钮,获取信息,不显示“调试信息(仅开发者)”;现状是,获取信息,显示“调试信…

【WPS安装】WPS编译错误总结:WPS编译失败+仅编译成功ungrib等

WPS编译错误总结:WPS编译失败仅编译成功ungrib等 WPS编译过程问题1:WPS编译失败错误1:gfortran: error: unrecognized command-line option ‘-convert’; did you mean ‘-fconvert’?解决方案 问题2:WPS编译三个exe文件只出现u…

Spring(二)---基于注解的方式实现Bean管理和注入属性

目录 引入 什么是注解 Spring针对Bean管理中创建对象提供的注解 用注解的方式创建对象 ①:编写接口和实现类 ②:在需要管理的类上添加Component注解(上边四个都可以) ③:编写配置文件,重点是开启注解…

集成自然语言理解服务,让应用 “听得懂人话”

如今,应用程序智能化已成趋势,开发者想要实现智能化,那么首先需要赋予应用理解自然语言的能力,使其能够准确地听懂人话,进而响应用户需求,并提供一系列智能化服务。比如用户语音控制应用程序帮忙订票&#…

Redis常见阻塞原因总结

O(n) 命令 Redis 中的大部分命令都是 O(1)时间复杂度,但也有少部分 O(n) 时间复杂度的命令,例如: KEYS *:会返回所有符合规则的 key。HGETALL:会返回一个 Hash 中所有的键值对。LRANGE:会返回 List 中指定…

golang自定义MarshalJSON、UnmarshalJSON 原理和技巧

问题出现的原因:在前后端分离的项目中,经常出现的问题是时间戳格式的问题。 后端的日期格式兼容性强,比较完善。前端由于各种原因,日期格式不完善。 就会产生矛盾。 ms int64比较通用,但是unix时间没有可读性&#xff…

BGP的六种状态分别是什么?

此文章主要简单介绍下BGP的六种状态 1.Idle BGP会话的初始状态,路由器在此状态下不与任何BGP邻居通信,通常标识会话还没有开始或由于错误而未能启动,一般来说,缺乏去往BGP对等体的路由是导致BGP路由器其状态一直处于idle状态的常…

推挽输出和开漏输出

推挽输出:能真正的输出高低电平 开漏输出:无法正真的输出高电平(会分压),高电平时没有驱动能力,需要借助外部上拉电阻完成对外驱动

Linux之磁盘管理相关命令

1、du 作用:查看文件和目录占用的磁盘空间情况 语法: # 显示目录下每个子目录的磁盘使用情况 du [选项] 目录/文件 # 例:查/root下一层的文件和目录大小 du --max-depth1 -ah /root选项: -h:以人们较易阅读的GBytes,…

任务三数据库加固

1 修改mysql配置文件my.cnf,通常在/etc/my.cnf或者/etc/mysql/my.cnf 把mysql用户添加进去,分配最小权限,如果没有useradd添加一个 2 mysql -u root -p 登录mysql,输入 drop database test; 3 登录mysql,输入 update mysql.us…

uniapp开发app,cover-view不能隐藏,使用v-if,v-show都不行的解决办法

先上解决方案 在最后多写一个v-else <cover-view class"point-info" v-if"selectedPoint"><cover-view class"info-content"><cover-view class"info-item">。。。</cover-view><cover-view class"i…

3D视觉[一]3D计算机视觉

3D视觉[一]3D计算机视觉 3D计算机视觉概述 像机标定 文章目录 3D视觉[一]3D计算机视觉前言一、人类视觉二、计算机视觉2.1 计算机视觉的研究目的2.2 计算机视觉的研究任务2.3 计算机视觉的研究方法2.4 视觉计算理论2.5 马尔框架中计算机视觉表达的四个层次2.5.1 图像&#xff…