apra网
ip:学号 互联网的地址
MAC:身份证号,硬件地址
NAT:地址翻译
ifconfig -a
ping
ARP攻击:
//============网络编程===============
网络协议:网络中各个主机或终端接入互联网锁必须遵循的一种规则
一些代码()
网络协议模型
OSI(Open System Interconnection))模型:OSI是一个理想的模型,没有实现
七层模型:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层
TCP/IP模型:
网络接口与物理层:通过物理接口发送或接受数据
MAC地址:物理上唯一的标示一台主机,48位
MAC地址是网卡决定的,是固定的。 前三个字节是由IEEE的注册管理机构RA负责给不同厂家分配后三个字节由各厂家自行分配
IP和MAC地址这种映射关系由ARP(Address Resolution Protocol,地址解析协议)协议完成。
网络层:寻找对方的主机在哪里(通过路由器),路由器处于网络层
IP地址:逻辑上标示一台主机
ipv4:32位,主机号 + 网络号 (2的32次方)
ipv6:128位
四类:A类 1.0.0.1-127.255.255.254
主机号(1字节) + 网络号(3字节)
B类 172.16.0.0--172.31.255.255
主机号(2字节) + 网络号(2字节)
C类 192.0.1.1-223.255.255.254
主机号(3字节) + 网络号(1字节)
D类 224.0.0.1--239.255.255.255
传输层:保证要传输的数据能够正确无误、无丢失、无重传的发送给对方
端口号:
应用层:产生数据,或显示数据
进程的id,pid
//========TCP/IP======================
TCP/IP协议是一个协议族:有多个协议组成,因为TCP,IP是这个协议族
最重要的两个协议
传输层:
TCP协议(Transmission Control Protocol):传输控制协议
UDP协议(User Datagram Protocol):用户数据报协议
网络层协议:
IP协议(Internet Protocol):网际协议
ICMP协议(Internet Control Message Protocol):网际控制报文协议,
ping命令就是发送的该协议包。
ARP协议:地址解析协议,将IP地址转换为MAC地址
RARP协议:反地址解析协议,将MAC地址转换为IP地址
IGMP协议:
应用层协议
FTP协议:文件传输协议 (自己模拟FTP)
HTTP:超文本传输协议 (解析HTTP协议)
SMTP:简单邮件传输协议
DNS:域名解析协议
SNMP:简单网络管理协议
Telnet:远程登录协议
RTP协议(Real-time Transport Protocol):RTP协议详细说明了在
互联网上传递音频和视频的标准数据包格式,是介于应用层和传输层之
间的一种协议
TCP头:
序号:发送端将数据分段的编号
确认号:接收端告诉发送端下一个应该发送的字节编号
窗口(滑动窗口,滑窗管理):接收方发给发送方,告诉发送方,下一次应该发送
的字节的长度
TCP和UDP的区别
TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高
可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达
的通信)
适用情况:
适合于对传输质量要求较高,以及传输大量数据的通信。
在需要可靠数据传输的场合,通常使用TCP协议
MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议
UDP,是不可靠的无连接的协议。在数据发送前,因为不需要进行连接
,所以可以进行高效率的数据传输,实时性较好,主要用在直播、视频会议
socket:通信接口、文件描述符、函数API
流式套接字(SOCK_STREAM)----->TCP
提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。
数据报套接字(SOCK_DGRAM)----->UDP
提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。
原始套接字(SOCK_RAW)------->协议的开发者
可以对较低层次协议如IP、ICMP直接访问。
IP地址
IPv4:32位
IPv6:128位
点分十进制:192.168.7.10
网络二进制:100010001100 //可以在网络中传输的格式
/*负责点分十进制和网络二进制之间的转换*/
将strptr所指的字符串转换成32位的网络字节序二进制值
#include <arpa/inet.h>
int inet_aton(const char *strptr, struct in_addr *addrptr);
struct in_addr addrptr;//用来保存32位的网络字节序二进制值
inet_aton("192.168.7.10”, &addrptr);
功能同上,返回转换后的地址。
int_addr_t inet_addr(const char *strptr);
int_addr_t addr;//用来保存32位的网络字节序二进制值
addr = inet_addr("192.168.7.10");
//将IPV4/IPV6的地址转换成binary格式
int inet_pton(int af, const char *src, void *dst);
struct in_addr addrptr;
inet_pton(AF_INET, "192.168.7.10", &addrptr);//用于IPV4
inet_pton(AF_INET6, "192.168.7.10", &addrptr);//用于IPV6
//将32位网络字节序二进制地址转换成点分十进制的字符串。
char *inet_ntoa(struct in_addr in);
char buf[50];
stuct in_addr inaddr = func(xxxxx);
printf("ip: %s\n",inet_ntoa(inaddr));
strcpy(buf, inet_ntoa(inaddr));
端口号:16位(1-65535)
为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区别
1-1024: 系统使用
1025-5000:系统保留
5001-65535:用户使用
字节序
大端序:高字节放在低地址,低字节放在高地址 internet
小端序:高字节放在高地址,低字节放在低地址 linux window7
主机字节序到网络字节序
u_long htonl (u_long hostlong);
u_short htons (u_short short);
网络字节序到主机字节序
u_long ntohl (u_long hostlong);
u_short ntohs (u_short short);
//网络编程API
/*创建一个通信接口,得到一个套接字文件描述符*/
//使应用层和网卡底层建立关联,启用网络协议
int socket(int domain, int type, int protocol);
param1:地址族
AF_INET/PF_INET //用于IPV4的互联网通信
AF_INET6/PF_INET6 //用于IPV6的互联网通信
//用于unix套接字,用于同一台主机进程之间通信
AF_UNIX/PF_UNIX/AF_LOCAL/PF_LOCAL
param2:套接字类型
SOCK_STREAM // TCP 流式套接字
SOCK_DGRAM // UDP 数据报式套接字
SOCK_RAW // 开发协议 原始套接字
param3:统一为0
返回值:成功,返回一个文件描述符
失败,返回-1
int sock_fd;//主动套接字,该套接字可以主动的向别的主机发起连接请求
sock_fd = socket(AF_INET, SOCK_STREAM , 0);
/*只有服务器才会调用该函数,为以上的套接字绑定一个IP地址和端口*/
//表示该socket是哪个主机中的哪一个进程所拥有
int bind(int sockfd, struct sockaddr *my_addr, int addrlen) ;
param1:为哪个套接字进行绑定
param2:指定要绑定的是哪一个ip,哪一个端口
param3:存放ip地址和端口的结构体长度
struct sockaddr_in sinfo;
sinfo.sin_family = AF_INET;
sinfo.sin_port = htons(8888);
sinfo.sin_addr.s_addr = inet_addr("192.168.7.10");
bind(sockfd, (struct sockaddr *)&sinfo, sizeof(sinfo)) ;
//通用地址结构
struct sockaddr
{
u_short sa_family; // 地址族, AF_xxx
char sa_data[14]; // 14字节协议地址
};
//ipv4
struct sockaddr_in
{
u_short sin_family; // 地址族, AF_INET,2 bytes
u_short sin_port; // 端口,2 bytes
struct in_addr sin_addr; // 存放网络字节序的IPV4地址,4 bytes
char sin_zero[8]; // 8 bytes unused,作为填充
};
//ipv6
struct sockaddr_in6
{
};
struct in_addr
{
in_addr_t s_addr; // u32 network address
};
struct sockaddr_in {}; //ipv4
struct sockaddr_in6 {};//ipv6
struct sockaddr_un {};//unix套接字
/*将一个套接字设为监听状态,该套接字成为被动套接字,即套接字只能被动接受别的主机的请求,而不能主动连接
别的主机*/
int listen (int sockfd, int backlog);
sockfd:监听连接的套接字
backlog:在同一时刻,能接受的连接请求个数(5-10)
/*1:接收一个新的连接请求,并返回一个新的套接字,为连接套接字,这个套接字代表一个新的连接
* 2:accept会发生阻塞,直到收到一个接连请求为止
* 3:一个accept只能接收一个连接请求,如果要接收多个请求,必须使用循环*/
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) ;
param1:要通过哪一个套接字来接收请求
param2:用来保存发起连接请求的那一端的信息(ip和端口)。
param3:保存结构体长度地址
返回值:
成功:返回一个文件描述符
失败:返回-1
int conn_fd;
conn_fd = accept(sockfd, NULL, NULL) ;
/*进行数据读取*/
read(conn_fd, buf, 100);
/*客户端来调用该函数,用来向服务器发起连接请求*/
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
param1:通过哪个套接字来发送请求
param2:用来保存服务器的信息,也就是要把连接请求发送给ip和端口为指定的那个服务器
ip:学号 互联网的地址
MAC:身份证号,硬件地址
NAT:地址翻译
ifconfig -a
ping
ARP攻击:
//============网络编程===============
网络协议:网络中各个主机或终端接入互联网锁必须遵循的一种规则
一些代码()
网络协议模型
OSI(Open System Interconnection))模型:OSI是一个理想的模型,没有实现
七层模型:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层
TCP/IP模型:
网络接口与物理层:通过物理接口发送或接受数据
MAC地址:物理上唯一的标示一台主机,48位
MAC地址是网卡决定的,是固定的。 前三个字节是由IEEE的注册管理机构RA负责给不同厂家分配后三个字节由各厂家自行分配
IP和MAC地址这种映射关系由ARP(Address Resolution Protocol,地址解析协议)协议完成。
网络层:寻找对方的主机在哪里(通过路由器),路由器处于网络层
IP地址:逻辑上标示一台主机
ipv4:32位,主机号 + 网络号 (2的32次方)
ipv6:128位
四类:A类 1.0.0.1-127.255.255.254
主机号(1字节) + 网络号(3字节)
B类 172.16.0.0--172.31.255.255
主机号(2字节) + 网络号(2字节)
C类 192.0.1.1-223.255.255.254
主机号(3字节) + 网络号(1字节)
D类 224.0.0.1--239.255.255.255
传输层:保证要传输的数据能够正确无误、无丢失、无重传的发送给对方
端口号:
应用层:产生数据,或显示数据
进程的id,pid
//========TCP/IP======================
TCP/IP协议是一个协议族:有多个协议组成,因为TCP,IP是这个协议族
最重要的两个协议
传输层:
TCP协议(Transmission Control Protocol):传输控制协议
UDP协议(User Datagram Protocol):用户数据报协议
网络层协议:
IP协议(Internet Protocol):网际协议
ICMP协议(Internet Control Message Protocol):网际控制报文协议,
ping命令就是发送的该协议包。
ARP协议:地址解析协议,将IP地址转换为MAC地址
RARP协议:反地址解析协议,将MAC地址转换为IP地址
IGMP协议:
应用层协议
FTP协议:文件传输协议 (自己模拟FTP)
HTTP:超文本传输协议 (解析HTTP协议)
SMTP:简单邮件传输协议
DNS:域名解析协议
SNMP:简单网络管理协议
Telnet:远程登录协议
RTP协议(Real-time Transport Protocol):RTP协议详细说明了在
互联网上传递音频和视频的标准数据包格式,是介于应用层和传输层之
间的一种协议
TCP头:
序号:发送端将数据分段的编号
确认号:接收端告诉发送端下一个应该发送的字节编号
窗口(滑动窗口,滑窗管理):接收方发给发送方,告诉发送方,下一次应该发送
的字节的长度
TCP和UDP的区别
TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高
可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达
的通信)
适用情况:
适合于对传输质量要求较高,以及传输大量数据的通信。
在需要可靠数据传输的场合,通常使用TCP协议
MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议
UDP,是不可靠的无连接的协议。在数据发送前,因为不需要进行连接
,所以可以进行高效率的数据传输,实时性较好,主要用在直播、视频会议
socket:通信接口、文件描述符、函数API
流式套接字(SOCK_STREAM)----->TCP
提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。
数据报套接字(SOCK_DGRAM)----->UDP
提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。
原始套接字(SOCK_RAW)------->协议的开发者
可以对较低层次协议如IP、ICMP直接访问。
IP地址
IPv4:32位
IPv6:128位
点分十进制:192.168.7.10
网络二进制:100010001100 //可以在网络中传输的格式
/*负责点分十进制和网络二进制之间的转换*/
将strptr所指的字符串转换成32位的网络字节序二进制值
#include <arpa/inet.h>
int inet_aton(const char *strptr, struct in_addr *addrptr);
struct in_addr addrptr;//用来保存32位的网络字节序二进制值
inet_aton("192.168.7.10”, &addrptr);
功能同上,返回转换后的地址。
int_addr_t inet_addr(const char *strptr);
int_addr_t addr;//用来保存32位的网络字节序二进制值
addr = inet_addr("192.168.7.10");
//将IPV4/IPV6的地址转换成binary格式
int inet_pton(int af, const char *src, void *dst);
struct in_addr addrptr;
inet_pton(AF_INET, "192.168.7.10", &addrptr);//用于IPV4
inet_pton(AF_INET6, "192.168.7.10", &addrptr);//用于IPV6
//将32位网络字节序二进制地址转换成点分十进制的字符串。
char *inet_ntoa(struct in_addr in);
char buf[50];
stuct in_addr inaddr = func(xxxxx);
printf("ip: %s\n",inet_ntoa(inaddr));
strcpy(buf, inet_ntoa(inaddr));
端口号:16位(1-65535)
为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区别
1-1024: 系统使用
1025-5000:系统保留
5001-65535:用户使用
字节序
大端序:高字节放在低地址,低字节放在高地址 internet
小端序:高字节放在高地址,低字节放在低地址 linux window7
主机字节序到网络字节序
u_long htonl (u_long hostlong);
u_short htons (u_short short);
网络字节序到主机字节序
u_long ntohl (u_long hostlong);
u_short ntohs (u_short short);
//网络编程API
/*创建一个通信接口,得到一个套接字文件描述符*/
//使应用层和网卡底层建立关联,启用网络协议
int socket(int domain, int type, int protocol);
param1:地址族
AF_INET/PF_INET //用于IPV4的互联网通信
AF_INET6/PF_INET6 //用于IPV6的互联网通信
//用于unix套接字,用于同一台主机进程之间通信
AF_UNIX/PF_UNIX/AF_LOCAL/PF_LOCAL
param2:套接字类型
SOCK_STREAM // TCP 流式套接字
SOCK_DGRAM // UDP 数据报式套接字
SOCK_RAW // 开发协议 原始套接字
param3:统一为0
返回值:成功,返回一个文件描述符
失败,返回-1
int sock_fd;//主动套接字,该套接字可以主动的向别的主机发起连接请求
sock_fd = socket(AF_INET, SOCK_STREAM , 0);
/*只有服务器才会调用该函数,为以上的套接字绑定一个IP地址和端口*/
//表示该socket是哪个主机中的哪一个进程所拥有
int bind(int sockfd, struct sockaddr *my_addr, int addrlen) ;
param1:为哪个套接字进行绑定
param2:指定要绑定的是哪一个ip,哪一个端口
param3:存放ip地址和端口的结构体长度
struct sockaddr_in sinfo;
sinfo.sin_family = AF_INET;
sinfo.sin_port = htons(8888);
sinfo.sin_addr.s_addr = inet_addr("192.168.7.10");
bind(sockfd, (struct sockaddr *)&sinfo, sizeof(sinfo)) ;
//通用地址结构
struct sockaddr
{
u_short sa_family; // 地址族, AF_xxx
char sa_data[14]; // 14字节协议地址
};
//ipv4
struct sockaddr_in
{
u_short sin_family; // 地址族, AF_INET,2 bytes
u_short sin_port; // 端口,2 bytes
struct in_addr sin_addr; // 存放网络字节序的IPV4地址,4 bytes
char sin_zero[8]; // 8 bytes unused,作为填充
};
//ipv6
struct sockaddr_in6
{
};
struct in_addr
{
in_addr_t s_addr; // u32 network address
};
struct sockaddr_in {}; //ipv4
struct sockaddr_in6 {};//ipv6
struct sockaddr_un {};//unix套接字
/*将一个套接字设为监听状态,该套接字成为被动套接字,即套接字只能被动接受别的主机的请求,而不能主动连接
别的主机*/
int listen (int sockfd, int backlog);
sockfd:监听连接的套接字
backlog:在同一时刻,能接受的连接请求个数(5-10)
/*1:接收一个新的连接请求,并返回一个新的套接字,为连接套接字,这个套接字代表一个新的连接
* 2:accept会发生阻塞,直到收到一个接连请求为止
* 3:一个accept只能接收一个连接请求,如果要接收多个请求,必须使用循环*/
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) ;
param1:要通过哪一个套接字来接收请求
param2:用来保存发起连接请求的那一端的信息(ip和端口)。
param3:保存结构体长度地址
返回值:
成功:返回一个文件描述符
失败:返回-1
int conn_fd;
conn_fd = accept(sockfd, NULL, NULL) ;
/*进行数据读取*/
read(conn_fd, buf, 100);
/*客户端来调用该函数,用来向服务器发起连接请求*/
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
param1:通过哪个套接字来发送请求
param2:用来保存服务器的信息,也就是要把连接请求发送给ip和端口为指定的那个服务器