Linux学习-网络UDP

网络

数据传输,数据共享

网络协议模型

OSI协议模型

应用层 实际发送的数据

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

会话层 是否建立会话连接

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

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

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

物理层 物理介质的连接

TCP/IP协议模型

应用层 传输的数据

传输层 传输的方式

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

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

应用层:

HTTP 超文本传输协议

HTTPS

FTP 文件传输协议

TFTP 简单文本传输协议

SMTP 邮件传输协议

MQTT 物联网交互

TELNET 远程登陆协议

..

传输层:

UDP 用户数据报协议 。 不会对接收ip是否可以接受进行核验,直接发送。是否收到数据也不知道。

特点:

1.实现机制简单

2.资源开销小

3.不安全不可靠

TCP 传输控制协议 在通信之前进行三次握手。发送请求应答信号SYN。收到后回复ACK+SYN确认应答并请求对方应答。对方在发ACK应答,保证双方都是收发通讯正常。

数据发出后,对方没有接收完整,返回ACK告知发送方自己接受多少数据,然后发送方会再次进行缺失数据的发送以保证数据完整。

还可以进行流量控制。

关闭实现四次挥手,等待数据传输完毕才可以关闭

特点:

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

用于实验

UDP编程

socket套接字编程:

1.发端:

socket

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

功能:

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

参数:

domain:使用的协议族 AF_INET (IPv4协议族) 还有其他协议组,可在手册中查看。

type:套接字类型

SOCK_STREAM:流式套接字 tcp

SOCK_DGRAM:数据报套接字 udp

SOCK_RAW:原始套接字 协议

protocol:协议

默认为0

返回值:

成功返回文件描述符

失败返回-1

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:目的地址的长度(就是dest_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 */

};

这是ipv4的协议结构体,要转换乘通用的要强制转化(struct sockaddr *)

/* 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()

1.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

如果要接收收据要加上

ssize_t recv_len;

socklen_t len;

len = sizeof(s);

recv_len = recvfrom(sco_num, b, sizeof(b), 0, (struct sockaddr *)&s, &len);

传长度指针,是因为当接受完了之后,该指针指向的值会改正真正结收的地址的大小

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

点击"虚拟机"

点击"设置"

点击"网络适配器"

选择"桥接模式"

点击"确定"

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

点击"编辑"

点击"虚拟网络编辑器"

点击"更改设置"

4.在Ubuntu中重启网络服务

sudo /etc/init.d/networking restart

ifconfig

2.bind

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

socklen_t addrlen);

功能:

在套接字上绑定一个IP地址和端口号,只能绑定自己的IP地址

参数:

sockfd:套接字文件描述符

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

addrlen:绑定IP地址的长度

返回值:

成功返回0

失败返回-1

3.UDP编程:

发端:socket -> sendto -> close

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

练习:

编写程序实现两台主机间传输一个文件

./recv

./send

a.txt

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

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

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

3.UDP是不安全不可靠的,连续且快速的传输数据容易产生数据丢失

5.wireshark

抓包工具

操作流程:

1.sudo wireshark

打开wireshark抓包工具

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

any

3.执行通信的代码

4.停止通信

5.设定过滤条件

ip.addr == IP地址

udp

tcp

udp.port == 端口

6.UDP包头长度:8个字节

源端口号(2个字节)

目的端口号(2个字节)

长度(2个字节)

校验和(2个字节)

相关推荐
一刀到底211几秒前
从实列中学习linux shell12 通过Shell脚本来优化MySQL数据库性能,特别是慢SQL跟踪和索引优化
linux·数据库·shell
小猪佩奇TONY15 分钟前
OpenGL-ES 学习(10) ---- OpenGL-ES Shader语言语法
学习
海尔辛23 分钟前
学习黑客开源情报
学习
李匠202438 分钟前
C++负载均衡远程调用学习之订阅功能与发布功能
c++·学习
ephemerals__40 分钟前
【Linux】深入理解程序地址空间
linux·运维·服务器
李匠202442 分钟前
C++负载均衡远程调用学习之上报功能与存储线程池
c++·学习
吴声子夜歌1 小时前
Linux运维——Vim技巧一
linux·运维·vim
JhonKI1 小时前
【Linux网络】I/O多路转接技术 - epoll
linux·运维·网络·tcp/ip
小虎卫远程打卡app1 小时前
视频编解码学习三之显示器
学习·计算机外设·视频编解码
伤不起bb1 小时前
Nginx 核心功能之正反代理
linux·服务器·nginx