【网络进阶】Posix API与网络协议栈(三)

news2024/11/26 2:34:09

文章目录

    • 1. 网络攻击和POSIX API与网络协议栈的关系
      • 1.1 网络攻击的基本概念和它们对协议栈的影响
      • 1.2 分布式拒绝服务(DDoS)攻击和网络协议栈
      • 1.3 地址解析协议(ARP)欺骗和POSIX API
    • 2. 网络协议栈的理解和划分
      • 2.1 OSI七层模型
      • 2.2 TCP/IP五层模型
      • 2.3 协议栈的划分:应用程序和内核程序
    • 3. 网络协议栈的应用:从硬件到应用层
      • 3.1 物理层和数据链路层:硬件和接口
      • 3.2 网络层:路由和寻址
      • 3.3 传输层:端对端的连接
      • 3.4 应用层:高级服务和应用
    • 4. TCP传输:深入理解报文结构
      • 4.1 TCP报文结构
      • 4.2 TCP报文的处理
    • 5. Send缓冲区:数据的中转站
      • 5.1 Send缓冲区的作用
      • 5.2 Send缓冲区的工作原理
    • 6. send/recv函数:网络通信的核心
      • 6.1 send函数
      • 6.2 recv函数
      • 6.3 示例

1. 网络攻击和POSIX API与网络协议栈的关系

1.1 网络攻击的基本概念和它们对协议栈的影响

网络攻击是对计算机网络或网络设备中的服务或数据进行破坏、窃取、更改或者阻止正常访问的行为。网络攻击可以从许多方面进行,包括软件攻击、信息收集、服务干扰等。例如,分布式拒绝服务(DDoS)和地址解析协议(ARP)欺骗就是两种常见的网络攻击。这些攻击都是通过网络协议栈,特别是传输层和网络层进行的。

1.2 分布式拒绝服务(DDoS)攻击和网络协议栈

分布式拒绝服务(DDoS)攻击是一种网络攻击,其目标是通过大量的请求使目标服务器资源耗尽,从而无法提供服务。在DDoS攻击中,攻击者通常会控制一个“僵尸网络”(由许多被感染的设备组成的网络)来发送攻击流量。由于这些流量来自许多不同的源,因此阻止这种攻击往往非常困难。对于这种攻击,POSIX API的网络函数可以帮助我们理解和防范,例如通过设置socket选项或者调整网络I/O模型来对抗。

1.3 地址解析协议(ARP)欺骗和POSIX API

地址解析协议(ARP)欺骗是一种网络攻击,其中攻击者发送伪造的ARP消息到局域网。这些伪造的消息通常使网络设备更新其ARP缓存,使得网络流量可以被攻击者重定向。攻击者可以利用ARP欺骗进行窃听(也称为"中间人攻击"),或者发动DoS攻击。在防御ARP欺骗攻击方面,POSIX API为我们提供了用于检测和过滤网络流量的工具。

2. 网络协议栈的理解和划分

网络协议栈是描述计算机网络内各种协议如何协同工作以完成网络通信的模型。下面我们先介绍两种常见的协议栈模型:OSI七层模型和TCP/IP五层模型。

2.1 OSI七层模型

OSI(Open Systems Interconnection)模型,也被称为七层模型,分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

  • 物理层:处理物理连接的细节,如电压、时序、物理数据速率等。
  • 数据链路层:负责数据的帧同步、差错控制和流量控制。
  • 网络层:负责数据包的路由和转发。
  • 传输层:负责提供端到端的可靠传输。
  • 会话层:负责在数据流中设立、管理和终止会话。
  • 表示层:负责数据的转换和编码,例如加密、压缩等。
  • 应用层:负责处理特定的应用程序细节。

2.2 TCP/IP五层模型

相比于OSI七层模型,TCP/IP五层模型将OSI模型的会话层和表示层合并到应用层,并将物理层和数据链路层合并为网络接口层,所以五层模型是:网络接口层、网络层、传输层和应用层。

  • 网络接口层:与OSI模型的物理层和数据链路层相对应,负责物理连接和数据的帧同步。
  • 网络层:与OSI模型的网络层相对应,负责数据包的路由和转发。
  • 传输层:与OSI模型的传输层相对应,负责提供端到端的可靠传输。
  • 应用层:与OSI模型的应用层、表示层和会话层相对应,负责处理特定的应用程序细节。

