🎇个人主页:Ice_Sugar_7
🎇所属专栏:计网
🎇欢迎点赞收藏加关注哦!
网络初识
- 🍉IP 地址 & 端口号
- 🍉网络协议
- 🍌TCP/IP 网络协议
- 🍉封装和分用
- 🍉服务器 & 客户端
- 🍉TCP & UDP
🍉IP 地址 & 端口号
以生活中网购举例,我买东西后商家发货需要知道我的地址,知道地址才知道要把快递送到哪里,还要有我的手机号(收件人电话),这样快递小哥才可以联系到我,通知我取件
类比到网络中,收件人地址就是 IP 地址;收件人电话就是端口号
IP 地址使用数字描述了一个设备在网络上的位置,这个数字是一个 32 位整数,为了方便表示,我们往往会把 IP 地址表示成点分十进制的形式:使用 3 个 . 把这 4 个字节分成 4 个部分,每部分 1 个字节,取值范围为 0-255(字节的取值范围)。比如 192.168.2.101
有了 IP 可以确定主机,但是一台主机上可能有多个程序在使用网络,所以用端口号来区分一个主机上不同的应用程序,主机收到网络数据后就可以根据端口号把数据交给对应的程序使用
每个程序在网络通信的过程中都需要有一个端口号,端口号也是一个整数,可以是用户手动指定的,也可以是系统自动分配的,不管是哪种,都遵循一个规则:程序之间使用的端口号不能冲突
其实在一次网络通信的过程中,涉及到的 IP 和 端口号各有两个。在上述网购的例子中,快递上除了有我的地址、手机号,还有商家的发货地址和手机号。为了区分,将收件人地址、电话分别称为目的 IP 和目的端口;将寄件人地址、电话分别称为源 IP 和源端口,从哪儿来的就称为源,到哪儿去就称为目的
🍉网络协议
协议是网络中的一个核心概念
所谓协议,就是一种通信过程中的约定,发送方和接收方需要提前商量好数据的格式,才能确保二者之间能正常沟通
网络通信过程中涉及到的细节其实是非常多的,需要约定好各方各面的内容,如果只用一个协议来完成通信,那么这个协议会非常复杂
所以使用多个协议,每个协议约定好其中一小部分内容。因为协议比较多,所以引入协议分层,把功能定位相似的协议放在同一层,让这些协议能更好地配合。上层协议会调用下层协议的功能,下层协议给上层协议提供服务,同时规定只有相邻的层次可以沟通,不能跨层次调用(否则容易混乱)
🍌TCP/IP 网络协议
TCP/IP 网络模型由五个层次构成,从上到下分别为:
- 应用层:关注传输的数据在应用程序中如何使用
- 传输层:负责网络数据包的端到端之间的传输,即关注从哪里来,到哪里去
- 网络层:负责起点到终点之间的路径规划
- 数据链路层:负责两个相邻节点之间的传输
- 物理层:通信过程中的基础设施
对于一台主机,它的操作系统内核实现了从传输层到物理层的内容,也就是 TCP/IP 五层模型的下面四层
对于路由器,它实现了从网络层到物理层,也就是下面三层
对于交换机,它实现了从数据链路层到物理层,即下面两层
🍉封装和分用
这两个操作是网络传输数据中最核心的流程,下面以发送消息为例进行说明
比如 A 通过微信给 B 发送一个 hello
- 封装
在把消息发送出去之前,会进行一系列封装
首先在应用层,微信会从消息输入框获取到输入的 hello,然后把这个字符串构造成一个应用层的数据包,微信这样的程序内部设置了一个应用层协议,这个协议往往是实现这个程序的程序员自己定义的。应用层数据包就是按照应用层协议约定的格式来构造的
假设约定的格式为:发送方的微信号;接收方的微信号;发送时间;正文
那么 hello 就会构造成这样的数据包:

然后传输层会把上述数据作为一个整体,再构造成一个传输层的数据包。传输层涉及到的协议主要是 TCP 和 UDP,这里为了简便,假定是使用 UDP 来进行通信,就会构造成一个 UDP 的数据包,如下:

