Linux内核之网络套接字

news2024/11/15 22:56:42

文章目录

  • 前言
  • 一、TCP4层模型和OSI7层模型
      • OSI 7层模型
      • TCP/IP 4层模型
      • 比较
  • 二、套接字概念
  • 三、sockaddr_in和sockaddr结构体
      • `sockaddr_in`
      • `sockaddr`
      • 区别
  • 四、协议中的数据划分
      • 数据划分和首部添加流程
      • 数据接收与解析流程
      • 流程图


前言

一、TCP4层模型和OSI7层模型

OSI 7层模型

  1. 物理层 (Physical Layer):负责传输原始比特流,包括电缆、光纤和无线传输。
  2. 数据链路层 (Data Link Layer):提供错误检测和纠正,控制数据帧的流量,管理节点到节点的通信。
  3. 网络层 (Network Layer):处理数据包的路由选择和转发,管理不同网络之间的传输(如IP协议)。
  4. 传输层 (Transport Layer):提供端到端的数据传输服务,确保数据完整性和顺序(如TCP、UDP)。
  5. 会话层 (Session Layer):管理会话的建立、维护和终止,协调会话之间的交互。
  6. 表示层 (Presentation Layer):处理数据的编码和解码,确保数据在不同系统间能够被正确解释(如加密、压缩)。
  7. 应用层 (Application Layer):直接与应用程序交互,提供网络服务(如HTTP、FTP、SMTP)。

TCP/IP 4层模型

  1. 网络接口层 (Network Interface Layer):对应于OSI模型的物理层和数据链路层,负责网络硬件和数据帧的传输。
  2. 互联网层 (Internet Layer):对应于OSI模型的网络层,负责数据包的路由和寻址(如IP协议)。
  3. 传输层 (Transport Layer):对应于OSI模型的传输层,处理端到端的数据传输和错误检测(如TCP、UDP)。
  4. 应用层 (Application Layer):合并了OSI模型的会话层、表示层和应用层,提供各种网络服务和应用协议(如HTTP、FTP)。

比较

  • 层数:OSI模型有7层,TCP/IP模型有4层,TCP/IP模型的层次较少,功能上则有重叠。
  • 功能:OSI模型更为详细,分层更细;TCP/IP模型则更为实用,广泛应用于现代网络。
  • 实际应用:TCP/IP模型是互联网协议的基础,实际中更为常见。OSI模型则是一个理论模型,主要用于教学和理解网络概念。

通过了解这两种模型,可以帮助更好地理解网络协议的工作原理和网络系统的结构。
在这里插入图片描述

二、套接字概念

套接字(Socket)是网络编程中的一个基本概念,用于实现不同主机或程序之间的通信。它是一个软件结构,用于定义网络连接的端点。

主要功能

  • 标识:套接字通过IP地址和端口号来唯一标识网络中的通信端点。
  • 接口:它提供了用于建立、管理和终止网络连接的接口。
  • 协议:常用的协议包括TCP(面向连接)和UDP(无连接)。

类型

  1. 流套接字 (Stream Socket):使用TCP协议,确保数据可靠、按顺序到达,适合需要稳定连接的应用。
  2. 数据报套接字 (Datagram Socket):使用UDP协议,不保证数据的到达顺序和可靠性,适合对实时性要求高的应用。

通过套接字,应用程序可以在网络上发送和接收数据,实现通信。

三、sockaddr_in和sockaddr结构体

sockaddr_insockaddr 是网络编程中用来处理地址信息的结构体。

sockaddr_in

  • 定义sockaddr_in 是一个专门用于IPv4地址的结构体。
  • 字段
    • sin_family:地址族,通常设为 AF_INET
    • sin_port:端口号,以网络字节序存储(通常使用 htons 转换)。
    • sin_addr:IPv4地址,使用 in_addr 结构体表示。
    • sin_zero:填充字段,通常设为零,以确保结构体的大小与 sockaddr 结构体对齐。
