当前位置: 首页 > news >正文

Linux网络编程基础

目录

一、网络发展历史和分层

1.1Internet的历史

1.2网络的体系结构

1.2.1OSI模型

1.2.2TCP/IP协议族

1.2.3各层典型协议

1.2.4网络的封包和拆包

二、网络编程的预备知识

2.1Socket

2.1.1概念

2.1.2类型

2.2IP地址

2.3端口号

2.4字节序


一、网络发展历史和分层

1.1Internet的历史

  • 1968年6月提出”阿帕网“,是Internet的最早雏形,采用NCP网络控制协议缺点是不能互联不同类型的计算机和不同类型的操作系统,且没有纠错功能

  • 1973年由Robert Kahn和Vinton Cerf两人合作为阿帕网开发了新的互联协议,1974年12月两人正式发表第一份TCP协议详细说明但此协议在有数据包丢失时不能有效纠正

  • TCP协议分成两个不同的协议,自此TCP/IP协议诞生

    • 用来检测网络传输中差错的传输控制协议TCP(可靠传输)

    • 专门负责对不同网络进行互联的互联网协议IP不可靠传输

  • 1983年阿帕网上停止使用NCP,互联网上的主机全部使用TCP/IP协议。TCP/IP协议成为Internet中的”世界语“

1.2网络的体系结构

        网络的层次结构和每层所使用协议的集合,网络采用分层思想每一层实现不同的功能,对上层的数据做透明传输每一层向上层提供服务,同时使用下层提供的服务

两类非常重要的体系结构:OSI和TCP/IP

1.2.1OSI模型

  • OSI模型相关的协议已经很少使用,但模型本身非常通用

  • OSI模型是一个理想化的模型,尚未有完整的实现

  • 共有七层

 

与linux系统对应的话,低层相当于内核,高层相当于应用层。

网络上与之有关的比如交换机,二层交换机(对应数据链路层)、三层交换机(对应网络层,偏软件)

1.2.2TCP/IP协议族

  • TCP/IP协议是Internet事实上的工业标准

  • 共有四层

  •  网络接口和物理层(这一层有各式各样的硬件),主要是屏蔽硬件差异,然后为上层提供统一的接口(具体地比如net_device 结构体,网卡特性通过其中的成员来描述);
  • 传到上层网络层后,主要是实现端到端的通信(跨机器、跨操作系统、跨区域),典型的比如IP协议;
  • 再往上,传输层会实现通信和数据的完整性,比如TCP可靠传输,UDP不可靠传输(是否可靠只是基于不同应用场景);
  • 最后应用层,是用户和网络之间的接口,负责提供具体的应用服务

1.2.3各层典型协议

