网络编程
本机,本地通信:如前面说的管道/信号通信;
open system interconnect
1、OSI 模型 ===》开放系统互联模型 ==》分为7层: (协议,双方约定的) (OSI/TCP模型,网络编程必问)
理想模型 ==》尚未实现
tftp
b /etc/passwd
a /etc/123
应用层 (如a.out等,)
表示层 加密解密 gzip (密钥)
会话层 网络断开,连接状态,keep-close keep-alive
传输层tcp udp 协议 文件 视频,音频(tcp:保证可靠性,可延迟一点,不能丢包,丢包就会出现延迟(如:VNC软件);udp:(如无人机)要求实时传输,可以少量丢包;)
网路层ip NAT (ip地址:如何找到对方;以及如何让对方找到你)
链路层 交换机 数据的格式化 帧 校验(帧:多个字节组成的,数据打包,一帧即一包;校验:数据不对,直接丢弃。交换机:(如24口),这24个口,平级关系,里面有个ARM芯片,交换机是一个嵌入式设备。实时全双工通信、并发)
物理层 100Mb/8 Gbits 100MB 同轴电缆 10Gb 2.4G 5G (下层给上一层服务,提供基础)网线:8根线,每2根拧成一组;6类拧的麻花状更密。(网线传输:百米;目标距离较远时,用光纤);光猫:光信号(亮灭)转成电信号(高低电平)。同轴电缆:如广电的有线电视;既可以传模拟信号(电视节目),也可以数字信号(上网)。无线局域网:(4G/5G,网络);RFC,机械标准:如网口/水晶头标准。
TCP/IP模型 ==》网际互联模型 ==》分为4层:(一般无特殊说明,就用这个)
实用模型 ===》工业标准
tcp/ip协议栈(即TCP/IP模型)
应用层 ====》应用程序
传输层 ====》端口号tcp udp
网络层 ====》IP 地址
接口层 ====》网卡 驱动 1GB
pcap ,,,
2、TCP/IP协议族:
www.taobao.com ---> 192.168.0.19(DNS协议,将网址转成域名,一个省有一个DNS服务器;DNS分等级,以省为单位,国家,州)
www.voa.com vpn
dns 域名解析(如:翻墙)
DHCP(自动主机配置协议,作用:配置dns服务器)
应用层: HTTP TFTP FTP SNMP DNS ...(HTTP:网络协议;TFTP:短距离文件传输(局域网);FTP:长距离文件传输,支持断电续传;)
传输层: TCP UDP 56k猫(TCP:保证可靠传输,丢包重传;UDP:用户数据报协议,允许少量丢包,保证实时性;)
网络层: IP ICMP(ping) RIP OSPF IGMP ...(IP协议:功能:通过IP地址找到主机,寻找主机;ICMP:测试网络是否通,ping命令;无线路由相关协议:(RIP:最短路径;OSPF:最佳路径))
(网络)接口层: ARP(地址转换:IP地址转换成mac) RARP(逆向地址转换,mac地址转IP地址) ... ip--->mac(ip地址,mac地址(全球唯一):如交换机通过IP地址将数据分发给不同的mac地址的电脑)
arp,,,,
192.160.0.112
========================================================
TCP编程基础知识:
1、网络基础 ===》A B C D E 类
010 3333344444
IP地址 == 网络位 + 主机位 (网络号:类似固话的区号;)
IP地址的分类: 点分十进制 ipv4 712934(ipv4,即点分成4段,无符号int,范围42亿;ipv6正在发展阶段,还未全面使用,ipv4->ipv6,需要换网络设备,设备不兼容)
A类: 超大规模性网络(第一段固定)
8 8 8 8
1.0.0.0 - 126.255.255.255 126.1.1.1
126.1.1.2
255.0.0.0
私有:
10.0.0.0 - 10.255.255.255
127.0.0.1
B类: 大中规模型网络(前2段固定)
128.0.0.0 - 191.255.255.255
128.2.1.2 128.2.7.2
255.255.0.0
私有:
172.16.0.0 - 172.31.255.255
C类: 中小规模型网络(前3段固定,前三段是网络号,最后一段代表一个主机:实际可放100台电脑左右)
192.0.0.0 - 223.255.255.255
255.255.255.0
私有:
192.168.0.0 - 192.168.255.255
静态路由
192.168.0.0
192.168.0.1 网关(本网段中最小的,是网关的地址)
192.168.0.255 0 -255,最多链接255个设备
D类: 组播和广播(组播:类似于网络群聊,一人发,指定的一个组的人可收;广播:一个人发,所有人必须收)
224.0.0.0 - 239.255.255.255
192.168.0.255 == 255.255.255.255
235.1.2.3
192.168.1.0
192.168.0.1 网关(
192.168.1.255 广播 ,广播地址(同一个一个网络下,最大的)
E类: 实验
240.0.0.0 - 255.255.255.255
C 类网络:
ip地址的前三组是网络地址,第四组是主机地址。
二进制的最高位必须是: 110xxxxx开头
十进制表示范围: 192.0.0.0 -223.255.255.255
默认网络掩码: 255.255.255.0
网络个数: 2^24 个 约 209 万个
主机个数: 2^8 个 254 个+2 ===》1 是网关 1是广播
私有地址: 192.168.x.x 局域网地址。
sudo vim /etc/network/interfaces (网络配置文件)
sudo /etc/init.d/networking restart
单机上网的配置:
1、有网络接口并插入网线。
2、有ip地址
3、配置网络设置 (ifconfig,查看连接网络的设备的IP地址)
ip: ifconfig ethX X.X.X.X/24 up ifconfig ens33 192.168.0.13/24 up 255.255.255.0
网关: route add default gw x.x.x.x
DNS: vi /etc/resolv.conf ==>nameserver 8.8.8.8
测试:ping www.baidu.com
netstat -anp (查看Linux中连接网络的应用,相当于流量监控)
2、网络接口
socket(直译为:插座) ,套接字(1.网络设备打开的文件描述符;2.网路通信的接口函数)
1、socket 套接字 ==》BSD socket ==》用于网络通信的一组接口函数。socket api application interface
2、ip+port 地址+端口===》地址用来识别主机
端口用来识别应用程序(不同的应用有不同的端口号,进程号)
port分为TCP port / UDP port 范围都是: 1-65535(端口号的范围)
约定1000 以内的端口为系统使用。(系统级别的端口号)
http 80 www.baidu.com
3306
telnet 21 (21/21,远程登陆协议)
ssh 22
3、网络字节序 ===》大端存储(网络设备用大端存储);需要转换的有:IP和端口。
12 00 小端 0x12345678 (小端存储:低数据位存放在内存低位;电脑为小端存储,运算速度比大端快一点)
00 12
192.168.0.12
12.0.168.192
4.服务器端:(一个)
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
4.1 创建套接字描述符
int socket(int domain, int type, int protocol);
功能:程序向内核提出创建一个基于内存的套接字描述符
参数:domain 地址族,PF_INET == AF_INET ==>互联网程序
PF_UNIX == AF_UNIX ==>单机程序
type 套接字类型:
SOCK_STREAM 流式套接字 ===》TCP
SOCK_DGRAM 用户数据报套接字===>UDP(不稳定)
SOCK_RAW 原始套接字 ===》IP(一般做网络工具会用)
protocol 协议 ==》0 表示自动适应应用层协议。(一般都写0)
返回值:成功 返回申请的套接字id
失败 -1;
4.2、关联接口
int bind(int sockfd, struct sockaddr *my_addr,socklen_t addrlen); (服务端必须调bind,客户端:可选调(除非特别指定客户端的端口号时))
功能:如果该函数在服务器端调用,则表示将参数1相关的文件描述符文件与参数2 指定的接口地址关联,用于从该接口接受数据。
如果该函数在客户端调用,则表示要将数据从
参数1所在的描述符中取出并从参数2所在的接口
设备上发送出去。
注意:如果是客户端,则该函数可以省略,由默认
接口发送数据。
参数:sockfd 之前通过socket函数创建的文件描述符,套接字id (sockfd)
my_addr 是物理接口的结构体指针。表示该接口的信息。
struct sockaddr 通用地址结构
{
u_short sa_family; 地址族
char sa_data[14]; 地址信息
};
转换成网络地址结构如下:
struct _sockaddr_in ///网络地址结构
{
u_short sin_family; 地址族 (一般是和接口函数调用的地址族相同)
u_short sin_port; ///地址端口
struct in_addr sin_addr; ///地址IP
char sin_zero[8]; 占位
};
struct in_addr (结构体套结构体,为了兼容老代码) (通用地址结构体,互联网地址结构体)
{
in_addr_t s_addr;
}
socklen_t addrlen: 参数2 的长度。
返回值:成功 0
失败 -1;
(UDP收发数据时是无连接的)
4.3、监听
int listen(int sockfd, int backlog);
功能:在参数1所在的套接字id上监听等待链接。
参数:sockfd 套接字id
backlog 允许链接的个数。
返回值:成功 0
失败 -1;
4.4、int accept(int sockfd, struct sockaddr *addr,
socklen_t *addrlen);
功能:从已经监听到的队列中取出有效的客户端链接并接入到当前程序。
参数:sockfd 套接字id
addr 如果该值为NULL ,表示不论客户端是谁都接入。
如果要获取客户端信息,则事先定义变量
并传入变量地址,函数执行完毕将会将客户端
信息存储到该变量中。
addrlen: 参数2的长度,如果参数2为NULL,则该值
也为NULL;
如果参数不是NULL,&len;
一定要写成len = sizeof(struct sockaddr);
返回值:成功 返回一个用于通信的新套接字id;
从该代码之后所有通信都基于该id
失败 -1;
4.5、接受函数:/发送函数:
read()/write () ///通用文件读写,可以操作套接字。
recv(,0) /send(,0) ///TCP 常用套机字读写
recvfrom()/sendto() ///UDP 常用套接字读写
ssize_t recv(int sockfd, void *buf, size_t len,int flags);
功能:从指定的sockfd套接字中以flags方式获取长度
为len字节的数据到指定的buff内存中。
参数:sockfd
如果服务器则是accept的返回值的新fd
如果客户端则是socket的返回值旧fd
buff 用来存储数据的本地内存,一般是数组或者动态内存。
len 要获取的数据长度
flags 获取数据的方式,0 表示阻塞接受。
返回值:成功 表示接受的数据长度,一般小于等于len
失败 -1;
6、close() ===>关闭指定的套接字id;
===================================================
客户端:
1、int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:该函数固定有客户端使用,表示从当前主机向目标主机发起链接请求。
参数:sockfd 本地socket创建的套接子id
addr 远程目标主机的地址信息。
addrlen: 参数2的长度。
返回值:成功 0
失败 -1;
2、int send(int sockfd, const void *msg,
size_t len, int flags);
功能:从msg所在的内存中获取长度为len的数据以flags
方式写入到sockfd对应的套接字中。
参数:sockfd:
如果是服务器则是accept的返回值新fd
如果是客户端则是sockfd的返回值旧fd
msg 要发送的消息
len 要发送的消息长度
flags 消息的发送方式。
返回值:成功 发送的字符长度
失败 -1;