Linux网络编程

1.网络基础

1.OSI七层模型

介绍:OSI模型: open system interconnect 理论模型 1977 国际标准化组织 各种不同体系结构的计算机能在世界范围内互联成网。

复制代码
应用层:要传输的数据信息,如文件传输,电子邮件等
表示层:数据加密,解密操作,压缩,解压缩
会话层:建立数据传输通道
传输层:传输的方式 UDP TCP 端口号
网络层:实现数据路由 路由器 ip
数据链路层:封装成帧,点对点通信(局域网内通信),差错检测 交换机 ARP
物理层:定义物理设备标准,比如网线,光纤等传输介质 比特流 bit 0 1
2. TCP/IP模型
(1)4层模型
复制代码
应用层(应用层、表示层、会话层):
    HTTP:超文本传输协议
    HTTPS:超文本传输协议(加密)
    FTP :文件传输协议
    TFTP:简单文件传输协议
    MQTT:消息队列遥测传输协议(物联网)
    DNS :域名解析服务(www.baidu.com--->IP:将域名转换成IP地址)
    自定义协议
传输层:
    UDP:用户数据报协议
    TCP:传输控制协议
网络层:
    IP协议
    IPv4/IPv6
网络接口层(数据链路层、物理层):
    ARP:地址解析协议(IP地址转MAC地址)
    RARP:逆地址解析协议(MAC地址转IP地址)
(2)5层模型
复制代码
应用层(应用层、表示层、会话层):
传输层:
网络层:
数据链路层:
物理层:
3. IP协议
  • IP地址 :192.168.0.103 网络位+主机位
  • 子网掩码:255.255.255.0
  • 网络位(网段):表示当前主机所在的网段。子网掩码为1的位为网络位
  • 主机位:是当前网段的第几台主机。子网掩码为0的位为主机位
  • 网段号:192.168.0

IP地址的划分:
(1)A类地址:
范围:1.0.0.0 - 126.255.255.255
子网掩码:255.0.0.0 126*2^24
用于管理大规模网络
私有IP地址:10.0.0.0 - 10.255.255.255
127.0.0.0 回环地址
(2)B类地址:
范围:128.0.0.0 - 191.255.255.255
子网掩码:255.255.0.0 2^16
管理大中规模网络
私有IP地址:172.16.0.0 - 172.31.255.255
(3)C类地址:
范围:192.0.0.0 - 223.255.255.255
子网掩码:255.255.255.0 2^8
管理中小规模网络
私有IP地址:192.168.0.0 - 192.168.255.255
(4)D类地址:
224.0.0.0 - 239.255.255.255
组播和广播使用
(5)E类地址:
240.0.0.0 - 255.255.255.254
用来进行实验
公有IP:由电信公司直接分配,并需要付费的IP地址, 可以直接访问internet
私有IP:不能直接访问internet的ip地址

4. 端口号

端口号:区分同意主机上的不同网络进程,16位的数值 0-65535
分类:
(1)任何TCP/IP实现所提供的服务都用1-1023之间的端口号。
http : 80、8080
FTP: 20/21
TFPT: 69
HTTPS: 443
MQTT :1883
(2)端口号从1024-49151是被注册的端口号,被IANA指定为特殊服务使用。
(3)从49152-65535是动态或私有端口号。

5. 网络协议栈

2. 网络命令

  • ifconfig :查看Linux下主机的IP地址相关信息

  • ipconfig:查看windows下主机的IP地址相关信息

  • ping IP地址/域名:检查当前主机和目标主机是否网络联通

3.UDP****协议

UDP(user datagram protocol) :用户数据报协议(传输层协议)

1. C/S和B/S模型

网络编程模型:
C/S:Client/Server 客户端/服务器

  • 客户端是一个专用客户端
  • 客户端和服务端程序都需实现
  • 客户端和服务端都可以保存资源

B/S: Browser/Server 浏览器/服务器

  • 客户端是一个通用的客户端,只需要维护服务端
  • 一般都是用HTTP协议
  • 主要资源都在服务
2. UDP的特点
  • 面向数据包
  • 不需要建立连接
  • 尽最大可能交付,不安全不可靠
  • UDP机制简单,实时性高,效率高
3. UDP编程

流程:


套接字:系统为应用层提供的网络通信端口,本质是文件描述符
创建套接字:socket

复制代码
int socket(int domain, int type, int protocol);
功能:创建一个套接字
参数:
domain:使用的协议族
    AF_INET: IPv4
    AF_INET6:IPv6
type:传输方式
    SOCK_STREAM :TCP
    SOCK_DGRAM:UDP
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);
功能:发送UDP的数据包
参数:
sockfd:套接字
buf:发送数据的首地址
len:发送的字节数
flags:0 默认方式发送
dest_addr:接收方(服务端)的地址信息的指针
addrlen:接收方地址的大小
返回值:
成功:实际发送的字节数
失败:-1

主机字节序转网络字节序short类型:htons

复制代码
主机字节序:小端 host
网络字节序:大端 network
uint32_t htonl(uint32_t hostlong); 主机转网络
uint16_t htons(uint16_t hostshort); 主机转网络
uint32_t ntohl(uint32_t netlong); 网络转主机
uint16_t ntohs(uint16_t netshort); 网络转主机
h:host
n:net
l:long
s:short

将字符串IP地址转成整形ip地址:inet_addr

复制代码
in_addr_t inet_addr(const char *cp);
功能:将字符串IP地址转换成二进制IP地址形式
char *inet_ntoa(struct in_addr in);
功能:将二进制ip转换成字符串

绑定地址信息:bind

复制代码
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:绑定套接字和主机的IP、端口号
参数:
sockfd:套接字
addr:当前主机的地址信息的变量指针
addrlen:地址变量的大小
返回值:
成功:0
失败:-1

接收UDP数据recvfrom

复制代码
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
功能:从UDP套接字接收数据
参数:
sockfd:套接字
buf:存储数据的空间首地址
len:希望接收到的数据长度
flags:0 默认方式
src_addr:保存发送方地址的变量指针
addrlen:保存地址的变量大小的指针
返回值:
成功:返回实际收到的字节数
失败:-1
4. UDP头部