Linux-网络基础

目录

  • 数据传输
    • IP地址
    • 端口
    • 协议
    • 网络字节序
    • 网络通信--五元组
  • socket套接字编程
    • udp、tcp区别
    • udp通信程序的编写:套接字接口
      • 通信流程:
      • 接口代码
    • 字节序转换接口
    • 代码实例

发展背景:
最早时期计算机是单机工作,由于两台主机之间无法进行信息交互,只能通过拷贝实现。因此出现了 交换机,实现两台相邻设备之间的数据交换,但是交换机没有动态选择路径的能力,无法指定设备进行交换信息。后来交换机被 路由器取代,随着交换的目标不同路由器实现自主路径选择,实现了小型局域网。

网络分类:

局域网(覆盖范围1km以内),城域网(1km~2km),广域网(2km以上):根据网络覆盖范围进行的网络划分。
互联网,因特网:相同的东西不同的叫法-国际性的更大的广域网
以太网,令牌环网:组网技术

数据传输

IP地址

IP地址:网络中每一台主机的唯一标识(不能出现重复)
ipv4:数据类型uint32_t 类型的整数:无符号四字节整数。
由于ipv4地址不够用,有了 DHCP(动态地址分配:谁用给谁分配)----NAT(网络地址转换:组建私网,私网的主机使用同一ip地址)
ipv6:uint8_t ip[16]:有16个字节,每个字节有8位,共有128位;不向前兼容ipv4

端口

每一个网络中的数据都会带有信息:源端IP+远端端口+对端IP+对端端口

由来:当主机A发送给主机B消息时,无法判断主机B上哪个软件接收消息,因此需要端口进行判断。
端口网络通信中一台主机上进程的标识符
unit16_t类型的数据(无符号2字节整数)–范围:0~65535
每一个网络中的数据不但带有源端IP和对端IP,还包含两个信息:源端端口,对端端口
目的:为了让接收方主机收到数据后能够直到应该哪个进程处理数据
一个端口只能被一个进程占用
源端IP+远端端口+对端IP+对端端口:描述了当前这个数据是从网络中对端哪个主机上的哪个进程发出来的,要发往哪台主机上的哪个进程。

协议

协议:约定–网络通信协议实际上就是网络通信两端的数据格式约定
协议由来:数据传输过程中以物理信号传递,最后要通过网卡转换为数据信号,但不同的网卡转换方式不同,造成信息转换错误。
网络通信协议–就是网络通信中的数据格式
因此要实现网络互联就必须具有统一的网络通信协议标准
协议分层:将复杂网络环境按照提供的服务以及使用的接口协议不同划分层次将网络通信层次清晰划分出来,更加容易实现网络互连。
OSI七层网络互连模型:以提供的服务不同将网络通信环境划分为七层
层次划分:应用层-表示层-会话层-传输层-网络层-链路层-物理层
TCP/IP五层模型
应用层:负责进程(应用程序)之间的数据沟通;FTP、HTTP
传输层:负责进程之间的数据传输;UDP、TCP
网络层:负责地址管理与路由选择;IP;路由器(进行路径选择)
链路层:负责相邻设备之间的数据传输;以太网协议-eth;交换机
物理层:负责物理光电信号的传输;以太网协议;集线器;

网络字节序

通信两端主机字节序不同有可能造成数据二义

字节序:cpu对内存中数据进行存取的顺序
主机字节序分类
大端:低地址存高位;小端:低地址存低位
主机字节序对网络通信的影响
两个不同主机字节序主机之间的数据通信,主机字节序不同,则有可能在网络通信中会产生数据二义性。
字节序针对的数据类型
存储单元大于一个字节的数据类型:short/int/long/float/double;
char字符串不需要考虑字节序,单字节存储