struct sockaddr_in {
    sa_family_t    sin_family; // 地址族,通常是 AF_INET
    uint16_t       sin_port;   // 端口号
    struct in_addr sin_addr;   // IPv4 地址
    char           sin_zero[8]; // 填充字段
};

sockaddr

  • 定义sockaddr 是一个通用的地址结构体,用于表示不同类型的网络地址。
  • 字段
    • sa_family:地址族,指明地址类型(如 AF_INETAF_INET6 等)。
    • sa_data:包含地址和端口的通用字段,其具体格式取决于地址族。
struct sockaddr {
    sa_family_t sa_family; // 地址族
    char        sa_data[14]; // 地址数据
};

区别

  • sockaddr_insockaddr 的一个特定实现,用于处理IPv4地址。
  • sockaddr 是一个通用结构体,可以用来处理不同类型的地址(IPv4、IPv6等),但需要根据实际地址族进行类型转换。

在实际使用中,sockaddr_in 常用于套接字编程中,而 sockaddr 常用作函数参数,提供通用的地址接口。

四、协议中的数据划分

在网络通信中,数据在不同的协议层上进行划分,每一层都会在数据前添加一个首部(Header)。这些首部用于提供必要的控制信息,以确保数据能够正确传输到目标主机。接收到数据时,每一层会解析并去除相应的首部,最终恢复出原始的数据内容。

数据划分和首部添加流程

  1. 应用层:应用程序将数据传递给传输层,这些数据称为应用数据。在这个阶段,没有应用层首部,数据是应用程序生成的原始数据。

  2. 传输层:传输层(如TCP或UDP)在应用数据前添加传输层首部。这个首部包括了源端口号、目标端口号、序列号、确认号等信息。这个过程称为“封装”。

  3. 网络层:网络层(如IP)在传输层数据前添加网络层首部,包括源IP地址、目标IP地址和其他路由信息。

  4. 数据链路层:数据链路层在网络层数据前添加数据链路层首部(如以太网头部),包括源MAC地址、目标MAC地址和其他链路层控制信息。

  5. 物理层:数据链路层将带有首部的数据传递给物理层,物理层负责将数据转换为电信号或光信号,并通过网络介质传输。

数据接收与解析流程

  1. 物理层:物理层接收信号,将其转换回数据帧。

  2. 数据链路层:数据链路层解析数据链路层首部,提取出网络层的数据,并进行错误检查。

  3. 网络层:网络层解析网络层首部,提取出传输层的数据,并进行路由决策。

  4. 传输层:传输层解析传输层首部,提取出应用层数据,并进行数据重组(如TCP的重传和排序)。

  5. 应用层:应用层接收到的数据是原始的应用数据,经过多层解析和拆解后,交给应用程序进行处理。

流程图

下面是一个数据传输的流程图,展示了数据在各层的封装和解封装过程:

+-----------------------+
|      应用层数据       |        (Data)
+-----------------------+
| 应用层首部 (Application Header) |       (App Header)
+-----------------------+
| 传输层首部 (Transport Header)    |       (Transport Header)
+-----------------------+
| 网络层首部 (Network Header)      |       (Network Header)
+-----------------------+
| 数据链路层首部 (Data Link Header) |       (Data Link Header)
+-----------------------+
| 物理层数据 (Physical Layer Data)  |       (Physical Layer Data)
+-----------------------+

数据传输过程

  1. 应用程序发送数据:应用程序生成数据。
  2. 应用层:在应用数据前添加应用层首部。
  3. 传输层:在应用层数据前添加传输层首部。
  4. 网络层:在传输层数据前添加网络层首部。
  5. 数据链路层:在网络层数据前添加数据链路层首部。
  6. 物理层:将完整的数据帧转换为电信号并传输。

数据接收过程

  1. 物理层:接收电信号并恢复为数据帧。
  2. 数据链路层:解析数据链路层首部,提取网络层数据。
  3. 网络层:解析网络层首部,提取传输层数据。
  4. 传输层:解析传输层首部,提取应用层数据。
  5. 应用层:最终数据交给应用程序进行处理。

