Linux网络编程:网络基础

news2025/1/19 2:59:58

文章目录:

1.协议  

2.锁

3.网络层次模型

4.以太网帧和ARP协议

5.IP协议

6.UDP协议

7.TCP协议

8.BS模式和CS模式

9.网络套接字(socket)

10.网络字节序

11.IP地址转换函数

12.sockaddr地址结构


学习Linux的网络编程原则上基于:Linux的系统编程 和 Linux基础的Shell编程(第十章);除此之外还包含了计算机网络的知识

Linux基础shell编程——>Linux 系统编程——>Linux 网络编程

1.协议  

互联网协议(Internet Protocol Suite)

什么是协议:从应用的角度出发,协议可理解为“规则”,是数据传输和数据的解释的规则


典型协议
    传输层     常见协议有TCP/UDP协议
    应用层     常见的协议有HTTP协议,FTP协议
    网络层     常见协议有IP协议、ICMP协议、IGMP协议
    网络接口层  常见协议有ARP协议、RARP协议
TCP传输控制协议(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议

UDP用户数据报协议(User Datagram Protocol)是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务

HTTP超文本传输协议(Hyper Text Transfer Protocol)是互联网上应用最为广泛的一种网络协议

FTP文件传输协议(File Transfer Protocol)

IP协议是因特网互联协议(Internet Protocol)

ICMP协议是Internet控制报文协议(Internet Control Message Protocol)它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息

IGMP协议是 Internet 组管理协议(Internet Group Management Protocol),是因特网协议家族中的一个组播协议。该协议运行在主机和组播路由器之间

ARP协议是正向地址解析协议(Address Resolution Protocol),通过已知的IP,寻找对应主机的MAC地址

RARP是反向地址转换协议,通过MAC地址确定IP地址

2.锁

如何避免死锁:
    保证资源的获取顺序,要求每个线程获取资源的顺序一致
    当得不到已有的资源时,放弃已经获取的资源,等待


读写锁:当读次数远大于写次数时
    写独占,读共享
    写锁优先级高
    锁只有一把


条件变量指明了共享数据区值不值得访问(有无空位或产品),锁是访问共享数据区的通行证
    信号量可以看作进化版互斥锁:1-->N,保证同步的同时,提高了并发
    sem_wait:给信号量加锁,sem–,lock
    sem_post:给信号量解锁,sem++,unlock,同时唤醒阻塞在该信号上的线程

3.网络层次模型

物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等
    它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)
    这一层的数据叫做比特

数据链路层:定义了如何让格式化数据以帧为单位进行传输,以及如何让控制对物理介质的访问
    这一层通常还提供错误检测和纠正,以确保数据的可靠传输
    如:串口通信中使用到的115200、8、N、1

网络层:在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择
    Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层

传输层:定义了一些传输数据的协议和端口号(WWW端口80等)
    如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据)
       UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)
       主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段

会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路
    主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)

表示层:可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取
    例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC)
         而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符
    如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换

应用层:是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务

OSI七层模型结构(我的记忆方法_巫术网传会报应):  物、数、网、传、会、表、应

TCP/IP 4层模型结构:网(链路层/网络接口层)、网、传、应

	应用层:http、ftp、nfs、ssh、telnet。。。

	传输层:TCP、UDP

	网络层:IP、ICMP、IGMP

	链路层:以太网帧协议、ARP

网络传输数据封装流程

数据没有封装之前,是不能在网络中传递。

数据-》应用层-》传输层-》网络层-》链路层  --- 网络环境


只有应用层协议在用户态可见,往下的都处在内核中(什么是内核?)

4.以太网帧和ARP协议

以太网帧协议:根据mac地址,完成数据包传输
            以太网帧中的目的地址和源地址是指MAC地址


ARP协议(数据报格式):根据 Ip 地址获取 mac 地址

5.IP协议

版本: IPv4、IPv6  -- 4位

TTL: time to live 。 设置数据包在路由节点中的跳转上限。每经过一个路由节点,该值-1, 减为0的路由,有义务将该数据包丢弃