2.3 协议栈的划分:应用程序和内核程序

通常,我们可以将网络协议栈分为应用程序部分和内核程序部分。

应用程序部分主要包括应用层的协议。在OSI模型中,还包括会话层和表示层。这一部分通常在用户空间进行处理,且可以使用POSIX API来实现。应用程序可以使用这些API来建立网络连接、发送数据、接收数据等。

内核程序部分主要包括网络层、传输层、数据链路层和物理层的协议。在TCP/IP模型中,还包括网络接口层。这一部分通常在内核空间进行处理。内核程序部分负责低级别的网络操作,如数据包的路由和转发、可靠传输的实现等。

3. 网络协议栈的应用:从硬件到应用层

3.1 物理层和数据链路层:硬件和接口

在这两层中,硬件设备和网络接口起着关键的作用。例如:

  • NIC(Network Interface Card):网络接口卡是连接计算机和网络的硬件设备,它在物理层和数据链路层处理数据的接收和发送。

  • Ethernet:以太网是一种最常见的有线网络技术,它定义了数据链路层和物理层的标准。

  • Wi-Fi:无线网络技术,它也定义了数据链路层和物理层的标准,但使用无线信号进行通信。

  • Netmap:是一个在内核和数据链路层之间的框架,它可以让应用程序直接访问网络控制器,从而绕过内核栈,大大提高了网络处理的速度。

3.2 网络层:路由和寻址

网络层负责数据包的发送和路由。此层主要协议和应用包括:

  • IP(Internet Protocol):IP协议定义了网络中的地址,以及数据如何从源地址传送到目标地址。

  • ICMP(Internet Control Message Protocol):用于在IP主机和路由器之间传递控制消息。如 “ping” 和 “traceroute” 命令就是使用ICMP。

  • ARP(Address Resolution Protocol):用于将IP地址解析为物理地址(如以太网MAC地址)。

  • Routers:路由器是网络层的主要设备,它负责决定数据包的转发路径。

3.3 传输层:端对端的连接

传输层协议负责在网络中建立端到端的连接。例如:

  • TCP(Transmission Control Protocol):TCP提供了一种可靠的数据传输服务,它能确保数据在有错误发生的网络中无差错地传送到目的地。

  • UDP(User Datagram Protocol):UDP提供一种无连接的数据传输服务,它在传输速度要求高于可靠性的应用中有广泛的应用。

  • SCTP (Stream Control Transmission Protocol):SCTP是一种更加现代化的传输层协议,提供了类似TCP的可靠传输,同时也提供了类似UDP的消息边界。

3.4 应用层:高级服务和应用

应用层处理特定的应用程序细节。例如:

  • HTTP/HTTPS:是用

于Web通信的协议,它使得浏览器可以请求和获取网页。HTTPS是加密的HTTP版本,使用SSL/TLS协议进行加密。

  • DNS(Domain Name System):是用于将人类可读的网址解析为机器可读的IP地址的服务。

  • SMTP、POP3和IMAP:这些是电子邮件的主要协议,SMTP用于发送邮件,POP3和IMAP用于接收邮件。

  • Nginx:是一个HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。

  • FTP (File Transfer Protocol):用于在网络上传输文件的协议。

  • SSH (Secure Shell):用于远程登录服务器或者在网络上执行命令的协议。

  • POSIX API:提供一套标准的编程接口,可以让应用程序与网络协议栈进行交互。例如,应用程序可以使用socket接口来创建TCP或UDP连接,也可以使用相关的接口来发送或接收数据。

4. TCP传输:深入理解报文结构

TCP (Transmission Control Protocol) 是一种可靠的、面向连接的传输层协议。它提供了一种方式,可以确保数据被正确且按序从一个网络端点传输到另一个网络端点。要理解TCP如何实现这一点,我们需要深入了解TCP报文(也称为TCP段)的结构。

4.1 TCP报文结构

在这里插入图片描述

一个TCP报文主要由报头和数据两部分组成。