1.网络接口和物理层

  • MAC地址:48位全球唯一,网络设备的身份标识(相当于设备的身份证号码

  • ARP/RARP:解析地址,比如IP地址---->MAC地址,MAC地址---->IP地址

  • PPP:拨号协议,从以前的电话线拨号连接发展到现在的无线(GPRS/3G/4G)

2.网络层

  • IP:Internet protocol(分为IPV4和IPV6),IPV4地址是192.168.7.246这种,IPV6地址则是十六进制的

  • ICMP:Internet控制管理协议,比如ping命令

  • IGMP:Internet分组管理协议,广播、组播

3.传输层

  • TCP:Transfer Control protocol传输控制协议,提供面向连接的(建立虚拟连接),一对一的可靠数据传输的协议(通过消耗一定资源来实现),这种可靠体现在数据无误数据无丢失数据无失序数据无重复到达

  • SCTP:TCP的增强版,能实现多主机、多链路通信

  • UDP:user Datagram protocol用户数据报/包协议,提供不可靠无连接的尽力传输协议,优点是不需要进行连接高效

4.应用层

  • 网页访问协议,HTTP/HTTPS

  • 邮件发送接收协议:POP3(收)/SMTP(发)、IMAP(可接收邮件的一部分)

  • 文件传输:FTP

  • 远程登录:Telnet(明文传输)/SSH(加密传输)

  • 嵌入式相关

    • NTP网络时钟协议

    • SNMP简单网络管理协议(实现对网络设备集中式管理)

    • RTP/RTSP传输音视频的协议(安防监控)

1.2.4网络的封包和拆包

以该图为例(左边server往右边client发送数据):发送方经过各层会加上包头进行封包,最终通过驱动发送到路由器,路由器中间可能会经过不同网络,最终发送给接收方,存入它的空间,读取这个数据包就是不断地拆包环节

相关的概念有:

  • MTU:Maximum Transmission Unit 最大传输单元,和网络类型相关,以太网标准1500字节,IPV61280字节

  • MSS:Maximum Segment Size 最大报文段大小基于MTU计算不含各种头部开销

二、网络编程的预备知识

2.1Socket

2.1.1概念

  • 是一个应用编程接口(介于应用空间和内核空间)

  • 一种特殊的文件描述符(可以read、write、close)

  • 网络编程的一种资源

  • 并不仅限于TCP/IP协议,面向连接----TCP/IP无连接----UDP和IPX

2.1.2类型

  • 流式套接字(SOCK_STREAM),唯一对应TCP,内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制

  • 数据报套接字(SOCK_DGRAM),唯一对应UDP,独立数据包形式发送

  • 原始套接字(SOCK_RAM),可跨过、穿透传输层,通过IP、ICMP直接访问

2.2IP地址

  • Internet中主机的标识(要与别的机器通信必须具有一个IP地址)(相当于设备的住址,可以变动

  • 分为IPV4(32位地址)和IPV6(128位地址),常用IPV4

  • mobile IPV6:local IP(本地注册的IP),roam IP(漫游IP)

  • 每个数据包都必须携带目的IP地址和源IP地址,路由器依靠此信息帮数据包选择路由

  • IPV4地址表示形式:点分十进制形式----192.168.7.246、整数形式(省资源)

  • 特殊IP地址

    • 局域网IP:192.XXX.XXX.XXX、 10.XXX.XXX.XXX

    • 广播IP:XXX.XXX.XXX.255、255.255.255.255(全网广播)

    • 组播IP:224.XXX.XXX.XXX、239.XXX.XXX.XXX

IP地址转换函数如下:

#include <arpa/inet.h>//将点分十进制形式IP地址的字符串 转换为32位网络字节序整数
//仅用于IPV4,出错时返回-1,因此不能转换全网广播255.255.255.255的地址
in_addr_t inet_addr(const char *cp) 
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>//将点分十进制形式IP地址的字符串 转换为32位网络字节序整数
//IPV4和IPV6都可用,能正确处理全网广播的地址
int inet_pton(int af, const char *src, void *dst)params: af----AF_INET或AF_INET6src---源地址---点分十进制形式IP字符串dst---转换结果地址---32位整数return: 成功返回1 出错返回其他值//和它反过来的,将32位整数转换为点分十进制形式IP地址字符串
//成功返回非空指针,失败返回NULL
const char *inet_ntop(int af, const void * src, char * dst, socklen_t size)    

2.3端口号

  • 为了区分一台主机接收到的数据包应该转交给哪个进程/线程来进行处理,使用端口号来区别

  • 16位的数字(1~65535)

  • 知名端口:1~1023(FTP:21、SSH:22、HTTP:80、HTTPS:469)

  • 保留端口:1024~5000

  • 可使用的端口:5000~65535

  • TCP端口和UDP端口是相互独立的(意味着即使端口号相同也不冲突)原因如下图:

网络通信是由IP地址+端口号来决定

2.4字节序

  • 不同的CPU访问内存中的多字节数据(所以不包含字符串)时,存在大小端问题

    • 小端:低地址存低位数据,高地址存高位数据(个人简记为端),像x86/ARM一般都采用小端

    • 大端:低地址存高位数据,高地址存低位数据(个人简记为端),像powerpc/mips都采用大端

  • 网络字节序采用大端模式

  • 字节序转换函数

    • 主机->网络:

      • u_long htonl(u_long hostlong)    4字节
        u_short htons(u_short hostshort) 2字节
    • 网络->主机:

      • u_long ntohl(u_long netlong)
        u_short ntohs(u_short netshort)

字节序转换函数一般用来转换端口号,IP地址的转换前面已有API  

相关文章:

Linux网络编程基础

目录 一、网络发展历史和分层 1.1Internet的历史 1.2网络的体系结构 1.2.1OSI模型 1.2.2TCP/IP协议族 1.2.3各层典型协议 1.2.4网络的封包和拆包 二、网络编程的预备知识 2.1Socket 2.1.1概念 2.1.2类型 2.2IP地址 2.3端口号 2.4字节序 一、网络发展历史和分层 …...

MySQL中的幻读问题

1. 什么是幻读&#xff1f; 幻读是一种数据库事务中可能出现的并发问题&#xff0c;具体表现为&#xff1a;在同一个事务中&#xff0c;前后两次查询的结果集不同&#xff0c;仿佛“幻影”一般&#xff0c;出现了原本不存在的数据。 1.1 具体表现&#xff1a; 现象描述 事务 A…...

AI后端工程师面试题的内容

AI后端工程师面试题主要包括以下几个方面的内容‌&#xff1a; ‌一、技术基础和项目经验‌&#xff1a; ‌1. 微服务架构的理解和应用‌&#xff1a;请描述你对微服务架构的理解&#xff0c;并举例说明一个你参与过的微服务项目&#xff0c;阐述你在该项目中扮演的角色和所承…...

MFC工控项目实例三十五读取数据库数据

点击按钮打开文件夹中的数据文件生成曲线 相关代码 void CSEAL_PRESSUREDlg::OnTesReport() {CFileDialog dlgOpen(TRUE/*TRUE打开&#xff0c;FALSE保存*/,0,0,OFN_NOCHANGEDIR|OFN_FILEMUSTEXIST,"All Files(mdb.*)|*.*||",//文件过滤器NULL);CString mdb_1, m…...

OpenWrt -制作ubifs文件系统的固件

目的 创建一个ubifs为文件系统的镜像 将backup目录中的内容打包成ubifs文件系统。 ubifs的分区定义 ubi-backup.cfg 文件内容如下&#xff0c; [backup] modeubi imagenand-ipq6018-single.img vol_id0 vol_typedynamic vol_namebackup [bkver] modeubi imagebackup.ubifs v…...

C++ - 继承

继承的基本概念 继承就是一种代码的复用. 子类通过继承父类, 就能使用父类的变量, 方法. 学生和老师这两种身份, 他们都有共同的属性: 他们都有名称, 年龄, 性别 .... 当然他们也有各种独有的属性, 学生有学号, 老师有工号 .... 对于这些共有的属性, 我们可以将它们提取出来: …...

华为服务器使用U盘重装系统

一、准备工作 下载官方系统&#xff08;注意服务器CPU的架构是x86-64还是aarch64&#xff0c;不然可能报意想不到的错&#xff09;制作启动U盘&#xff08;下载rufus制作工具&#xff0c;注意文件系统选FAT32还是NTFS&#xff09; 二、安装步骤 将U盘插入USB接口重启服务器…...

网络分层模型( OSI、TCP/IP、五层协议)

1、网络分层模型 计算机网络是一个极其复杂的系统。想象一下最简单的情况&#xff1a;两台连接在网络上的计算机需要相互传输文件。不仅需要确保存在一条传输数据的通路&#xff0c;还需要完成以下几项工作&#xff1a; 发起通信的计算机必须激活数据通路&#xff0c;这包括发…...

前端开发 之 15个页面加载特效上【附完整源码】

文章目录 一&#xff1a;彩球环绕加载特效1.效果展示2.HTML完整代码 二&#xff1a;跷跷板加载特效1.效果展示2.HTML完整代码 三&#xff1a;两个圆形加载特效1.效果展示2.HTML完整代码 四&#xff1a;半环加载特效1.效果展示2.HTML完整代码 五&#xff1a;音乐波动加载特效1.效…...

Spring Boot使用JDK 21虚拟线程

JDK 21引入的虚拟线程&#xff08;Virtual Threads&#xff09;是 Project Loom 的一部分&#xff0c;旨在显著简化并发编程并提高 Java 应用的可扩展性。以下是虚拟线程的主要特点&#xff1a; 1. 概念 虚拟线程是轻量级线程&#xff0c;与传统的操作系统线程不同&#xff0…...

《从0到1常用Map集合核心摘要 + 不深不浅底层核心》

《从0到1常用Map集合核心摘要不深不浅底层核心》 前置知识 什么是键值对 ​ 键值对是一种数据结构&#xff0c;键是唯一标识&#xff0c;值是对应数据&#xff0c;用来快速查找信息。例&#xff1a; {"name": "Alice"}&#xff0c;键是name&#xff0c;…...

12 设计模式之工厂方法模式

一、什么是工厂方法模式&#xff1f; 1.定义 在软件开发中&#xff0c;设计模式 是解决常见软件设计问题的最佳实践。而 工厂方法模式&#xff08;Factory Method Pattern&#xff09; 作为创建型设计模式之一&#xff0c;常常被用来解决对象创建问题。它通过将对象的创建交给…...

spaCy 入门与实战:强大的自然语言处理库

spaCy 入门与实战&#xff1a;强大的自然语言处理库 spaCy 是一个现代化、工业级的自然语言处理&#xff08;NLP&#xff09;库&#xff0c;以高效、易用和功能丰富著称。它被广泛应用于文本处理、信息提取和机器学习任务中。本文将介绍 spaCy 的核心功能&#xff0c;并通过一…...

python包的管理和安装——笔记

1.列出包 pip list pip freeze 用这2个可以查看当前python 下所有的包和版本&#xff0c;还有下载地址 如果只是想导出当前的环境 可以用 2.安装pipreqs pip install pipreqs&#xff0c;pipreqs ./可以导出当前项目的包这个包 遇到编码报错 pipreqs ./ --encodingutf8 p…...

Vue前端页面内嵌套本项目iframe窗口的通信传输方式

一、目的 想要在iframe中使用本项目页面、并能够与其父页面组件实现实时通信。Vue前端页面内嵌套本项目iframe窗口的通信传输方式-星林社区 https://www.jl1mall.com/forum/PostDetail?postId20241202172800023969 二、iframe通信方式 1.接收消息 页面需要监听 message 事件…...

【WEB开发.js】addEventListener事件监听器的绑定和执行次数的问题(小心踩坑)

假设我们有一个按钮&#xff0c;用户点击该按钮后&#xff0c;会选择一个文件&#xff0c;且我们希望每次点击按钮时只触发一次文件处理。下面我会给你一个简单的例子&#xff0c;展示放在函数内部和放在函数外部的区别。 1. 将事件监听器放在函数内部&#xff08;问题的根源&…...

用于LiDAR测量的1.58um单芯片MOPA(一)

--翻译自M. Faugeron、M. Krakowski1等人2014年的文章 1.简介 如今&#xff0c;人们对高功率半导体器件的兴趣日益浓厚&#xff0c;这些器件主要用于遥测、激光雷达系统或自由空间通信等应用。与固态激光器相比&#xff0c;半导体器件更紧凑且功耗更低&#xff0c;这在低功率供…...

【GPT】代谢概念解读

以下是对代谢中分解代谢和合成代谢两个概念的深入解读&#xff0c;用简单易懂的方式展开说明&#xff1a; 1. 分解代谢&#xff08;Catabolism&#xff09; 什么是分解代谢&#xff1f; 分解代谢是身体把大分子“拆开”的过程。就像把一个三明治分解成面包片、肉片和菜叶&#…...

Devops-git篇-01-git环境配置

环境配置 设置用户签名 配置用户名&#xff1a; git config --global user.name 你的用户名 配置邮箱&#xff1a; git config --global user.email 注册的邮箱 配置好之后&#xff0c;可以用git config --global --list命令查看配置是否OK $ git config --global --list u…...

STM32 HAL库开发学习1.STM32CubeMX 新建工程

STM32 HAL库开发学习1.STM32CubeMX 新建工程 一、 STM32 CubeMX 下载二、CubeMX 功能介绍1. 固件包路径设置2. 新建工程 三、创建项目实例1. 新建项目2. GPIO 管脚设置3. GPIO 窗口配置4. 调试设置5. 时钟配置6. 项目管理&#xff08;1&#xff09;项目信息&#xff08;2&#…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

问题&#xff1a; pgsql数据库通过备份数据库文件进行还原时&#xff0c;如果表中有自增序列&#xff0c;还原后可能会出现重复的序列&#xff0c;此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”&#xff0c;…...