源IP: 32位。--- 4字节		192.168.1.108 --- 点分十进制 IP地址(string)  --- 二进制 

目的IP:32位。--- 4字节

6.UDP协议

源端口号                                        目的端口号

                         序号

                         确认序号

数据偏移  保留     URG/ACK/PSH/RST/SYN/FIN       窗口


            检验和                              紧急指针

                        选项和填充(从这开始往上是首部)

                        数据
IP地址:可以在网络环境中,唯一标识一台主机

端口号:可以网络的一台主机上,唯一标识一个进程
       多数应用程序使用5000以下的端口(80端口:http协议)

ip地址+端口号:可以在网络环境中,唯一标识一个进程

7.TCP协议

16位:源端口号                             16位:目的端口号

                       32序号

                       32确认序号

4位首部长度   保留6位 URG/ACK/PSH/RST/SYN/FIN  16位窗口大小


       16位检验和                             16位紧急指针

                        选项(从这开始往上是报头)

                        数据

8.BS模式和CS模式

           C/S:Client/Server                      B/S:Browser/Server

优点:	缓存大量数据、协议选择灵活、速度快			安全性、跨平台、开发工作量较小
	

缺点:	安全性差、开发工作量大、跨平台难			    不能缓存大量数据、必须严格遵守http协议

9.网络套接字(socket)

一个文件描述符指向一个套接字(该套接字内部由内核借助两个缓冲区实现)

在通信过程中, 套接字一定是成对出现的

10.网络字节序

小端法:(pc本地存储)	高位存高地址。地位存低地址。	int a = 0x12345678
大端法:(网络存储)	高位存低地址。地位存高地址。

htonl --> 本地--》 网络 (IP)			192.168.1.11 --> string --> atoi --> int --> htonl --> 网络字节序
htons --> 本地--》 网络 (port)
ntohl --> 网络--》 本地(IP)
ntohs --> 网络--》 本地(Port)

用库函数做网络字节序和主机字节序的转换

#include<arpa/inet.h>
uint32_t htonl(uint32_t hostlong);			//主要针对IP
uint16_t htons(uint16_t hostshort);			//主要针对port
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

11.IP地址转换函数

由于如192.168.45.2这种的IP地址为点分十进制表示,需要转化为uint32_t型,有现成的函数(IPv4和IPv6都可以转换) 

int inet_pton(int af, const char *src, void *dst);		                   本地字节序(string IP) ---> 网络字节序
	af:AF_INET、AF_INET6
	src:传入,IP地址(点分十进制)
	dst:传出,转换后的 网络字节序的 IP地址。 
	返回值:
		成功: 1
		异常: 0, 说明src指向的不是一个有效的ip地址。
		失败:-1



const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);	网络字节序 ---> 本地字节序(string IP)
	af:AF_INET、AF_INET6
	src: 网络字节序IP地址
	dst:本地字节序(string IP)
	size: dst 的大小。
	返回值: 成功:dst、失败:NULL

12.sockaddr地址结构

 IP + port --> 在网络环境中唯一标识一个进程

struct sockaddr_in addr;

addr.sin_family = AF_INET/AF_INET6				man 7 ip

addr.sin_port = htons(9527);
		
int dst;

inet_pton(AF_INET, "192.157.22.45", (void *)&dst);

addr.sin_addr.s_addr = dst;

【*】addr.sin_addr.s_addr = htonl(INADDR_ANY);		取出系统中有效的任意IP地址。二进制类型。

bind(fd, (struct sockaddr *)&addr, size);

举例 

/*相初始化*/
addr.sin_family=AF_INET/AF_INET6;
addr.sin_port=htons(9527);					//端口号为short类型(16bit)

int dst;
inet_pton(AF_INET,"192.168.10.2",(void*)&dst);
addr.sin_addr.s_addr=dst;
/*或者采取下面的方法*/
addr.sin_addr.s_addr=htonl(INADDR_ANY)		//取出系统中任意有效的IP地址




/*相关结构体定义,在man 7 ip*/
struct sockaddr_in{
	sa_family_t		sin_family;
	in_port_t		sin_port;
	struct in_addr	sin_addr;
};
struct in_addr{
    uint32_t s_addr;
};
struct sockaddr_in addr;



