一、网络通信基本概念
网络互连的目的是进行网络通信,也即是网络数据传输,更具体一点,是网络主机中的不同进程间,基于网络传输数据。
1、局域网 & 广域网
局域网 LAN:Local Area Network 其中 local 标识局域网是本地,局部组建的一种私有网络。局域网内的主机之间能方便的进行网络通信,又称为内网;
广域网 WAN:Wide Area Network 通过路由器,将多个局域网连接起来,在物理上组成很大范围的网络,就形成了广域网。广域网内部的局域网都属于其子网。
所谓 “局域网” 和 “广域网” 只是一个相对
的概念。如果属于全球化的公共型广域网,则称为互联网(又称公网,外网),属于广域网的一个子集。有时在不严格的环境下说的广域网,其实是指互联网。
2、IP地址
概念:IP地址主要用于标识网络主机、其他网络设备(如路由器)的网络地址。简单说,IP地址用于定位主机的网络地址。就像我们发送快递一样,需要知道对方的收货地址,快递员才能将包裹送到目的地。
格式:IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节),如:
01100100.00000100.00000101.00000110。常用“点分十进制”的方式来表示,即 a.b.c.d 的形式(a,b,c,d都是0~255之间的十进制整数)。如:100.4.5.6。
特殊 IP:127.*的IP地址用于本机环回(loop back)测试,IP 地址是127.0.0.1 本机环回主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输),对于开发网络通信的程序(即网络编程)而言,常见的开发方式都是本机到本机的网络通信。
3、端口号
概念:端口号是用于标识网络通信中特定应用程序或服务的数字标识符。在网络通信过程中,数据通过不同的端口号来传输到正确的应用程序或服务。类似发送快递时,不光需要指定收货地址(IP地址),还需要指定收货人(端口号)。
格式:端口号是 0~65535 范围的数字,在网络通信中,进程可以通过绑定一个端口号,来发送及接收网络数据。
注意事项:同一主机两个不同的进程,不能绑定同一个端口号,但一个进程可以绑定多个端口号。
4、协议
有了 IP 地址和端口号,可以定位到网络中唯一的一个进程,但还存在一个问题,网络通信是基于二进制 0/1 数据来传输,如何告诉对方发送的数据是什么样的呢?
网络通信传输的数据类型可能有多种:图片,视频,文本等。同一个类型的数据,格式可能也不同,如发送一个文本字符串“你好!”:如何标识发送的数据是文本类型,及文本的编码格式呢?基于网络数据传输,需要使用协议来规定双方的数据格式。
概念:协议,网络协议的简称,网络协议是网络通信(即网络数据传输)经过的所有网络设备都必须共同遵从的一组约定、规则。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。协议(protocol)最终体现为在网络上传输的数据包的格式。
5、知名协议的默认端口
系统端口号范围为 0 ~ 65535,其中:0 ~ 1023 为知名端口号,这些端口预留给服务端程序绑定广泛使用的应用层
协议,如:
- 22端口:预留给SSH服务器绑定SSH协议
- 21端口:预留给FTP服务器绑定FTP协议
- 23端口:预留给Telnet服务器绑定Telnet协议
- 80端口:预留给HTTP服务器绑定HTTP协议
- 443端口:预留给HTTPS服务器绑定HTTPS协议
二、TCP/IP 五层模型
1、TCP/IP 协议簇
在网络通信中,面对复杂度的环境就需要约定复杂的协议,协议太过于复杂,可以拆分为多个协议,通过对拆分的协议进行分类,对不同的类别进行分层,就约定了层级和层级之间的调用关系:要求上层协议调用下层协议,下层协议给上次协议提供支持,不能跨层调用。
协议分层的好处:
- 类似于面向接口编程:定义好两层间的接口规范,让双方遵循这个规范来对接。
- 对于使用方来说,并不关心提供方是如何实现的,只需要使用接口即可。
- 对于提供方来说,利用封装的特性,隐藏了实现的细节,只需要开放接口即可。
这里所说的 TCP/IP 协议是一种网络协议套件,它包含了多个协议,包括物理层、数据链路层、网络层、传输层、应用层 等多个层次。这些不同层次的协议共同构成了一个完整的网络协议体系。
TCP/IP通讯协议采用了五层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求:
- 应用层:应用层是TCP/IP模型的最顶层,包含了各种网络应用程序,它主要关注的是传输过来的数据要干啥用。其中一种广泛使用的应用层协议 HTTP、HTTPS。
- 传输层:负责两台主机之间的数据传输,不考虑中间路径,只关心起点和终点,能够确保数据可靠的从源主机发送到目标主机。比较常见的传输层协议有 TCP、UDP。
- 网络层:负责地址管理和路由选择,进行两个遥远网络结点之间路径规划。例如在网络层 IP 协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。
- 数据链路层:负责设备之间的数据帧的传送和识别,主要关注两个相邻结点之间的传输。例如通过物理地址(如MAC地址)在相邻节点之间传输。数据链路层最典型的协议 以太网协议。
- 物理层:负责光/电信号的传递方式,通常指网络通信的基础设施。网线、光纤、网络接口等。
2、在协议分层的背景下,数据如何通过网络传输?
答案就是:封装和分用
- 封装:发送方发送数据,要把数据从上到下,依次交给对应的层次的协议,进行封装。
- 分用:接收方接收数据,要把数据从下到上,依次交给对应的层次的协议,进行解析。
(1)忽略中间转发过程的封装分用
以李华使用微信给小明发送一条消息“Hello world”为例。下面是李华发送消息的封装过程:
- 首先在应用层,李华主机上的微信应用程序拿到上述数据后,首先会使用相应的应用层协议,将数据封装为应用层数据包。
- 接着应用层调用传输层提供的 API 来处理这个数据,传输层拿到上述数据后,会使用传输层的协议对数据再次封装,上图以 UDP 协议为例。
- 传输层调用网络层,网络层拿到 UDP 数据包后,使用网络层协议继续进行封装,上图以 IP 协议为例。
- 网络层调用数据链路层,数据链路层拿到 IP 数据包后,使用数据链路层协议进行封装,上图用经典的以太网协议为例:
- 数据链路层调用物理层,物理层拿到以太网数据帧后,就将上述的 0/1 二进制数据转化为光信号、电信号等进行传输。
以下是小明接收消息的分用过程:
在物理层,小明的主机通过网卡接收到高低电平的二进制信号,通过信号解析,还原成 0/1 这样的二进制序列。
接着物理层调用数据链路层,使用以太网协议,将上述 0/1 二进制数据还原成以太网帧,然后把帧头、帧尾去掉,取出以太网数据包的载荷,向上提交给网络层(以太网中有一个字段标志着网络层协议类型)。
网络层拿到载荷后,根据载荷协议类型,这里是 IP 数据包进行解析,然后去掉 IP 报头,取出载荷向上提交给传输层(IP 数据包中有一个字段标志着传输层协议类型)。
传输层拿到载荷,根据载荷协议类型,这里是 UDP 数据包进行解析,去掉 UDP 报头,取出载荷,根据端口号上交给应用层。
应用层中的微信应用程序拿到载荷后,根据相应的应用层程序对载荷内容进行解析,取出相应的字段显示到前端页面。
(2)真实网络环境中的封装分用