这里写目录标题
网络
网络:进程间通信(不同主机)
1.主机1和主机2物理层互联互通
2.主机1和主机2软件层面互联互通
网络协议
网络协议:OSI七层模型
应用层:要传输的数据信息,如文件传输,电子邮件等
表示层:数据加密,解密操作,压缩,解压缩
会话层:建立数据传输通道
传输层:传输的方式 UDP TCP 端口号
网络层:实现数据路由 路由器 ip
数据链路层:封装成帧,点对点通信(局域网内通信),差错检测 交换机 ARP协议
物理层:定义物理设备标准,比如网线,光纤等传输介质 比特流 bit 0 1
ARP:地址解析协议(数据链路层)
MAC:硬件地址
TCP/IP模型: 工业模型
4层
应用层:HTTP、HTTPS、FTP、TFTP、MQTT
传输层:TCP、UDP
网络层:IP
网络接口层:网络接口层既是传输数据的物理媒介,也可以为网络层提供一条准确无误的线路
5层
应用层:HTTP、HTTPS、FTP、TFTP、MQTT
传输层:TCP、UDP
网络层:IP
数据链路层:封装成帧,点对点通信(局域网内通信),差错检测 交换机
物理层:定义物理设备标准,比如网线,光纤等传输介质 比特流 bit
协议
协议:
应用层协议:
FTP:文件传输协议(实现文件上传/下载)
TFTP:简单文件传输协议(实现文件上传/下载)
HTTP:超文本传输协议(实现超文本(集视频、图片、文字于一体的文件类型)传输)
HTTPS:加密版超文本传输协议
MQTT:消息队列遥测传输协议(物联网传输)
传输层协议:
UDP:用户数据报协议
1.面向数据包,无需建立连接
2.不安全、不可靠(可能存在数据的丢失和乱序),尽最大可能交付。
3.实时性好
4.机制简单 占用资源少
TCP:传输控制协议(流式套接字)
1.建立(面向)连接
2.面向数据流
3.安全、可靠
4.机制复杂、资源开销较大
TCP传输时有粘包问题
粘包问题解决方案:
1.发送指定大小(每次发送多少则收多少)
适用于:通信时,字节大小始终固定的场景
2.通信协议可边长
自定义协议(应用层)
网络层:
IP协议:
192.168.1.128
IPv4 32位
IPv6 128位
网络相关命令
1.ifconfig
2.ping ip 地址/域名
查看网络是否连通
dns(域名解析服务)
网络编程模型
C/S模型: client----->server 专用的客户端
B/S模型 : browesr ---->server 通用的客户端
UDP(用户数据报):
传输层协议
网络套接字:文件描述符 为应用层提供的端口
客户端:----------------------------服务端
创建套接字: socket()--------------------------socket()
sendto()--------------------------bind()绑定自己的身份:IP+端口号(区分进程)
recvfrom()------------------------recevfrom()
close()---------------------------sendto()
------------------------------------close()
1.socket
int socket(int domain, int type, int protocol);
功能:创建通信网络套接字
参数:
domain:使用ip的协议
AF_INET IPv4
AF_INET6 IPv6
type:传输层的协议类型
SOCK_STREAM:流式套接字,使用 TCP 协议(面向连接、可靠的)
SOCK_DGRAM:数据报套接字,使用 UDP 协议(无连接、不可靠的)
SOCK_RAW:原始套接字,用于直接访问网络层
protocol(协议):
通常设置为 0,表示使用默认协议(与 type 配合使用)
返回值:
成功时:返回一个非负整数,表示套接字的文件描述符。
失败时:返回 -1,并设置 errno
2.sendto
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
功能:向一个IP地址和端口发送数据信息
端口号:区分一台主机不同的应用程序(0-65535)
参数:
sockfd:套接字文件描述符,表示一个已经创建的套接字。这个套接字通常是通过 socket() 函数创建的,并且需要绑定到一个本地地址(对于 UDP)
buf:指向要发送数据的缓冲区的指针,数据从这个缓冲区中读取
len:要发送的数据的长度,以字节为单位。这个值通常是 buf 中数据的实际长度
flags:用于控制发送行为的标志。常用的标志有:
0:默认值,表示正常发送。
MSG_CONFIRM:要求确认数据的传输。
MSG_DONTROUTE:发送数据时绕过路由表
dest_addr:指向一个 sockaddr 结构体的指针,指定目标地址。对于 UDP 套接字,这个参数是必须的,它包含目标主机的 IP 地址和端口号。
addrlen:dest_addr 参数所指向的地址结构体的长度,以字节为单位。通常是 sizeof(struct sockaddr_in) 或 sizeof(struct sockaddr_in6),具体取决于使用的地址族(IPv4 或 IPv6)。
struct sockaddr 通用地址类型
struct sockaddr_in IPv4地址类型
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 */
};
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
3.htons
htons(主机转网络字节序)
h:host(主机)
n:net(网络)
uint32_t htonl(uint32_t hostlong); 主机转网络
uint16_t htons(uint16_t hostshort); 主机转网络
uint32_t ntohl(uint32_t netlong); 网络转主机
uint16_t ntohs(uint16_t netshort); 网络转主机
4.inet_addr
in_addr_t inet_addr(const char *cp);
功能:
将字符串IP地址转换成二进制IP地址形式
5.inet_ntoa
char *inet_ntoa(struct in_addr in);
功能:将二进制ip转换成字符串
6.bind
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:将一个套接字与IP地址和端口号绑定(只能绑定自己的IP地址)
参数:
sockfd:已经创建并可能已经连接的套接字描述符,通常是 socket() 函数的返回值
addr:指向一个 sockaddr 结构体的指针,包含了要绑定的本地地址信息。这个结构体可以是 sockaddr_in 或者 sockaddr_in6,具体取决于你想要绑定的地址类型(IPv4 或 IPv6)
addrlen:指定 my_addr 参数所指向的地址结构体的大小,以字节为单位。这是必需的参数,因为 my_addr 结构体的类型可能不同,所以需要确切的大小信息
返回值:
成功: 0
失败: -1并设置全局变量 errno 以指示错误类型。通常的错误有
EADDRINUSE:指定的地址已经在使用中。
EBADF:sockfd 不是一个有效的套接字文件描述符。
EACCES:不具有执行 bind 的权限。
EADDRNOTAVAIL:指定的地址在当前网络配置下不可用。
EINVAL:指向无效的 sockaddr 地址
7.recvfrom
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
功能:接收网络发送的数据信息
参数:
sockfd:套接字文件描述符。通常是通过 socket() 创建的
buf:指向存储接收到数据的缓冲区的指针
len:缓冲区的大小,以字节为单位。它指定 buf 缓冲区的最大接收数据量
flags:用于指定接收操作的选项。常用的标志有
0:默认操作。
MSG_PEEK:从队列中读取数据但不移除。
MSG_WAITALL:等待接收到指定数量的数据
src_addr:指向 sockaddr 结构体的指针,用于存储数据来源的地址信息。如果不需要获取源地址,可以传递 NULL
addrlen:指向 socklen_t 类型的变量的指针,用于传递和接收地址结构体的大小。传入时指定地址结构体的大小,返回时将实际接收到的地址结构体大小存储在该变量中
网络字节序:大端
主机字节序:小端
网络抓包
工具:wireshark
1.抓取通过网卡的数据
2.网络数据调试和分析
TCP协议
1.建立连接 —>三次握手
2.断开连接------>四次挥手
TCP编程
客户端
1.socket
2.connect
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:发送三次握手链接请求
参数:
1.sockfd:套接字文件描述符
2.addr:存放目的地址空间首地址
3.addrlen:目的地址长度
返回值:
成功返回0
失败返回-1
3.send
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:
发送数据
参数:
1.sockfd:套接字文件描述符
2.buf:存放数据空间首地址
3.len:数据长度
4.flag:属性默认为0
返回值:
成功返回发送字节数
失败返回-1
recv
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:
接收数据
参数:
1.sockfd:套接字文件描述符
2.buf:存放数据空间首地址
3.len:最多接收数据长度
4.flags:接收属性默认为0
返回值:
成功返回实际接收字节数
失败返回-1
连接断开,recv不再阻塞,返回0
close
服务端
socket
bind
listen
int listen(int sockfd, int backlog);
功能:
监听三次握手链接请求
参数:
sockfd:套接字文件描述符
backlog:最多允许等待尚未处理的三次握手链接个数
返回值:
成功返回0
失败返回-1