int bind(int sockfd,const struct sockaddr* addr,socklen_t addrlen);
/*struct sockaddr是早已废弃的数据结构,已不再使用,用新的时注意强转一下*/
int ret = bind(sockfd,(struct sockaddr*)&addr,size);

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

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

相关文章

中大许少辉博士《乡村振兴战略下传统村落文化旅游设计》中国建筑工业出版社八一付梓。

中大许少辉博士《乡村振兴战略下传统村落文化旅游设计》中国建筑工业出版社八一付梓。

gdb调试的经验基本流程处理

一、启动调试 1、gdb启动 gdb启动非常简单&#xff0c;只要直接执行下面的命令&#xff1a; gdb exename(调试文件的名称)2、设置参数 如果需要调试的程序需要输入参数怎么办呢&#xff1f;有三种方法可以实现&#xff1a; a、在启动调试程序时使用命令参数设置 gdb --args …

Linux中启动docker 出现 ‘ Failed to start docker.service: Unit not found. ’ 错误

启动docker 出现 ‘ Failed to start docker.service: Unit not found. ’ 错误 这是因为缺少 rhel-push-plugin.socket 单元&#xff0c;该单元是rhel-push-plugin软件包的一部分。所以我们执行以下指令就可以成功解决&#xff1a; curl -sSL https://get.docker.com/ | sh 执…

搭建redis集群

前言 redis 集群分为一下几种&#xff1a; 【主从模式】&#xff1a;一般情况大多都是读多写少的情况&#xff0c;主从模式可以将读写分离&#xff0c;主库写&#xff0c;从库只负责读取的情况&#xff0c;这从如果任何一个从库宕机的情况&#xff0c;整个集群仍然可以提供工作…

使用GUI Guider工具开发嵌入式GUI应用(6)-切换多screen换场景

使用GUI Guider工具开发嵌入式GUI应用&#xff08;6&#xff09;-切换多screen换场景 本节将展示使用GUI Guider实现切换显示页面功能。 这里设计的用例是&#xff1a; 创建3张页面&#xff0c;screen_0,screen_1和screen_2。分别在每个页面上中放置一个Label&#xff08;最…

仿牛客论坛项目day7|Kafka

一、阻塞队列 创建了一个生产者线程和一个消费者线程。生产者线程向队列中放入元素&#xff0c;消费者线程从队列中取出元素。我们可以看到&#xff0c;当队列为空时&#xff0c;消费者线程会被阻塞&#xff0c;直到生产者线程向队列中放入新的元素。 二、Kafka入门 发布、订阅…

亿图脑图MindMaster思维导图及亿图图示会员-超值途径

亿图脑图MindMaster思维导图及亿图图示会员 先简单看一下这两软件&#xff1a; MindMaster 亿图图示 丰富的社区&#xff0c;便捷易操作的界面&#xff0c;还有耐看的UI设计&#xff1b;要是再有点特权&#xff0c;真的是锦上添花~ 如果需要MindMaster思维导图或者亿图图示VIP…

Android Retrofit原理浅析

官方地址:Retrofit 原理:Retrofit 本质上是代理了OKhttp,使用代理模式,Type-Safe 类型安全 编译器把类型检查出 避免类型错误, enqueue 异步 切换线程 execute 同步 不切换线程 enqueue:Call接口定义的抽象方法 Retrofit.Create() 方法首先验证接口validateServiceInterf…

ps吸管工具用不了怎么办?

我们的办公神器ps软件&#xff0c;大家一定是耳熟能详的吧。Adobe photoshop是电影、视频和多媒体领域的专业人士&#xff0c;使用3D和动画的图形和Web设计人员&#xff0c;以及工程和科学领域的专业人士的理想选择。Photoshop支持宽屏显示器的新式版面、集20多个窗口于一身的d…

小数据 vs 大数据:为AI另辟蹊径的可操作数据

