1、名词规范
- 计算机处理的数据: 数据包
- 物理网卡处理的数据: 数据帧
2、IP地址
网间同行协议地址,用来在网络同行中唯一标识一台主机
IP地址目前有两类:
IPV4 目前主流 32bit 的整数
IPV6 未来趋势 128bit 的整数
3、IP地址的表示
二进制整数: 11000000 10101000 00000001 00000001
点分十进制: 192.168.1.1
十六进制: 0xc0800101
IP地址 = 网络地址 + 子网地址 + 主机地址
主机地址
全0 表示网段
全1 表示广播地址
其他:标识主机,只有相同网络地址的主机才能直接通信
4、IPV4地址的分类
- A 类:32bit中以0开头的地址,1字节网络地址+3字节主机地址,用来管理超大规模的网络,通常是国家级通信的主干网
0.0.0.0 - 127.255.255.255
10网段是私有IP,用作搭建大型局域网
127网段是保留地址,用作本地回环
- B 类:32bit中以10开头的地址,2字节网络地址+2字节主机地址,用来管理大规模的网络
128.0.0.0 - 191.255.255.255
172.16.xxx.xxx - 172.31.xxx.xxx 私有地址
- C 类:32bit中以110开头的地址,3字节网络地址+1字节主机地址,用来管理小型的网络
192.0.0.0 - 223.225.255.255
192.16.xxx.xxx 私有地址
- D 类:32bit中以1110开头的地址。组播地址,不用来表示主机,也不划分网段
224.0.0.0 - 239.255.255.255
E 类:32bit中以11110开头的地址。用作实验、测试,不用做标识主机
240.0.0.0 - 247.255.255.255
5、子网掩码 用来在ABC网段基础下划分子网,子网掩码和IP地址“位与” 后得到网络段号,即“子网掩码 & IP地址 = 网络地址”
例如:
11000000 10101000 00000001 00001010 192.168.1.10 IP地址
11111111 11111111 11111111 00000000 255.255.255.0 子网掩码
11000000 10101000 00000001 00000000 192.168.1.0 网络段
划分子网分类管理,可以减少网管的负载并预防广播风暴 广播风暴:网络中大量主机发送广播数据包并要求应答时,数据总量将会是主机数量的N 的平方级,引发网络瘫痪
6、网关、路由器 工作在L3,网络层,解析IP,负责该网段内的所有主机,面对主机跨越不同网段,是组成整个因特网的骨干。
7、交换机 工作在L2,数据链路层,负责根据mac面向网卡转发数据帧
8、DNS 域名解析系统,负责将域名解析成对应的IP地址。
域名:一个字符串,用来描述一台主机,通常用在浏览器中访问目标服务器
例如:
192.168.1.1 点分十进制表示的IP地址,网络通信使用,不方便记忆
www.baidu.com 域名,一组有特征的字符串,用户使用,方便人记忆
8.8.8.8 谷歌提供的全球免费DNS服务器地址
9、调制解调器 “猫” ADSL线路的模拟信号到本地局域网数字信号的转换,根据数据发送的双向特征,具有调制和解调功能。
10、OSI 7 层模型 一个理想的网络通信模型,每层分别负责不同的协议
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
11、TCP/IP 模型 一个现有的工业标准,计算机世界的通用语
应用层
传输层
网络层
物理层
12、套接字的类型
流式套接字(TCP)
用户数据报套接字(UDP)
原始套接字
TCP:可靠的、苗乡连接的、双工的、基于字节流的通信方式,不限制数据的长度 UDP:不可靠的、无连接的、双工的、基于用户数据报的通信方式,有固定的最大长度限制
UDP包大小不能超过65535字节(因为UDP包头中用2字节表示包大小),但是实际能传输的最大包是 65535 -20 -8(IP包头和UDP包头分别占用20字节和8字节)
TCP没有大小限制。
IP包头中也有2字节表示IP包大小,因此IP包大小也不能超过65535,IP层会使用分片机制拆分过大的TCP数据包。 数据链路层的ETHER帧大小不能超过1500字节,因此网卡发送前也会拆包并在接收时重组
大小端:
x86 小段字节序
ARM 大小
PPC 大端
TCP粘包问题:TCP协议层为了节省开销会将多个小数据的包合并成一个大包一起发送出去,因此会发生数据粘连。
解决方案:
1、使用setsockopt()函数设定TCP层属性禁止发送方粘包(man 7 tcp) 但是不能解决接收方的粘包
2、在每次发送后延时十几毫秒,但是将导致发送效率低下
3、发送方和接收方规定每次按照定长收发数据,但是当数据长度浮动范围较大时会浪费资源(为了对齐不得不发无用的脏数据)
4、将数据封装,定长包头+边长数据,每次接收先接定长的包头,根据包头中记录的数据长度再接收定长的数据(此法从效率和占有资源上都达到了均衡)
主机字节序:
大端字节序
小端字节序
网络字节序:大端字节序