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

文章目录

    • 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.hqwc.cn/news/9184.html

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

相关文章

PostgreSQL使用localhost可以连接,使用IP无法连接

问题描述&#xff1a;PostgreSQL使用localhost可以连接&#xff0c;使用IP无法连接 默认情况下&#xff0c;刚安装完成的 postgresSQL12 无法使用 数据库连接工具&#xff08;如postman&#xff09;连接。需要为其修改配置&#xff0c;开放连接权限。 修改pg_hba.conf 增加…

B063-基础环境-后端环境 Lombok Restful postman swagger

目录 项目介绍需求分析项目架构项目技术架构前后端分离前后端分离开发模式前后端分离优缺点 后端项目搭建-部门模块项目端口规划创建SpringBoot项目流程整合SSM引用属性传值 LombokRestful风格Postman接口测试swagger接口规范其他 项目介绍 本项目是一个&#xff08;Online To…

蓝奥声开发高性价比智能wifi插座进军智能家居

关键词&#xff1a;智能家居、家用插座、WiFi插座、高性价比插座 智能硬件的大潮袭来让智能家居这一并不新鲜的概念再次火热起来&#xff0c;关于智能家居的各种场景的描述给了我们很大的想象空间&#xff0c;然而落到实处真正开始走进生活时却又显得那么骨感&#xff0c;一时间…

使用EXCEL公式编程从网页获取股票数据并保存到excel

共享文件地址 在dataexcel服务器的 /示例/03函数示例/获取股票数据8.fexm 路径 公式脚本 var urlcelltext("URL");//获取单元格ID为URL的单元格内容 var txtWebGet(url); //从网页获取数据 cellvalue("data",txt); //将获取到的数据库保存到ID为DATA的单…

JMeter从数据库中获取数据并作为变量使用

目录 前言&#xff1a; 1、JMeter连接MySQL数据库 2、线程组下新建一个 JDBC Connection Configuration 配置元件 3、实现数据库的查询-单值引用 4、实现数据库的查询-多值引用 前言&#xff1a; 在进行接口测试时&#xff0c;经常需要使用一些动态的数据&#xff0c;例如…

TypeScript学习(一):快速入门

文章目录 一、TypeScript 简介1、TypeScript 是什么&#xff1f;2、TypeScript 与 JavaScript 的区别3、JavaScript 的缺点4、为什么使用 TypeScript 二、TypeScript 开发环境搭建1、下载Node.js2、安装Node.js3、使用npm全局安装TypeScript4、创建一个ts文件5、使用tsc对ts文件…

使用PyMC进行时间序列分层建模

在统计建模领域&#xff0c;理解总体趋势的同时解释群体差异的一个强大方法是分层(或多层)建模。这种方法允许参数随组而变化&#xff0c;并捕获组内和组间的变化。在时间序列数据中&#xff0c;这些特定于组的参数可以表示不同组随时间的不同模式。 今天&#xff0c;我们将深…

驱动开发 作业2

使用 ioctl 替换 write/read 控制 LED、蜂鸣器、马达、风扇&#xff0c;并使用 udev 来自动创建设备文件 完整代码目录&#xff0c;请看这个仓库依然使用之前 ARM 课程中的 common 中的结构体代码都差不多&#xff0c;就贴个 led.c &#xff0c;用户空间测试代码 test.c 和头文…

剑指 Offer 57 - II: 和为s的连续正数序列

这里从0开始先然是不对的&#xff01;滑动窗口思想很好用&#xff0c;相等了必定移动左边&#xff01;让他变小&#xff01;这都想不到&#xff01; 首先看到返回值和题给条件明确这是一个滑动窗口任务/可变数组 &#xff0c;所以要使用List&#xff0c;然后其中元素又是数组&a…

QSlider样式表

QSlider 的样式设置_qslider样式_robertkun的博客-CSDN博客 Qslider样式_qslider的多种样式_DayDay_Upppp的博客-CSDN博客 【Qt】QSlider----qss&#xff08;round handle) 圆形滑块_qslider 圆形滑块_Qyee16的博客-CSDN博客 QT QSlider控件 样式表 渐变色的特殊格式_qslid…

SpringBoot 基于Redis的消息队列(基于发布订阅模型)

SpringBoot下Redis消息队列(基于发布订阅模型) 1. 什么是生产者/消费者模式&#xff1f; 消息队列一般是有两种场景 1、种是发布者订阅者模式 2、种是生产者消费者模式 生产者消费者模式 &#xff1a;生产者生产消息放到队列里&#xff0c;多个消费者同时监听队列&#xff0…

分布式——监控平台zabbix的认识与搭建

作为一个运维&#xff0c;需要会使用监控系统查看服务器系统性能、应用服务状态和网站流量指标等&#xff0c;利用监控系统的数据去了解网站上线发布的结果和健康状态。 利用一个优秀的监控软件&#xff0c;我们可以: ●通过一个友好的界面进行浏览整个网站所有的服务器状态 ●…