常见知识点:
1、 网络常识 - IP地址、端口、网络协议、7层模型和4层/5层模型/osi
2、 7层模型: 物理层、数据链路层、网络层、传输层、会话层、表现层、应用层
3、 协议
在网络中,有很多的规范(数据交互),这些规范叫做协议。
常见协议:
http - 超文本传输协议(互联网基础协议)
ftp - 文件传输协议(文件上传和下载)
邮件发送和接收协议 - smtp 和 pop3
传输层协议:
TCP协议 - 传输控制协议
UDP协议 - 用户数据报协议
网络层的IP协议 - 网络中查找计算机
Tcp/ip 协议族
TCP(Transmission Control Protocol)
– 传输控制协议,基于连接的服务
UDP(User Datagram Protocol)
– 用户数据报协议,无连接的服务
IP(Internet Protocol)
– Internet协议,信息传递机制
4、 协议簇
一堆相关的协议组成一个协议簇(协议族),如:TCP/IP就是一个协议簇。
5、 ip地址
就是一个整数,最初时就是4字节整数,是计算机在网络中的唯一标识。两种表示方式:
十六进制描述法(8位的十六进制) 针对计算机底层。
点分十进制:每个字节算一个数(0-255),中间用点隔开。人接触的IP都是点分十进制。
后来因为IP地址的分配不均,导致IP地址紧张,因此IP地址做了扩展,到了128位,因此IP地址有2种形式:IPV4 - 4字节 IPV6 ,主流的还是IPV4
192.168.15.100 -> 点分十进制
C0 A8 0F 64 -> 0xC0A80F64(十六进制)
其实对应IP地址是一个。
IP地址其实要和Mac地址绑定才能生效,Mac地址就是网卡的物理地址,就是网卡出厂时预先设定的编号,这个编号确保唯一。
6、 查看ip地址的命令
WINDOWS(DOS): ipconfig
Unix : ifconfig (/sbin/ifconfig)
7、 ip端口
IP地址可以定位计算机,但数据传送时需要给计算机中的特定进程。端口 就是定位计算机中的进程。网络交互 必须有 IP地址和端口号。
端口是一个short,值为 0-65535。不是所有端口都可以直接使用。
0-1023 大部分都被系统占用,所以不要用。
1024-48000多 程序员使用的,其中某些被程序占用。
余下的是 动态端口,系统随时可能用一下,不稳定。
8、 简单的socket编程的步骤
8.1 服务端
1) 创建socket关键字;
2) 准备通信地址
3) 绑定
4) 通信
5) 关闭
8.2 客户端
1) 创建socket关键字;
2) 准备通信地址
3) 连接
4) 通信
5) 关闭
8.3 简单实例
服务端:
int main()
{
int sockfd = socket(AF_FILE,SOCK_DGRAM,0);//1、 创建soctet关键字
if(sockfd == -1)
{
perror("socket"),exit(-1);
}
struct sockaddr_un addr;//2、 创建通信地址,用结构体
addr.sun_family=AF_FILE;//与第一步中,创建sock关键字的一样
strcpy(addr.sun_path,"./a.sock");//本地通信文件
int res = bind(sockfd,(struct sockaddr*)&addr,sizeof(addr));//3绑定
if(res == -1)
{
perror("bind"),exit(-1);
}
char buf[1024];
memset(buf,0x00,sizeof(buf));
int len = read(sockfd,buf,sizeof(buf));//4 通信
printf("read %d ,The content is %s ",len,buf);
close(sockfd);//5关闭
}
int main()
{
int sockfd = socket(AF_FILE,SOCK_DGRAM,0);
if(sockfd == -1)
{
perror("socket"),exit(-1);
}
struct sockaddr_un addr;
addr.sun_family = AF_FILE;
strcpy(addr.sun_path,"./a.sock");
int res=connect(sockfd,(struct sockaddr*)&addr,sizeof(addr));
if(res == -1)
{
perror("connect"),exit(-1);
}
write(sockfd,"aiyq195",5);
close(sockfd);
}
上面的代码,还涉及到一些内容:
socket有两种通信方式:本地通信和网络通信
其中的关键函数
1、 socket() 函数
socket()函数,创建一个套接字 socket,返回 socket描述符。
int socket(int domain,int type,int protocol)
其中参数:
domain 域,用于选择协议簇。
AF_UNIX AF_LOCAL AF_FILE - 本地通信(IPC)
AF_INET - 网络通信
AF_INET6 - 网络通信IPV6
type 用于选择通信类型
SOCK_STREAM : 数据流,用于TCP
SOCK_DGRAM : 数据报,用于UDP
protocol 没有效果的参数,给0 即可。
返回 socket描述符,用法和文件描述符差不多。失败返回-1。
2、 通信地址
通信地址有3个结构体,sockaddr不存储通信地址,只做参数的类型。通信地址存在另外两种结构中:
本地通信的地址 sockaddr_un
#include <sys/un.h>
struct sockaddr_un{
int sun_family;//协议簇,与socket一致
char sun_path[];//socket文件的文件名
};
网络通信地址 sockaddr_in
#include <netinet/in.h>
struct sockaddr_in
{
int sin_family;//协议簇,与socket一致
short sin_port;//端口号
struct in_addr sin_addr;//IP地址
};
3、 bind()、connect() 函数
bind(sockfd,sockaddr,addrlength)
connect(sockfd,sockaddr,addrlenth)