报头 包含了以下字段:

  • 源端口和目标端口(各16位):这两个字段分别指定了发送方和接收方的端口号。

  • 序列号(32位):这个字段用于确定报文在整个数据流中的位置,使接收方能够将接收到的数据重新组装成原始的顺序。

  • 确认号(32位):在确认模式下,这个字段指定了接收方期望接收的下一个报文的序列号。

  • 数据偏移(4位):指定了TCP报头的长度,使得接收方能够找到数据的开始位置。

  • 保留(6位):保留未使用。

  • 标志位(6位):这些标志位用于控制TCP的特定功能,如SYN、ACK、FIN等。

  • 窗口大小(16位):这个字段指定了接收方的缓冲区大小,用于流量控制。

  • 校验和(16位):这个字段用于错误检测。

  • 紧急指针(16位):这个字段仅在URG标志设置时有效,指定了紧急数据的结束位置。

数据 部分包含了要传输的实际数据。

4.2 TCP报文的处理

TCP报文在传输过程中会经历以下步骤:

  1. 发送端:应用程序通过调用POSIX API的send()函数,向TCP层传递数据。TCP层会为数据添加TCP报头,形成TCP报文,并传递给网络层。

  2. 网络层:网络层将TCP报文封装在IP数据包中,并添加源IP地址和目标IP地址。数据包通过网络路由到达接收端。

  3. 接收端:数据包到达接收端后,TCP层解析TCP报文,检查校验和,并根据序列号将数据重新排序。如果数据包丢失或出错,TCP会发送重传请求。

  4. 应用程序:数据被送到应用程序,应用程序通过调用POSIX API的recv()函数,从TCP层接收数据。

5. Send缓冲区:数据的中转站

在数据传输过程中,send缓冲区(发送缓冲区)起着至关重要的作用。在网络应用中,TCP协议的实现会用到两个主要的缓冲区:send缓冲区和receive缓冲区。这里,我们专注于send缓冲区的角色和工作原理。

5.1 Send缓冲区的作用

send缓冲区的主要作用是暂存应用程序希望发送的数据,直到这些数据能够被TCP成功地发送到网络。这样做有几个好处:

  1. 分离应用程序和网络:应用程序可以在数据准备好发送时立即写入send缓冲区,而无需等待网络条件允许发送数据。这使应用程序可以继续执行其他任务,而不是被阻塞在数据发送上。

  2. 数据包的重新发送:如果某些数据包在网络中丢失,TCP需要重新发送这些数据包。已发送但尚未得到确认的数据将被保留在send缓冲区中,以便在需要时重新发送。

5.2 Send缓冲区的工作原理

应用程序通过调用POSIX API的send()或write()函数,将数据写入send缓冲区。这些函数会把应用程序的数据复制到send缓冲区,并立即返回,让应用程序继续执行其他任务。

一旦数据在send缓冲区中,TCP就会尝试将数据发送到网络。如果网络条件不佳(如网络拥塞或无可用带宽),TCP可能会等待更好的条件。在这种情况下,数据会留在send缓冲区中,直到可以发送。

每当数据成功地从send缓冲区发送并得到接收方的确认,这部分数据就会从send缓冲区中删除,为新的发送数据腾出空间。如果send缓冲区已满,应用程序试图写入更多数据时,send()或write()函数将会被阻塞,直到send缓冲区有足够的空间。

6. send/recv函数:网络通信的核心

在POSIX API中,send和recv函数是进行网络通信的核心函数。它们分别用于发送和接收数据。

6.1 send函数

send函数将应用程序的数据发送到网络。它将数据复制到send缓冲区,并由TCP协议负责将数据发送到网络。这是send函数的一般用法:

#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);

其中:

  • sockfd:套接字描述符,是socket函数创建的
  • buf:指向要发送数据的指针
  • len:要发送数据的字节数
  • flags:一般设为0

6.2 recv函数

recv函数从网络接收数据。它从receive缓冲区中提取数据,并将其复制到应用程序提供的缓冲区。这是recv函数的一般用法:

#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t len, int flags);

其中:

  • sockfd:套接字描述符,是socket函数创建的
  • buf:指向用于存放接收数据的缓冲区的指针
  • len:buf缓冲区的大小
  • flags:一般设为0

6.3 示例

下面是一个简单的TCP客户端示例,它创建一个套接字,连接到服务器,发送一个消息,然后接收一个消息:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <iostream>

