基础知识
网络发展背景:
网络的划分:局域网(覆盖范围在1000m以内)、城域网(覆盖范围在20km以内)、广域网(更大范围)
组网方式:以太网、令牌环网....
日常名词:互联网,因特网----说的是一个网络,就是国际化的广域网
网卡:实现数字信号与电信号之间的转换
中继器:信号放大,端口只有两个
集线器:端口更多的中继器(广播)
交换机:端口更多,并且支持广播,组播,单播
路由器:对数据路径进行选择
网络就是由大量的路由器互相连接,组成的一个复杂的星型网络
小明在大阪,小红在洛杉矶,小明给小红发送一条信息,怎么确保发给的是小红呢?不是给别人
1.IP地址
IP地址:网络中每一台主机的唯一标识
并且网络传输的数据中,必然都会包含两个要素:源端IP地址,目的端IP地址,这两个信息标识的起点与终点,知道了数据从哪儿来到哪儿去。
网络中的路由器,就会辨别这个目标主机IP地址属于哪个网络,然后规划路径将数据发送到对应网络。
目标地址:明确目标网络,进行网络中的路径规划
源端地址:让对方知道数据来源,便于进行回复的时候知道回复哪里
IP地址本质: uint32_t类型的数据---无符号32位的整形数字
IPV4------uint32_t类型,最大数字2^32-1,大概为42亿9千万,也就是说IP地址在实际使用中不够用。
IPV6------uint8_t ip[16]-----128位的数据。相当于2^32 * 2^32 * 2^32 * 2^32,永远用不完的数据。
但是IPV6并不向前兼容ipv4,也就是如果直接使用ipv6标准的通信,以前基于ipv4的设备,程序用不了,因此推广很慢,当前主要的网络通信还是基于IPV4的通信。
DHCP技术----动态地址分配技术(谁上网分配给谁)
NAT技术:网络地址转换技术--应用于私网的组建(私网中大量主机可以使用同一个公网地址进行上网)
通过IP地址可以实现网络中指定的两台主机之间的通信;
小明给小红发的是QQ消息,为什么这个QQ消息就一定是Q这个程序处理的,而不是主机上的xshell处理,因此网络中传输的数据,比必须在一条主机上标识应该由那个进程来处理。
2.端口
端口:在一台主机上用于唯一标识一个网络通信进程的
本质: uint16_t-- 无符号16位的整数
因此网络传输的数据,不但有源端IP,对端IP,还需要:源端端口,对端端口
这两个信息描述了,两台主机上的那两个进程之间的通信(理解:网络通信其实也是一种进程间通信)
一个端口只能属于一个网络的通信进程,但是一个网络通信进程可以使用多个端口;
一个网络通信进程来了之后,会告诉系统和网卡收到的数据中,那个数据应该交给自己来处理(告诉系统自己用了那些端口)
为什么为了标识一个网络通信进程,要单独列出来一个端口概念,而不使用进行PID
原因:进程ID在程序重启后就会改变
实际网络通信中,必然有一端主机的地址和端口是固定的,让所有人都知道的。
这一端通常叫做服务端(为用户提供服务的一端)
网络应用提供商,都会搭建自己的服务器端,向外发布客户端程序中都封装了自己的服务器地址信息在里面
3.协议
明确了自己的IP地址,端口和对端的IP地址和端口,这时候就可以实现两个主机上指定进程之间的通信小明给小红发送了一条: 我想你了
对应的二进制 010111110001111xxxx转换为电信号的高低电平进行传输
但是如果小明和小红的主机上的网卡是不同厂商生产的,他们对于高低电平的波长解释不同,就会导致 010101111,实际对方收到的是101011111.
可能就被翻译成为:吃了吗
小红回复了: 还没呢
小明收到了: 收到的数据被解释成为--滚蛋
这时候的小明和小红,并没有形成实质上的通信
协议:网络协议就是网络通信中的数据格式约定,不同的主机必须遵循相同的网络通信协栈(一组协议)才可以实现实质通信
小明和小红进行通话: 上层必须都使用中文,下层必须都使用手机 (2G/3G/4G/5G--网络频段)
这里的中文,以及手机频段都是一种协议; 因此网络通信使用的不是单个协议,而是一组协议
国际标准化组织这时候就订立各种协议标准,大家想要通信都必须使用相同的这条标准协议进行。并且对协议进行了分层:
协议分层: 按照网络通信环境,不同层次所提供的服务,使用的协议,提供的接口对整个通信环境进行了分层
OSI七层网络互联模型: 应用层,表示层,会话层,传输层,网络层,链路层,物理层但是因为OSI七层模型划分的过于细致,导致实现起来过于复杂
因此其他组织在这个基础上提出了TCP/IP五层模型:
应用层:负责应用程序之间的数据沟通的格式约定(QQ与QQ的沟通协议,SSH); 典型协议: HTTP,SSH,SMTP,FTP,...
传输层:负责进程之间的数据传输的格式约定; 典型协议: TCP/UDP (内部就描述了源端端口,对端端口)
网络层:负责地址管理与路由选择; 典型协议: IP协议 (内部描述了源端IP,对端IP); 典型设备: 路由器
链路层:负责相邻设备之间的数据传输; 典型协议: ETH协议--以太网协议(内部描述了相邻设别的MAC地址), 典型设备: 交换机
物理层: 负责物理光电信号的传输; 典型协议: 以太网协议 (与组网技术有关)
其中,应用层可以自己修改,红框内的层不能修改,只能选择操作系统提供给你的协议。
从数据到物理层发送,层层的过程叫封装
从物理层到解析数据,层层过程叫分用
MAC地址
4.网络字节序
字节序: cpu对内存中数据以字节为单位进行存取的顺序
分类:内存地址有高低地址之分, 数据二进制有高低位之分,,数据在内存进行存储,从低地址开始存储,到底先存高位还是低位
int a = 0x01020304
大端字节序: 低地址存高位 01 02 03 04
小端字节序: 低地址存低位 04 03 02 01
字节序所针对的数据类型: 存储单元大于1字节的数据类型--shot,int,long,flat,double(单字节存储的数据是不存在字节序问题的,比如char
主机字节序不同对于网络通信的影响:
如果网络通信的两台主机,主机字节序相同,则可以不用考虑字节序问题但是如果不同,就有可能会造成数据二义;
数据的传输一定是发送了什么数据,对方就接收什么数据
大端主机: inta = 0x01020304; 01020304 -> 01020304 小端主机解释: 004030201
解决方案: 网络传输的数据,使用统一的字节序标准 --- 网络字节序(采用的是大端字节序)
不需要关心对方主机的字节序了,因为对方发送到网络中的数据都是网络字节序的,你只需要根据自己的主机字节序进行转换即可
因此注意:如果编写网络程序要考虑跨平台问题,存储单元大于1字节的数据类型对应的数据,就要使用网络字节序进行通信