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)测试,通常是127.0.0.1
本机环回主要用于本机到本机的网络通信 (系统内部为了性能,不会走网络的方式传输),对于开发网络通信的程序(即网络编程)而言,常见的开发方式都是本机到本机的网络通信。
IP地址解决了网络通信时,定位网络主机的问题,但是还存在一个问题,传输到目的主机后,由哪个进程(应用程序)来接收这个数据呢?这就需要端口号来标识。
端口号
概念
在网络通信中,IP地址用于标识主机网络地址,端口号可以标识主机中发送数据、接收数据的进程。
简单说:端口号用于定位主机中的进程。类似发送快递时,不光需要指定收货地址(IP地址),还需要指定收货人(端口号)
格式
端口号是0~65535范围的数字,在网络通信中,进程可以通过绑定一个端口号,来发送及接收网络数据。
注意:
两个不同的进程,不能绑定同一个端口号,但一个进程可以绑定多个端口号
(就好比快递一般填写一个收件人, 不填两个)
一个进程启动后,系统会随机分配一个端口.(启动端口)
在程序代码中,进行网络编程时,需要绑定端口号(收发数据的端口)来发送、接收数据。
协议
为什么要有协议
有了IP地址和端口号,就可以定位到网络中唯一的一个进程,但还存在一个问题,网络通信是基于二进制 0/1 数据来传输,如何告诉对方发送的数据是什么样的呢?
网络通信传输的数据类型可能有多种:图片,视频,文本等。
同一个类型的数据,格式可能也不同,如 :
发送一个文本字符串“你好!”, 如何标识发送的数据是文本类型,及文本的编码格式呢?
基于网络数据传输,需要使用协议来规定双方的数据格式。
简单来说, 协议就是规则, 就像我们聊天用到的语法什么的, 正是有了这些规则, 我们才能更清楚的表达自己的意思, 别人也能更明白.
概念
协议,网络协议的简称,网络协议是网络通信(即网络数据传输)经过的所有网络设备都必须共同遵从的一组约定、规则。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。通常由三要素组成:
1.语法:即数据与控制信息的结构或格式;
类似打电话时,双方要使用同样的语言:普通话
2.语义:即需要发出何种控制信息,完成何种动作以及做出何种响应;
语义主要用来说明通信双方应当怎么做。用于协调与差错处理的控制信息。
类似打电话时,说话的内容, 双方基于内容来进行响应.
3.时序,即事件实现顺序的详细说明。
时序定义了何时进行通信,先讲什么,后讲什么,讲话的速度等。比如是采用同步传输还是异步传输。
协议最终体现为在网络上传输的数据包的格式.
协议分层
为什么要进行分层
在网络通信中, 需要约定的协议是非常复杂的, 面对复杂环境, 就需要复杂协议, 但是协议复杂了也不好, 那如何将复杂协议便简单呢, 可以将一个复杂协议拆分为多个小协议.
我们可以对这些小协议进行 “分类”, 同时对这些不同类别进行分层.
我们约定 : 上层协议调用下层协议, 下层协议给上层协议提供支持, 不能跨层调用.
分层的好处
像下面就是将协议分为了两层 :
分层后就可以比较容易的针对某一层协议进行替换.
总结 :
- 分层之后就可以做到层次之间, 耦合度较低.
上层协议不必了解下层的细节, 下层也不必要了解上层的细节.
- 方便对某一层协议进行替换.
具体如何分层
有两大分层模型 :
- OSI 七层网络模型, 该模型复杂且不实用, 只存在于教科书中, 就不了解了.
- TCP / IP 五层网络模型, 这是当下最广泛使用的网络模型.
TCP / IP 五层网络模型
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。
TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
哪五层呢? 它们分别是 应用层, 传输层, 网络层, 数据链路层, 物理层.
下面详细介绍下这五层的主要作用都有哪些.
1.应用层 :
负责应用程序间沟通,如简单电子邮件传输、文件传输协议、网络远程访问协议等.
网络编程主要就是针对应用层.
简单理解 : 应用层主要关注传输的数据怎么用.
2.传输层 :
负责两台主机之间的数据传输。如传输控制协议,能够确保数据可靠的从源主机发送到目标主机。
简单理解 : 传输层不关注中间路径, 只关注起点和终点.
3.网络层 :
负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路。路由器工作在网路层。
简单理解 : 网络层主要负责两个较远节点间的路径规划.
4.数据链路层 :
负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步、冲突检测、数据差错校验等工作。
简单理解 : 数据链路层主要关注两个相邻节点间的传输.(就是将数据通过什么形式传输, 比如通过网线/光纤/无线传输. )
5.物理层 :
负责光/电信号的传递方式。比如现在以太网通用的网线、早期以太网采用的的同轴电缆、光纤,现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。
简单理解 : 物理层就是网络通信的基础设施, 比如 : 网线, 光纤, 网络接口等, 它们相当于网络上的高速公路.
这样分层之后, 可以让程序员在同一时刻只关注一个子问题, 大大提升了效率.
数据的封装和分用
有了协议分层后, 数据是如何通过网络传输的呢?
这里就要提到封装和分用了.
封装 : 发送方发送数据时, 要把数据从上到下, 依次交给对应层次的协议进行封装.
分用 : 接收方接收到数据时, 要把数据从下到上, 依次交给对应层次的协议进行解析.
就以QQ发送消息为例吧, 比如, 我给张三发个消息 : 兄弟, 帮我拿个快递.
首先这里的数据要进行封装, 是从上到下进行的, 分这几步 :
1.应用层(qq应用程序)拿到上述基本数据, 进行封装, 封装成应用层数据包.(本质上就是字符串的拼接)
2.传输层要调用传输层提供的 api 来处理这个数据. 传输层有很多协议, 最典型的是 TCP 和 UCP, 这里就以 UDP 为例, UDP 针对上述数据包在进行封装(加个数据报头).
加个报头是为了再贴一层标签, 从而在标签上填写必要的属性, 在传输层最重要的属性就是源端口和目的端口了.
UDP 数据报已经有了, 接下来就要将这个数据报交给网络层的协议了.
3.网络层, 网络层最常见的协议就是 IP 协议了. 上述 UDP 数据报到达网络层还需要进一步进行封装, 添加上 IP 协议报头.
源 IP 和目的 IP 就描述了这次传输中, 最初的起点, 和最终的终点.
4.数据链路层, 最典型的协议叫做以太网, 在这里需要加上以太网帧头和帧尾.
mac 地址也叫做物理地址, 也是描述一个主机在网络中的位置, 它的功能和 IP 很相似, 但有所不同.
IP 是用来进行网络层的路径规划, mac 是用来描述数据链路层的两个即将进行传输的相邻节点.
5.物理层要把上述 0101 的二进制转换为信号(光信号/电信号/电磁波信号)进行传输.
当接收方收到数据时, 就会对数据进行分用, 如果将上述操作比喻为包装快递, 那分用就是拆快递了.
封装快递是从里面一层一层的往外面封装, 那拆快递就是从外面一层一层往里面拆.
1.物理层, 网卡收到高低电平二进制数据, 就对信号进行解析, 还原成 0101 这样的二进制序列.
2.数据链路层, 将上述还原出的数据当成一个以太网数据帧(根据传输的方式不同, 使用不同的协议. 这里使用以太网线接收数据, 就交给以太网协议来处理).
将会帧头帧尾去掉, 再将载荷交给上一层(网络层).
3.网络层, 此时就由网络层的 IP 协议进行解析数据报, 也就是去掉 IP 报头, 同时做一些其他工作.
最重要的还是取出载荷, 交给更上层的传输层协议.
4.传输层, 由 UDP 来解析处理, 去掉报头, 取出载荷, 把数据传给应用层.
5.应用层, 由QQ这个程序解析得到的数据报, 取出相应字段放到程序对应的界面中, 也就是张三收到了我发送的消息.
客户端和服务器
服务端:在常见的网络数据传输场景下,把提供服务的一方进程,称为服务端,可以提供对外服务。
客户端:获取服务的一方进程,称为客户端。
针对客户端提出的请求, 服务端作出相应响应.
常见的客户端服务端模型
- 客户端先发送请求到服务端
- 服务端根据请求数据,执行相应的业务处理
- 服务端返回响应:发送业务处理结果
- 客户端根据响应数据,展示处理结果(展示获取的资源,或提示保存资源的处理结果)