int main() {
    // 创建套接字
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        std::cerr << "Error creating socket" << std::endl;
        return 1;
    }

    // 设定服务器地址
    struct sockaddr_in server_address;
    memset(&server_address, 0, sizeof(server_address));
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(12345);  // 服务器端口号
    if (inet_pton(AF_INET, "192.0.2.0", &server_address.sin_addr) <= 0) {  // 服务器IP地址
        std::cerr << "Error setting server address" << std::endl;
        return 1;
    }

    // 连接到服务器
    if (connect(sockfd, (struct sockaddr*)&server_address, sizeof(server_address)) < 0) {
        std::cerr << "Error connecting to server" << std::endl;
        return 1;
    }

    // 发送消息
    const char* send_buf = "Hello, server!";
    if (send(sockfd, send_buf, strlen(send_buf), 0) < 0) {
        std::cerr << "Error sending message" << std::endl;
        return 1;
    }

    // 接收消息
    char recv_buf[256];
    ssize_t num_bytes = recv(sockfd, recv_buf, sizeof(recv_buf) - 1, 0);
    if (num_bytes < 0) {
        std::cerr << "Error receiving message" << std::endl;


        return 1;
    }

    recv_buf[num_bytes] = '\0';  // 添加null字符来终止字符串
    std::cout << "Received message: " << recv_buf << std::endl;

    // 关闭套接字
    close(sockfd);

    return 0;
}

这段代码首先创建一个套接字,然后设定服务器的地址和端口号,并尝试连接到服务器。成功连接后,它发送一个简单的消息给服务器,并等待接收服务器的响应。收到响应后,它关闭套接字,并结束程序。

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

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

相关文章

AI 边缘计算控制器GEAC91

1 产品概览 产品概览 GEAC91 AI边缘计算控制器是一款基于 NVIDIA Jetson AGX Xavier处理 器、面向智能边缘计算应用场景的解决方案。 GEAC91控制器具有 控制器具有 GMSL2、 千兆网口CAN总线、 RS232、RS422、 USB3.0、USB2.0、SD卡等丰富的外设接口 &#xff0c;支持常见激光雷…

记录--不定高度展开收起动画 css/js 实现

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 不定高度展开收起动画 最近在做需求的时候&#xff0c;遇见了元素高度展开收起的动画需求&#xff0c;一开始是想到了使用 transition: all .3s; 来做动画效果&#xff0c;在固定高度的情况下&#xf…

霍尔闭环电流传感器在电动观光旅游车上的应用

摘要&#xff1a;本文介绍了基于霍尔闭环原理&#xff0c;即磁平衡式原理的电流传感器在电动观光旅游车上的使用方法&#xff0c;替代传统的霍尔器件&#xff0c;较好的解决了电动车行业现有霍尔传感器的基本问题&#xff0c;在稳定性上更加优越。 关键词&#xff1a;霍尔闭环…

2022 年首届“钉钉杯”大学生大数据挑战赛B题:航班数据分析与预测——国奖论文代码分享

2023年的钉钉杯挑战赛马上要来了~这里给大家分享一下去年的国奖论文思路与代码 摘要&#xff1a; 随着民航事业的迅速发展 , 飞机出行已成为未来发展的一种必然趋势&#xff0c;然而近年来&#xff0c; 航班延误现象频频发生&#xff0c;成为困扰机场和航空公司的难题。对航班…

Idea项目application.properties配置文件默认GBK,如何设置默认为UTF-8编码

简述&#xff1a;java程序在项目中一般设置都是UTF-8编码格式&#xff0c;但是项目application.properties 文件默认是GBK,需要手工修改默认编码格式 步骤&#xff1a; file->setting->editor->file encodings下&#xff0c;勾选transparent native-to-ascll conver…

AR远程协助平台运用到建筑领域能带来哪些帮助?

随着科技的不断发展&#xff0c;远程协同培训已经成为了一种越来越受欢迎的学习方式。在建筑施工领域中&#xff0c;这种学习方式同样具有很大的应用价值。本文将探讨AR远程协助平台在建筑施工中的应用。 首先&#xff0c;AR远程协助平台可以提高建筑施工的效率和质量。传统的…

Java学习之Varargs机制

概述 Varargs&#xff0c;即variable number of arguments&#xff0c;variable arguments。中文一般译为&#xff0c;可变长度参数&#xff0c;或简称可变参数&#xff0c;参数具体来说是形参。 自JDK5引入&#xff0c;借助这一机制&#xff0c;可以定义能和多个实参相匹配的…