这个过程确保数据能够从发送方的应用程序正确传输到接收方的应用程序,中间的每一层都添加和解析首部以提供必要的通信控制。

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

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

相关文章

XSS Game练习

1.Ma Spaghet 直接get传参 ?somebodyaaaa直接使用img标签 ?somebody<img%20src1%20onerror"alert(1337)">官方文档 应使用innertext&#xff0c;安全性更高 2.Jefff 通过代码可以知道是通过eval的代码执行&#xff0c;setTimeout中的内容表示在一秒后执行…

avalonia学习之布局组件

border 边框控件用边框和背景装饰一个&#xff08;单个&#xff09;子控件。它还可用于显示圆角。 属性 属性描述Background背景颜色。BorderBrush边框颜色。BorderThickness边框线粗细&#xff08;整数&#xff09;。CornerRadius所有四个角的半径&#xff08;一个值&#…

解决com.google.android.play:core:1.10.3在10.1号之后targetSDK升到34的问题

implementation com.google.android.play:core:1.10.3或者这样的 升到android14 之后可能提审的时候都会遇到这个问题&#xff0c;解决方法如下&#xff1a; implementation com.google.android.play:asset-delivery:2.2.2 implementation com.google.android.play:app-update…

刀锋利器:Knife4j助你轻松驾驭API文档

文章目录 整合Knife4j引入依赖编写配置文件 法①编写配置文件 法②配置名词解释注解三兄弟 : ApiOperation、ApiParam、ApiModel 启动项目, 访问Knife4j测试Knife4j优点支持全局参数支持离线文档支持API搜索 **技术派项目源码地址 : ** **Gitee : **技术派 - https://gitee.co…

解密键盘输入:探索设备控制器的奥秘

流程初探 键盘是我们最常用的输入硬件设备之一。作为程序员&#xff0c;你知道当我们敲击键盘上的字母"A"时&#xff0c;操作系统会发生什么吗&#xff1f;下面我将简要介绍整个过程&#xff0c;以便你更容易理解为什么需要这些组件。 首先&#xff0c;让我们来看看…

Processing练习之鼠标控制线段粗细

案例代码如下&#xff1a; import processing.pdf.*; import java.util.Calendar; boolean savePDF false; int tileCount 20; int actRandomSeed 0; int actStrokeCap ROUND; void setup(){ size(600,600); } void draw(){ if(savePDF)beginRecord(PDF, timestamp()"…

回调函数,字符函数,字符串函数

前言&#xff1a;上一趴我们学习了指针。那么今天我们来学习新的知识&#xff0c;回调函数&#xff0c;字符函数&#xff0c;字符串函数。 1 回调函数 什么是回调函数呢&#xff1f;回调函数就是通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作…

加热系统加入达温即停和保温功能

加热系统加入达温即停和保温功能 引言 ​ 我们前一节, 是通过控制io口, 直接控制加热的开关, 但是这太简单粗暴了, 如果只是那样, 和普通的家居电器,是没区别的, 我们想要更智能一点, 就是像咱们自己家的热水壶那样, 水烧滚了(水温达到100摄氏度), 就自动停止了. 加热功能&a…

SQL每日一练-0816

今日SQL题&#xff1a;计算每个项目的年度收入增长率 难度系数&#xff1a;&#x1f31f;☆☆☆☆☆☆☆☆☆ 1、题目要求 计算每个项目每年的收入总额&#xff0c;并计算项目收入环比增长率。找出每年收入增长率最高的项目。输出结果显示年份、项目ID、项目名称、项…

JS周结 day0817

ok了家人们&#xff0c;今天这周学习了JavaScript&#xff0c;我们一起看一下吧 一.JavaScript概述 1.1 应用场景 JavaScript 用来做前端页面校验 JavaScript 可以实现网页的一些动画效果&#xff0c;例如&#xff1a;轮播图 1.2 JavaScript介绍 JavaScript 是一门跨平台、…

华为OD(C卷,200分)- 智能驾驶

