1.由于对于一个网络下面的主机号还是很庞大,为了进一步划分网络,我们可以将主机号再次进行划分为两部分,分别是网段号和主机号
2.此时就引入的子网掩码的概念
3. 在引入子网掩码后,IP = 网络号 + 子网号 + 主机号
4.子网掩码:用于ip地址的三级划分,划分时,用户可以选择划分,也可以不划分,如果不划分,就使用默认的子网掩码
定义格式:与IP地址一样长的32位整数,由一串连续的1和一串连续的0组成
默认子网掩码:1的个数与ip地址中网络号的个数保持一致,0的个数与ip地址中主机号的个数保持一致
默认子网掩码
C类网络:
192.168.125.161 ---> 11111111 111111111 11111111 000000000 ----> 255.255.255.0
A类网络:
58.1.2.3 ---> 11111111 000000000 00000000 00000000 ----->255.0.0.0
B类网络:
150.1.2.3 ---> 11111111 11111111 00000000 00000000 ----> 255.255.0.0
D类网络和E类网络没有子网掩码
5.子网掩码的使用:ip地址 & 子网掩码 ==> 子网网段
以192.168.125.161为例,子网掩码为255.255.255.0
11000000 10101000 01111101 10100001
& 11111111 11111111 11111111 00000000 ——————————————————————————————————————
11000000 10101000 01111101 00000000 --->192.168.125.0 子网网段
6.特殊的网络
当前网络:网络加主机号为0的ip地址,例如:192.168.125.0
广播地址:网络号加主机号为255的ip地址,例如:192.168.125.255
网关地址:网络号加主机号为1的ip地址,例如:192.168.125.1
1. 端口号是能够实现网络端对端的通信
2. 是主机中某个进程的标识,由于某个进程关闭后,再打开,pid会不断更改,所以,在启动一个进程时,可以指定端口号,标识该进程
3. 端口号是一个2字节的无符号整数,取值范围[0,65545]
4. 端口号的分类:
众所周知的端口号:
0~1023端口编程时候不要使用,是那些”VIP“应用程序占了
TCP 21端口:FTP文件传输服务
TCP 23端口:TELNET终端仿真服务
TCP 25端口:SMTP简单邮件传输服务
TCP 110端口:POP3邮局协议版本3
TCP 80端口:HTTP超文本传输服务
TCP 443端口:HTTPS加密超文本传输服务
UDP 53端口:DNS域名解析服务
UDP 69端口:TFTP文件传输服务
TCP和UDP的端口号是相互独立的
可以使用的:1024~49151,就是我们平时编写服务器使用的端口号
临时端口号:49152~65535,这部分是客户端运行时候动态选择的
由于使用IP地址来指定计算机不方便人们记忆,且输入时候容易出错,用字符标识网络种计算机名称方法。
这种命名方法就像每个人的名字,这就是域名(Domian Name)
1> 最早的套接字也是跟消息队列、共享内存、管道一样,只能实现同一主机之间的多个进程间的通信
2> 随着tcp/ip协议族的出现,使得消息能够穿过网卡设备,在网络中进行传输
3> 套接字通信使用的是套接字文件,也是一种特殊的文件,bcd-lsp中的s说的就是该文件
4> socket这个函数,用于创建一个套接字文件,套接字文件的通信原理如下所示
#include
/* See NOTES */ #include
int socket(int domain, int type, int protocol);
功能:创建一个用于通信的端点,并返回该通信对应的文件描述符,描述符使用最小未分配原则
参数1:通信域对应的协议族 AF_UNIX, AF_LOCAL Local communication(本地通信) unix(7) man 7 unix可以查看相信信息 AF_INET IPv4 Internet protocols(IPv4通信) ip(7) man 7 ip可以查看相信信息 AF_INET6 IPv6 Internet protocols(IPv6通信) ipv6(7) man 7 ipv6可以查看相信信息
参数2:指定通信语义,理解成传输方式 SOCK_STREAM 提供支持TCP通信 SOCK_DGRAM 提供支持UDP通信 SOCK_RAW 通过原始的套接字通信
参数3:通信协议,如果参数2指定了确定的通信方式,该参数填0即可 如果不确定通信方式,可用的参数有: TCP:IPPROTO_TCP UDP:IPPROTO_UDP
返回值:成功返回套接字文件描述符,失败返回-1并置位错误码
1> 创建套接字:该套接字用于接收客户端的连接请求使用,并不是用于通信的套接字
2> bind绑定端口号和IP地址
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 */ 网络地址,是一个结构体
};
struct in_addr {
uint32_t s_addr; /* address in network byte order */ IP地址,网络字节序
};
#include
/* See NOTES */ #include
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:给指定的套接字文件描述符绑定IP地址和端口号
参数1:要绑定的套接字文件描述符
参数2:地址信息结构体,包含了通信域、IP地址、端口号
参数3:参数2的大小
返回值: 成功返回0,失败返回-1并置位错误码
3> listen设置监听
#include
/* See NOTES */ #include
int listen(int sockfd, int backlog);
功能:将套接字文件描述符设置成监听状态,以监听客户端的连接请求
参数1:服务器套接字文件描述符
参数2:挂起队列的长度,当该队列长度满时,其他连接的客户端将会报错,一般设置为128
返回值: 成功返回0,失败返回-1并置位错误码
4> accept阻塞等待客户端连接请求
#include
/* See NOTES */ #include
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:阻塞接收客户端的连接请求,并给该客户端创建一个新的用于通信的套接字
参数1:用于连接的套接字文件描述符
参数2:用于接收客户端的地址信息的结构体指针,如果不愿意接收,填NULL即可
参数3:接收客户端的地址信息的长度,是一个指针,也需要传递变量的地址
返回值:成功返回一个用于通信的套接字文件描述符失败返回-1并置位错误码
5> 数据收发函数:send、recv
#include
功能:向套接字文件描述符中发送数据 参数1:要发送的套接字文件描述符 参数2:要发送数据的起始地址 参数3:要发送数据的大小 参数4:标识是否阻塞
0:表示阻塞 MSG_DONTWAIT:表示非阻塞
返回值:成功返回发送的字节个数,失败返回-1并置位错误码
#include
#include
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:从给的的套接字文件描述符中读取数据 参数1;要读取的套接字文件描述符 参数2:读取数据的容器地址 参数3:读取的大小
参数4: 标识是否阻塞 0:表示阻塞 MSG_DONTWAIT:表示非阻塞
返回值: >0:表示接收的字符的个数 =0:表示对方已经退出 =-1:出错,置位错误码
1> socket:创建一个用于通信的套接字文件描述符
2> bind:可绑定也可以不绑定
3> connect:连接服务器
#include
#include
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:将指定的客户端套接字,连接到服务器
参数1;客户端套接字文件描述符
参数2:服务器的地址信息结构体
参数3:参数2的大小
返回值:成功返回0,失败返回-1并置位错误码
4> send\recv: 通信
5> close:关闭套接字
1> socket:创建用于通信的套接字文件描述符
2> bind:绑定端口号和IP地址
3> sendto/recvfrom:数据收发
4> close:关闭客户端
1> socket 创建套接字
2> bind 可以绑定也可以不绑定
3> 数据收发
4> 关闭套接