基于Java+SpringBoot+Vue的流浪动物救助平台设计与实现

博主介绍&#xff1a;✌擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案…

【前端|CSS系列第2篇】CSS零基础入门之常用样式属性

欢迎来到CSS零基础入门系列的第二篇博客&#xff01;作为前端开发的关键技术之一&#xff0c;CSS&#xff08;层叠样式表&#xff09;能够为网页添加各种样式和布局效果。对于前端零基础的小白来说&#xff0c;了解和掌握CSS的常用样式属性是入门的关键。本篇博客将带你深入了解…

基本的组合门电路、以及二极管、三极管(详细讲解)

基本门电路、二极管、三极管 1.基本的组合门电路1.1 与门&#xff08;AND Gate&#xff09;&#xff1a;2.2 或门&#xff08;OR Gate&#xff09;&#xff1a;1.3 非门&#xff08;NOT Gate&#xff09;&#xff1a;1.4 异或门&#xff08;XOR Gate&#xff09;&#xff1a; 2…

chatgpt赋能python:Python面向对象和面向过程编程

Python面向对象和面向过程编程 Python是一种高级编程语言&#xff0c;可以使用不同的编程风格进行开发。本篇文章将讨论Python面向对象和面向过程编程风格的概念、差异和优缺点。 什么是面向对象编程&#xff1f; 面向对象编程是一种编程范式&#xff0c;它将现实世界的概念…

TP6在composer包里写控制器

前提&#xff1a;首先要了解下如何自建composer包。 1.先建一个空包&#xff0c;加一个文件&#xff1a;composer.json {"name": "test/ctrs","type": "library","license": "MIT","autoload": {&quo…

Python一行命令搭建HTTP服务器并外网访问+-+内网穿透

文章目录 1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试 3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 转载自远程内网穿透的文章&#xff1a;【Python】快速简单搭建HTTP服务器并公网访问「cpolar内网穿透…

PS扣签名

打开Photoshop CS6&#xff0c;依次点击“文件”-“打开”&#xff0c;把签名照导入进来。 在“选择”菜单下点击“色彩范围”。 此时鼠标形状变成了一支笔&#xff0c;点击签名上黑色的地方&#xff0c;适当调整颜色容差&#xff0c;点击“确定”完成选择。 按住CtrlJ组…

基于Java园区停车管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

【SWAT水文模型】率定参数选择及校准技巧

SWAT模型率定参数选择及校准技巧 水量平衡与径流&#xff08;Water Balance And Stream Flow&#xff09;1 基本水量平衡和总径流校准&#xff08;Basic Water Balance & Total Flow Calibration&#xff09;1.1 校准地表径流&#xff1a;1.2 校准地下径流&#xff1a; 2 流…

如何查看 Facebook 公共主页的广告数量上限?

作为Facebook的资深人员&#xff0c;了解如何查看公共主页的广告数量上限对于有效管理和优化广告策略至关重要。本文将详细介绍如何轻松查看Facebook公共主页的广告数量上限&#xff0c;以帮助您更好地掌握广告投放策略。 一、什么是Facebook公共主页的广告数量上限&#xff1f…

如何使用《水经注地图服务》快速发布MBTiles数据

《水经注地图服务》的快速发布功能是一个能够帮助用户实现快速发布地图服务的功能&#xff0c;并且提供常规情况下大多数用户所需的默认配置&#xff0c;让用户在发布地图时更加便捷。 今天为大家分享如何利用《水经注地图服务》快速发布MBTiles地图数据。 准备工作 离线示例…

C语言小项目之扫雷(进阶版)

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C语言学习分享⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5; 带你学习更多C语言知识   &#x1f51d;&#x1f51d; 扫雷小项目 1. 前期准备2. 初始化…

phpRedis扩展安装以及session redis存储

1.下载redis扩展&#xff08;redis扩展各个版本下载地址&#xff1a;https://pecl.php.net/package/redis&#xff09; wget https://pecl.php.net/get/redis-3.1.6.tgz 2.解压下载的redis扩展 tar zxvf redis-3.1.6.tgz 3.用phpize生成configure配置文件 phpize 4.查找p…