(C卷,200分)- 智能驾驶 题目描述 有一辆汽车需要从 m * n 的地图左上角(起点)开往地图的右下角(终点),去往每一个地区都需要消耗一定的油量,加油站可进行加油。 请你计算汽车确保从从起点到达终点时所需的最少初始油量。 说明: 智能汽车可以上下左右四个方向移动 地图…

Monaco Editor组件使用详解

Monaco Editor 是由微软开发并开源的一款代码编辑器&#xff0c;它是 Visual Studio Code&#xff08;VS Code&#xff09;的核心部分。Monaco Editor 提供了丰富的特性&#xff0c;包括语法高亮、代码折叠、代码提示&#xff08;IntelliSense&#xff09;、多光标选择、搜索和…

RabbitMQ消息队列总结

RabbitMQ那些事 参考一. `RabbitMQ`介绍1.1 Java工程师1.1.1 RabbitMQ学习目标1.1.2 消息队列介绍1.1.3 RabbitMQ介绍各自属性介绍(❤❤❤)二. `RabbitMQ`安装1. 基于Linux1.1 安装1.2 常用命令1.3 后台管理开启与面板介绍三. 客户端`SDK`操作(❤❤了解)1. 客户端依赖1. 生产者…

【区块链+金融服务】中国银联区块链可信存证服务 | FISCO BCOS应用案例

随着金融行业信息化的快速推进&#xff0c;“互联网 金融”业务产生了海量的电子数据。例如&#xff0c;截止到 2022 年第二季度&#xff0c; 全国累计信用卡发卡数量约 8.07 亿张&#xff0c;累计银行卡应偿信贷余额为 8.66 万亿元&#xff0c;累计信用卡逾期半年未尝信贷 总…

18124 N皇后问题

### 详细分析 这是一个经典的N皇后问题。我们需要在N\*N的棋盘上放置N个皇后&#xff0c;使得任意两个皇后不在同一行、同一列或同一对角线上。可以使用回溯算法来解决这个问题。 ### 伪代码 1. 定义一个函数countSolutions&#xff0c;输入为N&#xff0c;输出为N皇后问题的解…

尚硅谷MYSQL(5-6章)

排序和分页 排序 如果没有使用排序操作的话 查询出来的数据是按添加的顺序排序的 ORDER BY是来进行排序的 后面可以添加ASC升序 DESC降序 如果后面没有显示指明排序的方式的话 则默认按照升序排序 where中不能使用列的别名 我们在使用sql语句的时候 她的执行顺序不是从第一…

Python 环境搭建指南 超详细

Python是由荷兰⼈吉多范罗苏姆&#xff08;Guido von Rossum&#xff0c;后⾯都称呼他为Guido&#xff09;发明的⼀种编程语言 1. 1989年圣诞节&#xff1a;Guido开始写Python语⾔的编译器。2. 1991年2⽉&#xff1a;第⼀个Python解释器诞⽣&#xff0c;它是⽤C语⾔实现的&…

STM32之点亮LED灯

使用固件库实现LED点灯 LED灯&#xff1a; LED灯&#xff0c;是一种能够将电能转化为可见光的半导体器件 控制LED灯&#xff1a; LED灯的正极接到了3.3V&#xff0c;LED灯的负极接到了PA1&#xff0c;也就是GPIOA1引脚 只需要控制PA1为相对应的低电平&#xff0c;即可点亮对…

政务大数据解决方案(十)

政务大数据解决方案通过建立全面的集成数据平台&#xff0c;整合来自各政府部门的异构数据&#xff0c;运用大数据分析、人工智能和机器学习技术对数据进行深度挖掘与智能化处理&#xff0c;提供实时精准的决策支持&#xff0c;从而提升政策制定和实施的科学性与效率。该方案包…

retrofit+livedata+viewModel+moshi处理数据

1.从源码角度看&#xff0c;只需要定义一个CallAdapterFactory 处理结果livedata接受默认的CallAdapterFactory 是DefaultCallAdapterFactory // // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) //package retrofit2;i…