像上面这种添加报头的过程,就称为封装(这里的封装和我们之前面向对象提到的封装差异是比较大的),所谓的封装其实就是字符串拼接,只不过拼的报头具有一定的结构
报头就好比是快递袋上面贴的标签,可以承载一些用来转发数据的关键信息。对于 UDP 报头来说,承载的最重要的信息就是源端口和目的端口
拼好传输层数据包之后就要把这个数据包进一步交给下层——网络层,继续进行封装
这里的交给下层指的是下层协议提供一组 api 或方法,上层调用 api 或方法,并把刚才构造好的数据通过参数传过去,这样下层协议就可以来处理这个数据
接下来到了网络层,这里涉及到的最核心的协议就是 IP 协议。网络层会把刚才传输层的 UDP 数据包作为一个整体,再拼上 IP 协议的报头,构成一个 IP 数据包

构造成完整的 IP 数据包后,IP 协议会继续调用数据链路层的 api,把数据交给数据链路层的协议进行处理
数据链路层涉及到的核心协议是以太网,以太表示网络数据传输的介质,以太网会把 IP 数据包作为一个整体,在其前后分别添加上帧头和帧尾,组成以太网数据帧

接下来就会把这样的数据交给物理层
物理层会把以太网数据帧中二进制结构转换为光信号/电信号/电磁波,然后发送
经过上面一系列操作,数据才从你的电脑/手机上发送出去
- 分用
数据包到达 B 的网卡后,B 处理数据包的过程就称为分用。分用就是封装的逆过程
首先 B 的物理层收到光信号/电信号/电磁波后会把物理信号转换为数字信号(二进制序列),得到一个以太网数据帧,进一步把这个数据帧交给数据链路层处理
到达数据链路层后以太网协议会解析以太网数据帧,取出其中的载荷交给上层协议
在网络层会按照 IP 协议的格式进行解析,取出载荷再交给上层协议
在传输层按照 UDP 协议格式来解析,同样取出载荷交给上层
最后在应用层按照微信应用程序内部的应用层协议格式来解析数据,微信程序拿到这些信息之后,就会在 B 的设备中弹出提示,并把消息显示在聊天窗口上
从 A 发出到 B 接收,中间还要通过一系列交换机或路由器进行数据转发,不过即使经过交换机或路由器,上面的封装、分用过程仍然适用,只不过封装分用的程度不一定到应用层

在上图中,假设从 A 右边第一个节点是交换机,那么这个交换机就会把上述光电信号转换为以太网数据帧二进制数据,交给数据链路层,它就会对上述数据进行解析。在解析过程中,一方面要取出载荷部分,另一方面要解析帧头中的关键信息,根据帧头中的信息决定下一步要把数据发送到哪里,由此再构造出新的以太网数据帧
🍉服务器 & 客户端
在网络中,主动发起通信的一方称为客户端;被动接受的一方称为服务器
客户端给服务器发送的数据称为请求(request);服务器根据请求给客户端返回的数据称为响应(response)
同一个程序在不同的场景中,可能是客户端,也可能是服务器

🍉TCP & UDP
TCP 和 UDP 是传输层涉及到的两个协议
TCP 有四个特点:有连接、可靠传输、面向字节流、全双工
UDP 也有四个:无连接、不可靠传输、面向数据报、全双工
下面简单说一下这些特点
首先是连接,这里的连接是抽象意义上的连接,即虚拟的连接。比如打电话就是有连接的通信方式,我这边打电话给你,你得先接通了,然后我才能说话,你可以接,也可以不接;而无连接则是发微信这种方式,不管你同意与否,我都可以发消息(不拉黑的前提下)
连接本质上是记录对方的信息。客户端有一些数据结构记录谁是它的服务器;与之对应,服务器也有一些数据结构记录谁是它的客户端
然后就是传输的可靠性,在这里谈到的可靠传输是指发送方能够知道对方是否收到了当前数据(具体的实现与 TCP 的确认应答、超时重传有关,这两个机制会在后面讲),而不是保证数据 100% 到达对方那里
接下来几个特点放在一张图里面对比:
