网络编程
- 本质:
- 使用操作系统的接口函数,使得应用程序具备收发网络数据的能力
- 核心概念
- 协议:为进行数据通信而预定义的数据规则
- 地址:网络通信中的用于标识设备的整数值
- 端口号:
- 设备为收发数据而指定的数值,用于标识具体链接
- 可理解为:设备中用于网络通信的数据通道
- 角色
- 服务端:等待连接的设备
- 客户端:发起连接的设备
网络基本知识
- 网址不是IP地址,是网络信息资源的地址,即:URL
- 域名是IP地址的别名,多个域名可指向同一个IP地址
- 协议是一种约定,即:预先定义的规则
- 协议可以基于文本定义,也可以基于二进制定义
字节序
本质
- 不同类型CPU主机,内存存储 多字节整数 序列的方式。
- char,字符串,float,double均没有字节序的说法
short, int, long , long long
有字节序的说法。
小端系统
- 采用小端模式(little-endian)的系统,即:数据低字节放在系统内存低地址
大端系统
- 采用大端系统(big-endian)的系统,即:数据低字节放在内存高地址中
网络字节序
- 网络字节顺序采用大端模式,所以在小端系统中需要做字节序转换
利用union的性质判断系统大小端
int system_mode()
{
union SM
{
int i;
char c;
};
union SM sm;
sm.i = 1;
return sm.c;
}
int main()
{
printf("System Mode: %d\n", system_mode());
//返回1为小端,返回0为大端
return 0;
}
关于端口号和IP地址
端口号
- 端口号是一个2字节数据
- 为了区分一台主机收到的数据包交给哪个进程处理,使用端口号来区分。程序启动后将端口号和进程绑定在一起。
- 网络里面的通讯是由 IP地址+端口号 来决定
- 0 - 1023作为特定端口被预定义(分配给特定应用程序)
- 使用被预定义的端口号会导致bind失败
- 临时端口号:49152~65535,这部分是客户端运行时候动态选择的
- 可以使用的:1024~49151,就是我们平时编写服务器使用的端口号
- TCP和UDP的端口号互相独立
IP地址
IP地址范围 | 网络号个数 | 主机号个数 | ||
---|---|---|---|---|
A类地址 | 0.0.0.0~127.255.255.255 | 2^7(网络号) | 2^24(主机号) | 大型网络 |
B类地址 | 128.0.0.0~191.255.255.255 | 2^14 | 2^16 | 名地址网管中心 |
C类地址 | 192.0.0.0~223.255.255.255 | 2^21 | 2^8 | 校园网或企业网、家庭网 |
D类地址 | 224.0.0.0~239.255.255.255 | 组播地址 | ||
E类地址 | 240.0.0.0~255.255.255.255 | 保留 |
- IP地址是一个4字节地址族(可分为5类地址)
- 将32位IP地址的二进制数,以8bit为一组,用十进制表示,利用点分割。
- D类常用于多播(无网络号和主机号分配)
- E类常用于实验(无网络号和主机号分配)
- IP地址分为网络标识和主机标识两部分(网络标识=网络号,主机标识同理)
- 网络标识:标识网络设备所在网络
- 主机标识:标识网络设备具体地址
- 特殊IP地址
- 0.0.0.0 / 0
- 保留,常用于代表“缺省网络”
- 127.0.0.0 / 8
- 回环地址,常用于本地软件回送测试
- 255.255.255.255 / 32
- 广播地址
- 每个子网段的第1个IP地址
- 子网网号
- 每个子网段的最后一个IP地址
- 广播地址
- 局域网内第二个IP地址
- 网关IP
- 0.0.0.0 / 0
- 私有IP地址:不在公网使用,只在内网使用
- 10.0.0.0 - 10.255.255.255 / 8
- 172.16.0.0 - 172.31.255.255 / 16
- 192.168.0.0 - 192.168.255.255 / 24
子网掩码
- IP地址和子网掩码配合使用区分网络标识和主机标识
- 子网掩码的表现形式也是一个四字节的整型数
- 子网掩码用于从IP地址中提取网络标识
- 子网掩码
- 用于将一个大的IP网络中的主机号划分为若干小的子网络(常用)。
- 或者将若干个小网络组合成一个大的局域网(称之为超网技术)。
- 指明一个IP地址的哪些位表示的是主机所在的子网
- 指明哪些位表示的是主机的位掩码。
- 子网掩码不能单独使用,必须结合IP地址一起使用
- 子网掩码的格式
- 与IP地址一样长的32位无符号整数,是由一串连续的1,后面跟着一串连续的0组成。
计算子网可用IP地址
- 设子网掩码为(M.N.P.Q)
- 子网可用IP地址n = (256-M) * (256-N) * (256-P) * (256-Q) - 3
域名系统
- 域名本质就是IP地址的别名,一个域名可以对应多个IP地址
域名结构
- 例如域名 www.baidu.com.cn 从右向左看
cn
为高级域名,也叫一级域名,它通常分配给主干节点,取值为国家名,cn
代表中国- com为网络名,属于二级域名,它通常表示组织或部门
- 中国互联网二级域名共40个,edu表示教育部门,com表示商业部门,gov表示政府,军队mil等等
baidu
为机构名,在此为三级域名,表示百度- www:万维网world wide web,也叫环球信息网,是一种特殊的信息结构框架。
TCP/IP分层结构
- 应用层
- 各个应用程序可以定义(使用)各种各样的协议
- 编码后发送字符串数据
- 收到字符串数据,根据约定解码
- 传输层
- 确保发出的数据能够到达目标主机,完成数据传输
- 将数据分包,加上标识头,序号等通用信息
- 根据附加信息进行数据组包,恢复原始应用层数据形态
- 网络层
- 填写数据包地址,选择数据传递路径
- 加上收发地址信息,选择最佳传输路径
- 解析二进制数据,恢复原始传输层数据形态
- 数据链路层
- 融合不同连接方式的链路,屏蔽网络差异
- 将数据封装并转换为二进制序列
- 组装二进制数据,恢复原始网络层数据形态
- 物理层
- 具体链接方式:有线,无线,光纤
特点
- 上层依赖接邻下层的能力,下层只为直接接邻上层服务
- 上层不知道下层的工作机制,下层不管上层传输的数据内容
- 不做跨层服务,层次结构中的角色缺一不可
网络层(IP层)
-
IP寻址
- IP地址属于网络层地址,用于标识网络上的主机
-
路由控制
- 控制数据如何达到目标主机(如:需要经过哪些路由器转发)
-
无连接
- 数据包根据IP地址在网络上传递(无需与目标实现建立连接)
-
MAC地址
- 物理地址,48bit全球唯一,网卡编号,网络设备的身份标识(cmd —> ipconfig/all),由厂商出厂后确定。
- 数据链路层所使用的硬件地址。MAC地址与网络无关,出厂时写入到网络设备中。当主机从网络上每收到一个数据帧时,首先检查数据帧中的MAC地址。如果是发往本主机的数据帧则收下,之后进行其他的处理;否则就将此帧丢弃,不再进行其他的处理
-
ICMP协议(Internet Control Management Protocol)
- 英特网控制管理协议,ping检测网络就是用这个协议
- 用于在IP主机、路由器之间传递控制消息
IP地址与MAC地址
- IP地址是动态的,不特定于某个具体的硬件(MAC地址隶属于具体硬件)
- IP地址是网络层使用的地址(用于跨网络投递数据包)
- MAC地址是数据链路层的地址(用于确定目标网络中接收数据的主机)
- 路由器中记录了本网络中主机IP地址与MAC地址的映射关系
ARP/RARP 地址解析协议/逆向地址解析协议
- ARP(Address Resolution Protocol):通过ip地址获取其对应的mac地
- RARP(Reverse Address Resolution Protocol):通过mac地址获取其对应的ip地址。
- PPP(Point to Point Protocol)协议:拨号协议(GPRS/3G/4G)
- MTU:最大传输单元 默认是1500bytes
- MSS:最大报文长度 默认是1460bytes
网络层信息的收发
- 为了将数据发给目标主机,所有主机都维护着一张路由表
- 路由表记录了IP数据包下一步应该发给哪个路由器
IP数据转发
- IP数据包转发才有的“尽力服务”策略
- 尽力服务指会努力,但不保证结果
- 转发时会通过附加信息检查数据合法性,但出现异常不会进行重发
- 以包为单位进行转发,不保证到达(发出之后,石沉大海)
传输控制协议(TCP)
- TCP在协议实现上提供可靠数据传输,建立在IP数据转发之上
- TCP不存在数据包的概念,实现了流式传输(数据如流水,无头无尾)
- TCP内部有服务状态,能够精确知道数据是否已经发送成功,是否被接收,。。。
- TCP在行为上可进行阻塞控制(网络环境变差时,能够调整数据发送速度)
UDP
- 完全继承网络层的工作方式
- 无需连接,直接指定IP地址和端口即可发送数据
- 监听固定端口,只要有数据,统统接收
- 不管网络情况,只要是数据统统可发送
- 不关心数据是否到达对端
- 限制数据包的大小,超出部分直接删除。
使用环境
- 对数据不敏感,需要实时性的场合(如:直播,实时游戏)
- 网络环境比较好的场合(如:物联网家居)
- 需要深度定制协议的场合(如:“不丢包”的UDP协议)