网络的体系结构
网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起 每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务,同时使用下层 提供的服务。
网络体系结构即指网络的层次结构和每层所使用的协议的集合。
两类非常重要的体系结构:OSI和 TCP/IP。
OSI模型相关的协议已经很少使用,但模型本身非常通用
OSI模型是一个理想化的模型,尚未有完整的实现
OSI模型共有七层 二层交换机,三层交换机
TCP/IP协议族体系
TCP/IP协议族体系是Internet事实上的工业标准。
TCP:传输控制协议
IP:互联网协议
UDP:用户数据报协议
ICMP:互联网控制消息协议
......
一共有四层:应用层,传输层,网络层,网络接口和物理层
每一层都负责不同的功能,并通过接口与相邻层进行交互
网络各层的协议解释
1.网络接口和物理层
mac地址:48位全球唯一,网络设备的身份标识
ARP:地址解析协议,IP地址找到mac地址
RARP:mac地址--找到IP地址
PPP协议:拨号协议(GPRS/3G/4G)
2.网络层
IP地址
IP协议:Internet protocol(分为IPv4和IPv6)
ICMP:Internet控制管理协议,Ping 命令属于ICMP
IGMP:Internet分组管理协议,广播和组播
3.传输层
TCP:(Transfer Control protocol,传输控制协议)提供面向连接的,一对一的可靠传输的协议
数据无误,数据不丢失,数据无失序
适用场景 :
适合对传输质量 要求较高 ,以及传输大量数据的通信
在需要可靠数据传输的场合,通常适用TCP协议
MSN/QQ等即时通讯软件的用户登录账号管理相关的功能通常采用TCP协议
UDP:(user Datagram Protocol,用户数据报协议):提供不可靠,无连接的传输协议
适用场景
发送小尺寸数据(如对DNS服务器进行IP地址查询时)
在接收数据,给出应答较困难的网络中适用UDP(如无线网络)
适合于广播/组播式通信中
MSN/QQ/Skype等即时通讯软件的点对点文本通讯 以及音视频通讯常采用UDP协议
流媒体,VOD,VoIP,IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输
SCTP:(Stream Control Transmission Protocol:流控制传输协议),TCP的增强版 ,他能实 现多主机 ,多链路的通信。
4.应用层
网页访问协议:HTTP/HTTPS
邮件发送接收协议:POP3(收)/SMTP(发),IMAP(可接受邮件的一部分) FTP:文件传输协议
Telnet/ssh:远程登录
嵌入式相关:
NTP:网络时钟协议
SNMP:简单网络管理协议(实现对网络涉及集中式管理)
RTP/RSTP:用于传输音视频的协议(安防监控)
网络的封包和拆包
封包:指将用户数据按照一定的规则和格式封装成数据包
封包以便在网络中进行传输的过程。这个过程包括将用户数据分割成适合网络传输的数据块(没每次经过一个阶段就会增加一个控制信息),并为每个数据块添加必要的控制信息(如源地址、目的地址、长度、校验和等),最终形成一个完整的数据包。
封包过程:
- 数据分割:将要传输的数据按照一定的大小(如MTU,最大传输单元)进行分割,形成多个小的数据块。
- 添加控制信息:为每个数据块添加必要的控制信息,如源地址、目的地址、数据包长度、校验和等。这些信息通常被封装在数据包的头部(Header)中。
- 封装成数据包:将添加了控制信息的数据块按照特定的协议格式进行封装,形成一个完整的数据包。
拆包:收方在收到数据包后,根据数据包中的控制信息将其还原成原始用户数据的过程
即封包的逆过程,包括从数据包中剥离控制信息,并将剩余的数据块重新组合成原始的用户数据。
拆包过程:
- 解析数据包:接收方首先解析数据包的头部信息,获取数据包的来源、目的地、长度和校验和等控制信息。
- 剥离控制信息:将数据包中的控制信息剥离出来,以便后续处理。
- 数据重组:根据数据包中的长度信息,将剩余的数据块按照顺序重新组合成原始的用户数据。
粘包:发送方发送的多个小数据包被接收方一次性接收,形成一个大的数据包。这可能是由于TCP的"流"特性以及网络状况等因素造成的。在执行拆包时,有可能导致数据包大小超过接收方的缓冲区大小,会把大的数据包拆解成多个小的数据包。
解决办法:
- 发送端给每个数据包添加包首部,包含数据包的长度信息,以便接收端根据长度信息来拆分数据包。
- 将数据包封装为固定长度,如果数据不足,则通过补0等方式填充至固定长度。
- 在数据包之间设置边界,如添加特殊符号等,以便接收端能够识别数据包的边界。
TCP/IP协议下的数据包
MTU:最大传输单元
以太网:1500
mss:网络类型,线路,特性相关
网络预备知识
1.socket
是一个编程接口,是一个特殊的文件描述符(对他执行IO的操作函数,比如read,write,close等),并不 仅限于 TCP/IP协议,面向连接TCP,无连接UDP。
socket代表网络编程的一种资源
分类
1.流式 套接字(SOCK_STREAM)。唯一对应TCP
提供了一个面向连接,可靠的数据传输服务,数据无差错,无重复的发送顺序接收。内射击流量控 制,避免数据流淹没慢的接收方。数据被看作式字节流,无长度限制。
2.数据包 套接字(SOCK_DGRAM)。唯一对应UDP
提供无连接服务器,数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重 复,顺序发送,可能乱序接收。
3.原始套接字(SOCK_RAW)。对应多个协议,发送穿透了传输层
可以对较低层次协议如IP,ICMP直接访问。(可以跳过多个层次)
2.IP地址
IP地址是Internet中主机的标识,Internet中的主机要与别的机器通信必须具有一个IP地址,IP地址为32位(Ipv4)或者128位(Ipv6),每个数据包都必须携带目的 IP地址和源IP地址,路由器依靠此信息为数据包选择路由
表示的形式:常用点分形式,如202.38.64.10,最后都会转化成一个32位的无符号整数
mobileIPV6:local IP(本地注册的IP),roma IP(漫游IP)
特殊IP地址 :
局域网IP: 192.XXX.XXX.XXX 10.XXX.XXX.XXX
广播IP:xxx.xxx.xxx.255 255.255.255.255(全网广播) 网络风暴
组播IP:224.xxx.xxx.xxx ~239.xxx.xxx.xxx
3.端口号
16位数字,1-65535,
为了区分 一台主机接收到 的数据包 应该转交给哪个任务进程处理 ,使用端口号 来区别
预留端口,1-1023(FTP:24, SSH:22, HTTP: 80 ,HTTPS :469)
保留端口:1024-5000(不建议使用)
可以使用的端口: 5000~65535
TCP端口号于UDP端口号独立
网络里的通信是由 IP地址+端口号 来决定的
4.字节序
字节序是指不同的CPU访问内存中的多字节数据时候,存在大小端的问题
如果CPU访问的是字符串,则不存在大小端问题
一般来说X86/ARM : 小端模式
power/miop:arm作为路由时,大端模式
网络传输的时候采用大端模式
大端小端知识点:
一、定义
- 大端模式(Big Endian):在这种模式下,数据的高位字节(Most Significant Byte,MSB)存储在内存的低地址中,而数据的低位字节(Least Significant Byte,LSB)则存储在内存的高地址中。这类似于人类从左到右的书写习惯,最高有效位(MSB)在左,最低有效位(LSB)在右。
- 小端模式(Little Endian):与小端模式相反,数据的低位字节存储在内存的低地址中,而高位字节则存储在内存的高地址中。这类似于逆序书写,从右到左的顺序。
二、示例
以16位整数0x1234为例:
- 在大端模式下,其在内存中的表示是0x12 0x34,即高位字节0x12在前,低位字节0x34在后。
- 在小端模式下,其在内存中的表示是0x34 0x12,即低位字节0x34在前,高位字节0x12在后。
三、优缺点
- 大端模式的优点 :
- 符号位在所表示的数据的内存的第一个字节中,便于快速判断数据的正负和大小。
- 小端模式的优点 :
- 内存的低地址处存放低字节,所以在强制转换数据时不需要调整字节的内容(例如,将int的4字节强制转换成short的2字节时,可以直接使用int数据存储的前两个字节)。
- CPU做数值运算时从内存中依顺序依次从低位到高位取数据进行运算,直到最后刷新最高位的符号位,这样的运算方式会更高效。
在网络通信中,由于不同主机可能使用不同的大小端字节序,因此需要在网络协议中明确指定数据的字节序,以确保数据能够正确地被解析。例如,TCP/IP协议栈采用大端字节序进行传输, 因此在网络通信中,如果客户端和服务器运行在不同的体系结构 上(比如一个在小端CPU上,另一个在大端CPU上),就需要 进行字节序的转换。
字节转换函数 :
把给定系统所采用的字节序称为主机字节序,为了避免不同类别主机之间在数据交换时由于对于字 节序的不同而导致的差错,引入了网络字节序。
主机字节序到网络字节序
u_long htonl(u_long hostlong);
u_short htons(u_short short);
网络字节序到主机字节序
u_long ntohl(u_long hostlong);
u_short ntohs(u_short short);
IP地址的转换
inet_aton()
将strptr所指的字符串转换成32位的网络字节序二进制值
inet_addr()
功能同上,返回转换后的地址 仅适用于IPV4,出错时返回-1。 局限性:不能用于255.255.255.255的转换
inet_ntoa()
将32位网络字节序二进制地址转换成点分十进制的字符串
inet_pton()
int inet_pton(int af, const char* src ,void* dst)
将IPV4/IPV6 的地址转换成binary格式
使用于IPV4/IPV6
能正确处理255.255.255.255的转换问题
参数:
1.地址协议族(AF_INET或AF_INET6)
2.src:是一个指针(填写分点形式的IP地址(主要指IPV4))
dst:转换的结果给到dst
inet_ntop(int af,const void *src,char *dst,socklen_t size)
把ipv4和ipv6的网络字节序变成本地的字符串形式的IP地址 参数
1.af:地址协议族(AF_INET或AF_INET6)
2.src:是一个指针(32)
3.dst:输出结果为32位点分形式的IP地址
4.size:长度