IPV4 -- IP地址分类:主机号是区分主机的,网络号是区分网段的
子网掩码是对主机号进行划分子网用的
举例说明:
对 192.168.1.0网段划分4个 其子网掩码 : 拿出主机号的两个位进行划分子网才可以有4种情况
其子网掩码 1111111.11111111.11111111.11000000 ---- 255.255.255.192
子网掩码与IP地址进行按位与运算后悔知道其是哪个子网下的,根据子网掩码可以知道有几个子网
按照子网掩码 255.255.255.192 和 网段 192.168.1.0 划分四个子网如下:
第一个子网 : 192.168.1.1 ~ 192.168.1.62
第二个子网 : 192.168.1.65 ~ 192.168.1.126
第三个子网 : 192.168.1.129 ~ 192.168.1.190
第四个子网 : 192.168.1.193 ~ 192.168.1.254
协议模型:
端口号:
(1)网络通信 ip 是区分那台电脑的,端口号是区分电脑上那个程序的,如QQ,微信是不同的端口
(2)TCP和UDP的端口是分开,如TCP服务器可以使用8080端口,UDP服务器也可以使用8080端口
(3)端口号分配众所周知端口:1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用) 已登记端口:1024~49151 动态或私有端口:49152~65535
对于socket:
socket 是网络通信过程中的文件描述符,网络通信过程中的发送接收数据bind,连接都是针对这个socket操作;它就是一个网络文件描述符和IO中的fd一样
socket 类型
(1)流式套接字(SOCK_STREAM) :提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。针对TCP
(2)数据报套接字(SOCK_DGRAM) :提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。针对UDP
(3)原始套接字(SOCK_RAW) :可以对较低层次协议如IP、ICMP直接访问。
IP地址转换:
(1) 将strptr所指的字符串转换成32位的网络字节序二进制值
int inet_aton(const char *strptr, struct in_addr *inp);
(2) 将网络地址转换成 “.” 点隔的字符串格式
char *inet_ntoa(struct in_addr in);
(3)将cp指向的字符串格式的ip转为整数网络字节序的格式
in_addr_t inet_addr(const char *cp);
(4)转换后的为主机字节序整数
in_addr_t inet_network(const char *cp);
(5)将网络字节序的端口号转为主机字节序格式 uint16_t ntohs(uint16_t netshort);
大小端问题:针对多字节存储
网络字节序是大端格式,但是对于不同的主机,其大小端不确定只能通过函数转换,把不同主机上的字节序全部转换为网络字节序格式。
大端格式:低地址放数据的高位字节。
小端格式:低地址放数据的低位字节。
字节序转换函数:
(1)主机字节序到网络字节序
u_long htonl (u_long hostlong);
u_short htons (u_short short);
(2)网络字节序到主机字节序
u_long ntohl (u_long hostlong);
u_short ntohs (u_short short);