网络的划分:局域网(几米到几千米);城域网(几千米到几十千米);广域网(几十千米以上)
IP地址
IP地址是一个无符号4个字节的整数uint32_t
,在网络中作为主机的唯一标识
网络中的每条数据中都会包含源端IP地址和对端IP地址----标识这个数据从哪个主机发出,要交给哪个主机来接收
ip地址最大有32个,最多只能表示出4g的IP地址数量,也就是最多能使用43亿个IP地址,地球上的人和每个人都用肯定是不够的。也是目前使用最多的IPv4协议。为了满足该要求,扩展到IPv6协议,能用128位来表示IP地址,uint8_t addr[16]
这就可以从根本上解决了我们的IP地址数量问题。但是目前还并未推广,目前大多数程序都是遵循IPv4协议来设计的,如果要改变协议,成本和时间的代价会很大。而且现在有DHCP和NAT技术配合上IPv4可以缓解该问题
端口
端口号是一个无符号2个字节的整数uint16_t
,在一台主机上唯一标识一个进程。在编写通信程序时,必须告诉计算机,发往哪个端口的数据应该交给我处理。一个端口只能被一个进程占用,但是一个进程可以使用多个端口(多端口多服务)。
在网络通信的每条数据中,都会包含源端端口号和 对端端口号----标识了这个数据从哪个进程发送出来,要交给哪个进程来处理
网络通信协议
计算机之间的传输媒介是光信号和电信号. 通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息. 要想传递各种不同的信 息, 就需要约定好双方的数据格式
网络通信协议:网络通信中的数据格式约定(协议-约定)----遵循统一协议标准,才能实现实质通信,实现网络互联。
协议分层:根据通信场景不同,提供的服务不同,使用的协议不同进行的层次划分。典型协议分层有两种,OSI七层参考模型 和 TCP/IP五层模型
OSI七层参考模型
该模型采用分层结构化信息,将整个网络按照功能划分为7层,由低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP五层模型
TCP/IP五层模型 | 功能 | 协议及设备 |
---|---|---|
物理层 | 负者物理光电信号的传输 | 以太网协议(ETC),典型设备集线器 |
链路层 | 负者相邻设备之间的数据传输,网卡硬件地址的描述 | 以太网协议(MAC地址),典型设备交换机 |
网络层 | 负责地址管理和路由选择,主机IP地址的描述 | IP协议,典型设备路由器 |
传输层 | 使源端和目的端主机上的对等实体可以进行会话,端与端的描述 | TCP、UDP |
应用层 | 面向用户的层次,为用户提供服务,负责应用程序之间如何沟通,通信数据格式的约定 | HTTP、FTP、DNS、DHCP |
网络通信数据的封装与拆封流程
AP1 先将其数据交给本主机的应用层。在应用层,将应用程序数据加上必要的控制信息(应用层的报头)Hs就变成了应用层的协议数据单元(数据包),向下传给传输层。报头(Header)及报尾(Tailer)是对等实体间为了实现有效的相互通信所需加上的控制信息,增加报头、报尾等控制信息的过程称为封装。封装后得到的应用层数据包被称为应用层协议数据单元(APDU)。
传输层收到这个数据单元后,加上本层的控制信息 H4、变成了传输层的协议数据单元,即分段(Segment),向下交给网络层。网络层收到这个分段后,加上本层的控制信息 H3就变成了网络层的 IP 分组,并向下交给数据链路层。在数据链路层;控制信息被分成两部分,分别加到收到的 IP 分组的首部(H2)和尾部(T2),变成数据链路层的帧(Frame)。帧再向下传到物理层,由于物理层是比特流的传送,所以不再加控制信息。此时比特流传送从首部开始。再往下,将其转换为电信号或光信号通过传输介质传送到接收端。
在接收端,当数据逐层向上传递时,各种报头及报尾将被一层一层地剥去,这样的过程称为拆封。例如,数据链路层在将数据交给网络层之前要去掉相应的帧头和帧尾,还原成网络层的IP分组,网络层则在将数据交给传输层之前要去掉分组报头,以此类推,最后数据以APDU 的形式到达接收方的应用层。
网络字节序
字节序:cpu对数据在内存中以字节为单位的存取顺序
主机字节序:一个主机字节序的大小端取决于cpu架构—X86 / MIPS
大端字节序:低地址存高位
小端字节序:低地址存低位
例如int a = 0x01020304在大小端不同的存储方式
char* b = (char*)&a 内存低地址 b[0] b[1] b[2] b[3] 内存高地址
大端字节序:b[0] = 01 b[1] = 02 b[2] = 03 b[3] = 04
小端字节序:b[0] = 04 b[1] = 03 b[2] = 02 b[3] = 01
主机字节序对网络通信的影响:不同字节序的主机进行通信容易造成数据二义
网络字节序:是网络通信中的字节序标准(将自己的数据的字节序转换成标准字节序后再进行传输),从而避免了因为主机字节序不同而造成的数据二义。网络字节序的标准是大端字节序
并非所有的数据都要进行网络字节序的转换
如何判断哪些数据需要字节序转换:存储单元大于一个字节的数据类型需要字节序转换,例如int16_t
、int32_t
、int64_t
、short
、long
等。以单字节为存储单元的数据不需要字节序转换,例如uint8_t
、char
等
如何判断一主机是大端字节序还是小端字节序
TCP协议和UDP协议的区别及使用场景
1、TCP是面向连接的传输层协议。UDP是无连接传输层协议,面向数据报
2、TCP是点对点服务。UDP是多对多连接交互通信
3、TCP是可靠的、无差错、无丢失、面向字节流的通信协议,速度慢但是是可靠传输。UDP是尽最大努力交付,速度快但不保证可靠性。
使用场景
TCP:应用于安全性要求高的场景(文件传输)
UDP:应用于实时性要求高的场景(视频,音乐传输)