解决方案
定义网络通信字节序标准
网络中的数据必须都是网络字节序-大端字节序
发送放将数据转换为网络字节序(大端)的数据进行发送
接收方接收到数据之后根据自己的主机字节序决定如何转换
概括:想要避免因为主机字节序不同而导致的数据二义,则需要在网络中统一字节序标准–网络字节序–为大端字节序(也就意味着如果你的主机是小端,则在网络通信时需要将数据转换为网络字节序(大端)后进行发送

大小端区分
一个变量/数组的起始地址就是低地址,随着下标变大而变大
X86-小端;MIPS-大端
使用联合体判断大小端:
union{int a; char b;} temp; tmp.a = 1; if(tmp.b == 1)则是小端;
联合体成员变量共用一块地址空间,以空间大的成员变量为空间大小,int四个字节,char一个字节,b在首地址(低地址),a设为1,则低位是1,如果b也等于1,说明低位存放在低地址,为小端;如果b为0,则说明低位存放在高地址,为大端。

网络通信–五元组

网络每一条通信都会包含有完整的五元组信息:数据从哪来到哪去,数据格式什么样子
五元组-表示一条通信:sip+sport+dip+dport+protlcol
源端ip+源端端口+对端ip+对端端口+通信协议

socket套接字编程

socket套接字编程:网络通信程序的编写(接口+流程)

udp、tcp区别

udp协议与tcp协议的区别初识:
udp协议:用户数据报协议
特性:无连接,不可靠,面向数据报
应用场景:实时性大于安全性要求的场景—视频传输
tcp协议:传输控制协议
特性:面向连接,可靠传输,面向字节流
应用场景:安全性大于实时性要求的场景—文件传输

在网络通信程序中,通信两端被分为:客户端,服务器端
客户端:通常是提供给客户的通信端,通常是编写通信程序中主动发起请求的一段
服务端:通常指被动接受请求,提供服务的通信端
客户端时主动发送请求的一端,也就意味着客户端必须提前能够知道服务端的地址信息(ip+port)是多少;服务端的地址信息通常是固定的,并且是提前提供给客户端的。

udp通信程序的编写:套接字接口

通信流程:

服务端:server
1.创建套接字—在内核中创建一个socket结构体
2.为套接字绑定地址信息
在创建套接字创建的socket结构体中加入IP+port信息
①告诉操作系统主机收到的哪些数据应该交给当前的这个socket
②确定发送数据的源端地址信息
3.接收数据
当前进程从指定的socket接收缓冲区中取出数据
4.发送数据
将要发送的数据放到socket发送缓冲区中,内核选择合适时候封装发送
5.关闭套接字

客户端:client
1.创建套接字
2.为套接字绑定地址信息
大多是情况下会忽略第2步
在发送数据时,若socket没有绑定地址,则系统会选择合适的地址进行绑定
3.发送数据
4.接收数据
5.关闭套接字

接口代码

1.创建套接字:

int socket(int domain, int type, int protocol);

domain:地址域类型;AF_INET:使用ipv4通信,使用ipv4的地址结构
type:套接字类型;SOCK_STREAM / SOCK_DGRAM
udp通信(面向数据包)必须使用SOCK_DGRAM;tcp通信(面向字节流)必须使用SOCK_STREAM
protocol:本次通信协议 IPPROTO_TCP-6 / IPPROTO_UDP-17
返回值:返回一个文件描述符-操作句柄,失败返回-1
通过操作句柄能在内核中找到相对应的socket结构体

2.为套接字绑定地址信息

int bing(int sockfd, struct sockaddr *addr, socklen_t addrlen);

sockfd:创建套接字返回的操作句柄
addr:当前绑定的地址信息
socklen_t:地址信息长度
返回值:成功返回0;失败返回-1

3.接收数据信息

ssize_t recvfrom(int sockfd, void *buf, int len, int flag, struct sockaddr *srcaddr, socklen_t *addrlen);

sockfd:操作句柄;
buf:空间地址,用于存放接收的数据
len:要接受的数据长度
flag:选项标志-默认0-表示阻塞接收
srcaddr:本条数据的源端地址信息
addrlen:输入输出参数–指定要接受多长的地址结构,并且返回实际接收的地址长度
返回值:返回实际接收到的数据长度;失败错误返回-1

4.发送数据:

ssize_t sendto(int sockfd, void *data, int len, int flag, struct sockaddr *peeraddr, socklen_t addrlen);

sockfd:操作句柄;
data:要发送的数据的空间首地址
len:要发送的数据长度
flag:默认0-阻塞发送
peeraddr:对端地址信息
addrlen:地址结构长度
返回值:成功返回实际发送的数据长度,失败返回-1;

5.关闭套接字

int close(int fd);

字节序转换接口

uint32_t htonl(uint32_t hostlong);//32位数据主机到网络字节序转换
uint16_t htons(uint16_t hostshort);//16位数据主机到网络字节序转换
uint32_t ntonl(uint32_t netlong);//32位数据网络到主机字节序转换
uint32_t ntons(uint32_t netshort);//16位数据网络到主机字节序转换

port端口转换使用s,ip转换用l,不能混用

//将字符串点分十进制IP地址转换为整型网络字节序IP地址192.168.2.2-> 0xc0a80202
in_addr_t inet_addr(const char *cp);//将网络字节序IP地址转换为字符串点分十进制IP地址
char *inet_ntoa(struct in_addr in); in.s_addr = 0xc0a80202const char *inet_ntop(int af, void *src, char *dst, socklen_t size);
int inet_pton(int af, const char *src, void *dst);

代码实例

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<arpa/inet.h>	//字节序转换接口头文件
#include<netinet/in.h>	//地址结构,协议类型头文件
#include<sys/socket.h>	//套接字接口头文件int main()
{//1.创建套接字int sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if(sockfd < 0){perror(socket error);return -1;}//2.为套接字绑定地址信息struct sockaddr_in addr;//定义ipv4地址结构addr.sin_family = AF_INET;//ipv4的地址结构,告诉剩下的该如何解析,2个字节的端口,4个字节的ip地址addr.sin_port = htons(9000);//设置地址端口addr.sin_addr.s_addr = inet_addr("10.106.200.199");//ifconig,云服务器选eth0,虚拟机选ens3int len = sizeof(addr);int ret = bind(sockfd, (struct sockaddr*)&addr, len);if(ret < 0){perror("bind error");return -1;}while(1){//3.接收数据char buf[1024] = {0};struct sockaddr_in paddr;int len = sizeof(struct sockaddr_in);ret = recvfrom(sockfd, buf, 1023, 0, (struct sockaddr*)&paddr, &len);if(ret < 0){perror("recvfrom error");return -1;}printf("client say: %s\n", buf);//4.回复数据char *data = "receive success";ret = sendto(sockfd, data, strlen(data), 0, (struct sockaddr*)&paddr, len);if(ret < 0){perror("sendto error");return -1;}}//5.关闭套接字close(sockfd);return 0;
}

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

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

相关文章

【C++庖丁解牛】List容器的介绍及使用 | 深度剖析 | list与vector的对比

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. list的介绍1.1 list的…

CentOS Stream9更改ip地址,网关(设置静态ip)

使用grep命令查询ens160文件所在的文件夹处 grep -rnw /etc -e ens160 然后用vi命令打开文件进行修改 vi /etc/NetworkManager/system-connections/ens160.nmconnection 配置&#xff1a; 假设将ip地址改为192.168.200.130 [connection] idens33 uuid0050f214-01a7-395e-…

环形链表2(C++), test ok

1. 题目 2. 思路分析&#xff1a; 与环形链表1一样&#xff0c;我们需要定义慢指针和快指针&#xff0c;确定链表是否有环&#xff0c;如果链表没有环的话&#xff0c;直接置空即可。如果链表有环&#xff0c;则需要向环形链表1一样&#xff0c;让快指针不断追赶慢指针&#x…

汽车电子零部件(4):行泊一体ADAS

前言: 现阶段智能汽车行业正在大规模力推无限接近于L3的L2++或L2.9自动驾驶量产落地,类似于当初智能手机替换传统手机的行业机会期。智能汽车常见的智能驾驶功能包括: 行车场景:自适应巡航控制ACC;自动变道辅助ALC;交通拥堵辅助TJA;车道居中LCC;领航辅助NOA; 泊车场…

每日一练:LeeCode-3、无重复字符的最长子串【滑动窗口+双指针】

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为无…

YOLOv9改进策略:注意力机制 | EMA:基于跨空间学习的高效多尺度注意力,效果优于ECA、CBAM、CA

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;加入EMA注意力&#xff0c;一种基于跨空间学习的高效多尺度注意力&#xff0c;效果优于ECA、CBAM、CA等经典注意力。 yolov9-c-EMA summary: 970 layers, 51011154 parameters, 51011122 gradients, 238.9 GF…

JavaScript 基础知识

一、初识 JavaScript 1、JS 初体验 JS 有3种书写位置&#xff0c;分别为行内、内部和外部。 示例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"wid…

pytorch 入门基础知识二(Pytorch 02)

一 微积分 1.1 导数和微分 微分就是求导&#xff1a; %matplotlib inline import numpy as np from matplotlib_inline import backend_inline from d2l import torch as d2l def f(x):return 3 * x ** 2 - 4 * x 定义&#xff1a; 然后求 f(x) 在 x 1 时的导数&#xff…

请简述Redis集群的工作原理。Redis集群如何保证数据的一致性?Redis集群中,当某个节点出现故障时,如何处理?

请简述Redis集群的工作原理。 Redis集群的工作原理主要依赖于数据分片和主从复制机制&#xff0c;以实现横向扩展和高可用性。以下是Redis集群工作原理的简要概述&#xff1a; 数据分片&#xff1a; Redis集群将数据划分为16384个哈希槽&#xff08;hash slot&#xff09;。 …

接口测试之文件下载

在工作中对于下载接口&#xff0c;经常会有这样的疑问&#xff1a;这类接口一般功能比较稳定&#xff0c;但是又比较重要&#xff0c;需要占用回归测试时间&#xff0c;有没有可替代的方式&#xff1f; 答案肯定是有的&#xff0c;可以从接口测试/UI自动化测试介入&#xff0c…

Postman-Installation has failed

如图&#xff1a; 解决方法&#xff1a; 打开文件夹 Postman-win64-Setup 点击Postman.exe 即可

测试开发 - 面经 - 得物青训营

面前准备&#xff1a; 自我介绍 省略具体技术栈&#xff0c;侧重数据筛选部分以及数据可视化 实习经历简单表述 反问环节 对于测试开发的岗位认知还有些模糊&#xff0c;想问下这个岗位工作中的具体内容&#xff0c;以及常用的技术或者工具 想请教下对于测试开发岗未来的…

c语言的字符串函数详解

文章目录 前言一、strlen求字符串长度的函数二、字符串拷贝函数strcpy三、链接或追加字符串函数strcat四、字符串比较函数strcmp五、长度受限制字符函数六、找字符串2在字符串1中第一次出现的位置函数strstr七、字符串切割函数strtok&#xff08;可以切割分隔符&#xff09;八、…

【C语言】分支语句(逻辑运算符与关系运算符)

文章目录 **逻辑运算符(&&、||、!)**逻辑运算符特点短路短路-逻辑与短路-逻辑或 **关系运算符&#xff08;relational expression&#xff09;**运算操作符的结合律、运算符 **选择结构/分支结构****if 语句****复合句的if语句(if...else..语句)****不良风格的程序** *…

uniapp 之 实现商品详情的锚点跳转(类似京东商品详情-点击顶部按钮跳转的对应的页面的内容区域)

类似京东商品详情-点击顶部详情跳转到页面对应的详情区域&#xff0c;点击评价跳转到页面对应的评价区域等。 照例&#xff0c;先封装方法&#xff1a; 封装方法 util.js /*** 锚点跳转&#xff08;如&#xff1a;商品详情页面跳转&#xff09;* param {string} targetId 目…

sqllab第十八关通关笔记

知识点&#xff1a; UA注入 不进行url解析&#xff0c;不能使用 %20 编码等操作出现在User-agent字段中一般为insert语句 insert 表名(字段1&#xff0c;字段2&#xff0c;。。。) values(数据1&#xff0c;数据2&#xff0c;。。。) 通过admin admin进行登录发现页面打印出了…

【中等】保研/考研408机试-二叉树相关

目录 一、基本二叉树 1.1结构 1.2前序遍历&#xff08;注意三种遍历中Visit所在的位置&#xff09; 1.2中序遍历 1.3后序遍历 二、真题实战 2.1KY11 二叉树遍历&#xff08;清华大学复试上机题&#xff09;【较难】 2.2KY212 二叉树遍历二叉树遍历&#xff08;华中科技大…

通信信号处理中的调制识别技术及其基于C++ Qt的实现

在现代通信系统中,调制技术扮演着至关重要的角色。调制是将基带信号转换为适合在信道中传输的高频信号的过程。常见的模拟调制方式有幅度调制(AM)和频率调制(FM),数字调制方式有频移键控(FSK)和相移键控(PSK)。为了实现高效、可靠的通信,接收端必须能够准确识别发送端所采用的调…

详解命令docker run -d --name container_name -e TZ=Asia/Shanghai your_image

docker run 是Docker的主要命令&#xff0c;用于从镜像启动一个新的容器。下面详细解释并举例说明 -d, --name, -e TZ 参数的用法&#xff1a; -d 或 --detach&#xff1a; 这个标志告诉Docker以守护进程&#xff08;后台&#xff09;模式运行容器。这意味着当你执行 docker ru…

前端学习笔记|JavaScript基础

JS基础 数据类型 基于动力节点视频。 Number、String、Boolean、object 强制转换 Number 强转,boolean强转(undefined、null、NaN都是转成false)&#xff0c;String强转 myAge Number("123445"); Boolean(0); String(123);parseInt、parseFloat 遇到非数字&…