Linux 网络编程
网络:不同主机,实现进程间通信
1.网络基础
1.OSI七层模型
OSI模型:open system interconnect 理论模型1977国际标准化组织 各种不同体系结构的计算机能在世界范围内互联成网。
应用层:要传输的数据信息,如文件传输,电子邮件等 表示层:数据加密,解密操作,压缩,解压缩
会话层:建立数据传输通道
传输层:传输的方式 UDP TCP 端口号
网络层:实现数据路由 路由器 ip
数据链路层:封装成帧,点对点通信(局域网内通信),差错检测 交换机 ARP
物理层:定义物理设备标准,比如网线,光纤等传输介质 比特流 bit 0 1
2.TCP/IP模型
4层模型
应用层(应用层、表示层、会话层):
HTTP:超文本传输协议
HTTPS:超文本传输协议(加密)
FTP :文件传输协议
TFTP:简单文件传输协议
MQTT:消息队列遥测传输协议(物联网)
自定义协议
传输层:
UDP:用户数据报协议
TCP:传输控制协议
网络层:
IP协议
IPv4/IPv6
网络接口层(数据链路层、物理层):
ARP:地址解析协议(IP地址转MAC地址)
RARP:逆地址解析协议(MAC地址转IP地址)
5层模型
应用层(应用层、表示层、会话层):
传输层:
网络层:
数据链路层:
物理层:
3.IP协议
IP地址
192.168.0.103 --->点分十进制 ----》人看
IPv4 ---》32位保存的IP地址 11000000 10101000 00000000 01100111
IPv6 ---》128位保存IP地址 -->解决IP地址不够用的问题
192.168.0.103 网络位+主机位
子网掩码:255.255.255.0 1111 1111 1111 1111 1111 1111 0000 0000
网络位(网段):表示当前主机所在的网段。子网掩码为1的位为网络位
主机位:是当前网段的第几台主机。子网掩码为0的位为主机位
网段号:192.168.0
几个特殊的IP地址:
网段号:
IP地址网络位不变,主机位全为0,则为该IP地址的网段号
192.168.1.3
255.255.0.0
192.168.0.0
位于
192.168.1.0 网段内(网段内的IP能直接通信)
广播号:
192.168.0.255
192.168.1.255
IP地址网络位不变,主机位全为1,则为该IP地址的广播号
192.168.1.3
255.255.255.0
广播号:
192.168.1.255(向广播号发送信息,所有局域网内IP都能收到此信息)
feiQ VNC
192.168.1.255
网关地址:
192.168.1.1
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指定为特殊服务使用。
从49152-65535是动态或私有端口号。
3.网络协议栈

2.网络配置
ifconfig :查看Linux下主机的IP地址相关信息
ping IP地址/域名 :检查当前主机和目标主机是否网络联通
PING 192.168.0.103 (192.168.0.103) 56(84) bytes of data.
64 bytes from 192.168.0.103: icmp_seq=1 ttl=128 time=0.353 ms
64 bytes from 192.168.0.103: icmp_seq=2 ttl=128 time=0.402 ms
网络配置:
1. 虚拟机--》设置--》网络适配器---》桥接模式
2. 编辑--》虚拟网络编辑器--》更改设置--》VMnet0设置为桥接模式--》桥接到Windows正在上网的网卡--》应用----》确定
3. 修改配置文件
sudo vim /etc/network/interfaces
auto lo
iface lo inet loopback
auto ens33
iface ens33 inet dhcp
4. 重启网络服务
sudo /etc/init.d/networking restart
3.UDP协议
传输层协议:
UDP(user datagram protocol) :用户数据报协议
1.C/S和B/S模型
网络编程模型:
C/S:Client/Server 客户端/服务器
1. 客户端是一个专用客户端
2. 客户端和服务端程序都需实现
3. 客户端和服务端都可以保存资源
B/S: Browser/Server 浏览器/服务器
1. 客户端是一个通用的客户端,只需要维护服务端
2. 一般都是用HTTP协议
3. 主要资源都在服务端
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
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 */
};
主机字节序转网络字节序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头部
| 源端口号 | 目标端口号 |
| 长度(2字节) | 长度(2字节) |
wireshark抓包工具
作用:抓取当前主机经过网卡的网络数据,从而分析和追踪网络问题
安装:sudo apt-get install wireshark
抓包流程:
-
sudo wireshark
-
选择要抓的网卡---》any
-
选择过滤条件并触发:比如:udp.port == 50000
-
进行一次网络通信
更多推荐




所有评论(0)