在人工智能背景下&#xff0c;您可能已听说过“大数据”这一流行语&#xff0c;那“小数据”这一词呢&#xff0c;您有听说过吗&#xff1f;无论您听过与否&#xff0c;小数据都无处不在&#xff1a;线上购物体验、航空公司推荐、天气预报等均依托小数据。小数据即一种采用可访…

webpack 和 ts 简单配置及使用

如何使用webpack 与 ts结合使用 新建项目 &#xff0c;执行项目初始化 npm init -y会生成 {"name": "tsdemo01","version": "1.0.0","description": "","main": "index.js","scripts&…

java_免费文本翻译API_小牛翻译

目录 前言 开始集成API 纯文本翻译接口 双语对照翻译接口 指定术语翻译接口 总结 前言 网络上对百度&#xff0c;有道等的文本翻译API集成的文章比较多&#xff0c;所以集成的第一篇选择了小牛翻译的文本翻译API。 小牛翻译文本翻译API&#xff0c;支持388个语种&#xff0…

CrossOver2023快速在Mac和Linux系统上运行Windows软件

让您可以在 Mac 和 Linux 系统上运行 Windows 应用&#xff0c;不必购买 Windows 授权&#xff0c;不必重启系统&#xff0c;不必使用虚拟机。通过 CrossOver&#xff0c; 您可以从 dock 直接启动 Windows 应用&#xff0c;与您的 Mac 和 Linux 系统功能无缝集成。 无需重启 Cr…

强训第35天

选择 A 经过一个1->2 经过两个2->4 开始慢增长 4->5 5->6....9->10 到达4KB时变成慢增长&#xff0c;最多增长到10 D 网络号是180.80.76 但题目让向主机所在子网发广播 180 .80 .(01001101 | 111111 11)79 .255 标红的两位属于主机号所以答案为D A C 分片的组…

排名算法简介:对搜索结果进行排序的主要排名算法

一、介绍 学习排名 &#xff08;LTR&#xff09; 是一类监督式机器学习算法&#xff0c;旨在根据项目与查询的相关性对项目列表进行排序。在分类和回归等问题中的经典机器学习中&#xff0c;目标是根据特征向量预测单个值。LTR 算法对一组特征向量进行操作&#xff0c;并预测项…

【FAQ】视频集中存储EasyCVR安防监控平台接入AI分析时的通道显示问题排查

安防视频监控平台视频集中存储EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。 安防监控视频云存储平台EasyCVR既具…

为什么贴片电阻的阻值不规律?为了在某精度下做到阻值的全覆盖(对,但不全对),E系列电阻的算法(E12系列值不对的猜想)

1、先放上E系列的电阻表格 E12精度10%&#xff0c;E24精度5%&#xff0c;E96精度1%&#xff1b; 2、以精度作为条件的演算 通常我们选择电阻&#xff0c;要确定电阻的精度&#xff0c;如果以精度作为条件。 以10%精度来说&#xff1a;&#xff08;数值少&#xff0c;好算&am…

STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知)

STM32 CubeMX STM32 CubeMX ____Freertos任务通信&#xff1a;队列、信号量、互斥量&#xff0c;事件组&#xff0c;任务通知 STM32 CubeMX一、STM32 CubeMX设置时钟配置HAL时基选择TIM1&#xff08;不要选择滴答定时器&#xff1b;滴答定时器留给OS系统做时基&#xff09;使用…

超分辨率地震速度模型

文献分享 1. Multitask Learning for Super-Resolution 原题目&#xff1a;Multitask Learning for Super-Resolution of Seismic Velocity Model 全波形反演&#xff08;FWI&#xff09;是估算地下速度模型的强大工具。与传统反演策略相比&#xff0c;FWI充分利用了地震波的…

计算机丢失msvcp110.dll是什么意思?如何修复?

在日常使用电脑的时候&#xff0c;有时候会遇到一些使用问题。 比如&#xff0c;有一次遇到了这样一个问题。 那就是&#xff0c;因为“msvcp110.dll”这个文件丢失&#xff0c;有些软件安装不了。 计算机丢失msvcp110.dll是什么意思&#xff1f;该如何修复呢&#xff1f; ​…