嵌入式学习 Day 31

网络:

数据传输,数据共享

1.网络协议模型:

OSI协议模型

应用层 实际发送的数据

表示层 发送的数据是否加密

会话层 是否建立会话连接

传输层 数据传输的方式(数据报、流式)

网络层 数据的路由(如何从一个局域网到达另一个局域网) IP地址

数据链路层 局域网下如何通信

物理层 物理介质的连接

TCP/IP协议模型

应用层 传输的数据

传输层 传输的方式

网络层 数据如何从一台主机到达另一台主机

网络接口层 物理介质的连接

应用层:

HTTP 超文本传输协议(明文)

HTTPS (暗文)

FTP 文件传输协议

TFTP 简单文本传输协议

SMTP 邮件传输协议

MQTT

TELNET

..

传输层:

UDP 用户数据报协议

特点:

1.实现机制简单

2.资源开销小

3.不安全不可靠

TCP 传输控制协议

特点:

1.实现机制复杂

2.资源开销大

3.安全可靠

网络层:

IPv4

IP地址:唯一标识网络中一台主机的标号

IP地址: 网络位 + 主机位

子网掩码: 用来标识IP地址的网络位和主机位

子网掩码是1的部分表示IP地址的网络位

子网掩码是0的部分表示IP地址的主机位

网段号: 网络位不变,主机位全为0,表示网段号

**广播地址:**网络位不变,主机位全为1,表示广播地址

IP地址类型:

A类

1.0.0.0 - 126.255.255.255

子网掩码:255.0.0.0

管理超大规模网络

10.0.0.0 - 10.255.255.255

B类

128.0.0.0 - 191.255.255.255

子网掩码:255.255.0.0

管理大中规模型网络

172.16.0.0 - 172.31.255.255

C类

192.0.0.0 - 223.255.255.255

子网掩码:255.255.255.0

管理中小规模型网络

192.168.0.0 - 192.168.255.255

D类

224.0.0.0 - 239.0.0.0

用于组播

E类

240.0.0.0 - 255.255.255.255

用于实验

2.UDP编程

socket套接字编程:

发端:socket -> sendto -> close

收端: socket -> bind -> recvfrom -> close

1.发端:

socket

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

功能:

创建一个用来通信的文件描述符

参数:

domain:使用的协议族 AF_INET (IPv4协议族)

type:套接字类型

SOCK_STREAM:流式套接字

SOCK_DGRAM:数据报套接字

SOCK_RAW:原始套接字

protocol:协议

默认为0

返回值:

成功返回文件描述符

失败返回-1

注意:socket是全双工的通信,具有收发两个信道

区别于管道(半双工)
sendto

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,

const struct sockaddr *dest_addr, socklen_t addrlen);

功能:

利用套接字向指定地址发送数据信息

参数:

sockfd:套接字文件描述符

buf:发送数据空间首地址

len:发送数据的长度

flags:属性默认为0

dest_addr:目的地址信息存放的空间首地址

addrlen:目的地址的长度

struct sockaddr_in {

sa_family_t sin_family; /* address family: AF_INET */

in_port_t sin_port; /* port in network byte order */

struct in_addr sin_addr; /* internet address */

};

/* Internet address. */

struct in_addr {

uint32_t s_addr; /* address in network byte order */

};

返回值:

成功返回实际发送字节数

失败返回-1
inet_addr:

in_addr_t inet_addr(const char *cp);

功能:

将字符串IP地址转换为内存中的IP地址
htons

uint16_t htons(uint16_t hostshort);

功能:

将本地字节序转换为网络的大端字节序(对于端口号,网络采用的是大端存储,本地采用的是小端存储)

close

2.收端:

recvfrom

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,

struct sockaddr *src_addr, socklen_t *addrlen);

功能:

从套接字中接收数据

参数:

sockfd:套接字文件描述符

buf:存放数据空间首地址

flags:属性 默认为0

src_addr:存放IP地址信息的空间首地址

addrlen:存放接收到IP地址大小空间的首地址

返回值:

成功返回实际接收字节数

失败返回-1

bind

int bind(int sockfd, const struct sockaddr *addr,

socklen_t addrlen);

功能:

在套接字上绑定一个IP地址和端口号

参数:

sockfd:套接字文件描述符

addr:绑定IP地址空间首地址

addrlen:绑定IP地址的长度

返回值:

成功返回0

失败返回-1

3.桥接

1.修改虚拟机到桥接模式:

点击"虚拟机"

点击"设置"

点击"网络适配器"

选择"桥接模式"

点击"确定"

2.将网卡桥接到无线网卡

点击"编辑"

点击"虚拟网络编辑器"

点击"更改设置"

3.在Ubuntu中重启网络服务

sudo /etc/init.d/networking restart

ifconfig

4.wireshark抓包工具

操作流程:

1.sudo wireshark

打开wireshark抓包工具

2.选择抓取数据包的网卡

any

3.执行通信的代码

4.停止通信

5.设定过滤条件

ip.addr == IP地址

udp

tcp

udp.port == 端口

5. UDP需要注意的细节点:

1.UDP是无链接的,发端退出,收端没有任何影响

2.UDP单包发送数据上限,最好不要超过1500个字节

3.UDP是不安全不可靠的,连续且快速的传输数据容易产生数据丢失
4.UDP包头长度:8个字节

源端口号(2个字节)

目的端口号(2个字节)

长度(2个字节)

校验和(2个字节)

3.TCP编程

相关推荐
yufei-coder7 分钟前
C#基础语法
开发语言·c#·.net
长天一色7 分钟前
【ECMAScript 从入门到进阶教程】第三部分:高级主题(高级函数与范式,元编程,正则表达式,性能优化)
服务器·开发语言·前端·javascript·性能优化·ecmascript
yngsqq12 分钟前
031集——文本文件按空格分行——C#学习笔记
笔记·学习·c#
_.Switch19 分钟前
Python机器学习模型的部署与维护:版本管理、监控与更新策略
开发语言·人工智能·python·算法·机器学习
醉颜凉22 分钟前
银河麒麟桌面操作系统修改默认Shell为Bash
运维·服务器·开发语言·bash·kylin·国产化·银河麒麟操作系统
NiNg_1_23427 分钟前
Vue3 Pinia持久化存储
开发语言·javascript·ecmascript
带带老表学爬虫36 分钟前
java数据类型转换和注释
java·开发语言
qianbo_insist38 分钟前
simple c++ 无锁队列
开发语言·c++
zengy539 分钟前
Effective C++中文版学习记录(三)
数据结构·c++·学习·stl
cyt涛1 小时前
MyBatis 学习总结
数据库·sql·学习·mysql·mybatis·jdbc·lombok