目录
一、了解IP地址:
二、了解端口号:
三、网络协议
网络协议的三要素:
①语法
②语义
③时序
四、协议的分层(TCP/IP五层模型)
①应用层
②传输层(也称为运输层)
③网络层
④数据链路层
⑤物理层
五、A用户通过QQ给B发送一个字符串,会经历怎样的过程
经历的第一层:应用层
经历的第二层:传输层
经历的第三层:网络层
经历的第四个阶段:数据链路层
经历的第五层:物理层
IP地址主要用于标识网络主机。可以理解为,IP是一台主机的网络地址
如果想让本机和其他的电脑或者云端的服务器建立网络通信,那么就需要获取到对方电脑的IP地址。我们可以认为,任意两个不同的服务器(电脑)的IP都是不一样的。
IP地址一般都是采用"点分十进制"的方式来进行表示的(a.b.c.d),如"100.4.5.6"这样的表示方式。
同时,a,b,c,d都是0~255之间的十进制整数。
特殊的IP:127.0.0.1,这个IP地址仅仅用于表示本机到本机的网络通信.
端口号用来标识主机当中用来发送数据、接收数据的进程。
简单来说,端口号就是用来标识一台主机当中的进程。
在网络通信当中,进程可以通过绑定一个端口号,来发送、接收网络数据。
我们常说的MYSQ应用程序占用的是3306端口号。那么,如果想在本机连接云端的服务器的MYSQL数据库,那么就需要知道两个数据:
①云端服务器的IP地址;
②云端服务器的MYSQL占用端口号(默认为3306),这个端口就是用来接收数据的
可以这样抽象地理解:一栋楼当中,IP代表这栋楼的编号:例如1栋,2栋,3栋等等......
端口号为具体哪一家的门牌号,例如101、202、303等等......
如果外卖小哥想送餐到某一家用户当中,一定需要知道这一家在哪栋, 门牌号是多少
所谓的协议,其实就是网络通信(网络之间的数据传输)经过所有的网络设备都必须共同遵从的一组约定、规则。
例如怎样建立连接、怎样互相识别等等。只有遵守这个约定,计算机之间才可以进行相互通信交流。
数据与控制信息的结构或者格式。
这就好比,假如一堂课上面,有东北地区的学生,有中原地区的学生,有华南地区的学生。他们各自会讲各自的方言,但是,老师为了照顾所有的的同学,统一采用普通话授课这个道理一样。
因为,只有采用了普通话授课,大家才都可以知道老师在讲什么
需要对发出的信息完成何种动作来响应。
语义主要用来说明通信双方应当怎么做,用于协调与差错处理的控制信息。
例如:在课堂上,按照规定,老师布置了作业,那么学生就一定要去完成。
那么,学生完成老师布置的作业这个响应,就是语义
对事件的实现顺序的详细说明:
时序定义了何时通信,通信先讲什么,再讲什么,传输的速度等等。
简单来说,就是对通信的顺序进行一个简单的规定
在上述模型当中:越往上,越接近应用程序,越往下,越接近硬件设备。
上图当中,"应用层"、"表示层"、"会话层"这三层统一被称为应用层
下面,将分别介绍各个层的含义及其作用:
应用层只需要专注于为用户提供应用功能,负责应用程序间的沟通常见的应用层有:HTTP、FTP、Telnet、DNS、SMTP等。
当需要数据传输的时候,应用层就会把数据往下层传递,也就是传输层。
应用层工作在操作系统的用户态,而其他层面均工作在内核态
负责两台主机之间的数据传输
传输层协议为运行在不同主机上的应用进程之间提供了逻辑通信功能
传输层注重的是端到端之间的传输。常见的传输层协议有TCP,UPD等等的协议。
可以这样理解:
如果A主机想发送消息给B主机的mysql应用程序,那么A发送消息的时候,应当得知B主机的IP地址以及mysql应用程序占用了B主机的哪一个端口(假设是3306,并且B服务器的mysql应用程序已经启动了,只有启动了的应用程序才会占用端口)。
只有A指定了具体的消息是转发给B的哪一个端口,B主机才可以正确把消息传递给它占用3306端口的进程
需要注意的是,发送方和接收方的所有协议都需要一致。例如发出方使用了UDP协议,接收方一定也需要使用UDP协议
负责地址管理和路由器选择
网络层,负责网络输出传输路径的规划。
假如A主机向B主机发送了一个网络信号,那么这个信号通过哪些路径传输,可以效率最高,性能最好。
也就是主机与主机之间,负责传输数据的时候就需要通过网络层。
下面,想通过一个故事,来描述一下网络层和传输层:
如图:下面是两家人,小红一家,一共5人;小明一家,也是5人;
假如,他们两家人的交往都比较密切,每一周都需要互相写邮件。
根据常识,既然要写邮件,那么肯定要明确谁写给谁
比如: (Ⅰ)小红的妈妈写给小明的妈妈;
(Ⅱ)小红的爸爸写给小明的爸爸;
(Ⅲ)小红写给小明。
他们写好信之后,小红专门负责把他们一家写好的信收集起来,放到邮筒内;然后,运送邮件的车辆会每隔一段时间来把这些邮件运送到邮政局,然后邮政局又会把这些新建分组,最后放到小明一家的邮筒当中,由小明专门负责把他们一家收到的邮件分发给自己的家人。
以上写信的过程,可以进行一个这样的类比:
小明一家和小红一家各自视为一台主机
小红以及小红的家人各自视为小红家里的进程,小明一家同理
传输层的协议:小红和小明(TCP/UPD等等协议)
网络层协议:邮政服务
应用层报文=信封上面的字,也就是需要传输的信息
因此:
可以得出以下结论:传输层(运输层)仅仅工作在端系统,也就是自己的主机的系统。
运输层协议将来自应用进程所需要传输的信息送达到网络边缘(即网络层)
然后网络层就负责主机与主机之间的数据传输。
负责设备之间的数据帧的传送和识别
数据链路层,主要负责的是节点和节点之间的通信。
此处,我们需要知道网络通信当中什么是节点。
根据常识,我们的电脑如果想上网,通过qq或者微信发送消息的话,一定需要一个wifi,也就是路由器。
那么,可以这样理解,一个节点,就代表一台主机或者一台路由器或者一台交换机
因此,沿着通信路径连接,相邻节点的通信道路,称之为链路
网络层&数据链路层:
在上图当中,链路就是各个节点之间的连线,数据链路层负责的就是相邻节点之间的通信。
例如①链路或者②链路
而网络层,就负责路径的规划,是选择上面那一条路径比较好呢,还是下面那一条路径比较好呢?这个就交给网络层来负责处理。
也就是网络层负责规划主机1和主机2之间的通信是通过:
①链路--->②链路--->③链路--->④链路,还是
⑤链路--->⑥链路--->⑦链路这样的路径
我们常说的交换机,就是在数据链路层完成转发的
路由器就是在网络层完成转发的
传输层&数据链路层
需要注意的是,数据链路层,相当于是"执行法官",完成当前节点的目标传递节点,并且把传输的任务执行到位。而传输层,只是建立两个不同主机之间端口的联系
负责光/电信号的传递方式
例如像通信使用的网线、网口等等的设备。因此,咱们使用的网线、网口都是相同的规格的。这就是为了方便网络通信而进行的统一。
TCP/IP的五层模型当中,越往下的,越接近硬件设备,越往上的,越接近用户。
网络分层这里,相当于上层协议调用下层协议,下层协议给上层协议提供服务。
这就好像公司的领导架构一样:最高层是应用层,越往下就越来越接近公司的最基层。
并且下层一定需要听命于上层的指令。
总结:
层级 | 常见协议 | 传输单位 | 作用概括 |
应用层 | HTTP、SMTP | 文件 | 获取用户输入的信息,然后把这些信息传递给传输层 |
传输层 | TCP、UPD | 段 | 负责端到端之间的通信,把主机当中进程需要发送的信号传递到网络边缘。 |
网络层 | IP | 包 | 负责网络通信的路径规划,路由器选择 |
数据链路层 | 帧 | 负责两个相邻节点之间的数据以数据帧的格式传输 | |
物理层 | 电信号等等 | 把信息通过010001等二进制信号发送 |
假如A发送一个字符串"hello”给B用户,那么:
下面,假设存在这样的一个应用层的协议格式:发送方的QQ号,接收方的QQ号,发送的时间,发送字符串的内容:
发送者 | 接收者 | 发送时间 | 聊天内容 |
1234567 | 7654321 | 2023-1-14 | "hello" |
需要注意的是,应用层的数据,具体格式长什么样,这个其实是由程序员在代码的编写阶段规定的,并不是一个确定的格式。
应用层是以文件为单位进行传输的
应用层,通过调用操作系统的api,把应用层的数据交给传输层。(此时已经进入了操作系统内核了)
传输层协议,最常见的有TCP/UDP协议。
假如此处使用的是UPD协议。那么,首先会在应用层需要传输的数据的基础上面构造出一个UDP报头 这个报头是一个特定格式的字符串,会在后面的文章当中详细说明。
这里先简单介绍一下:UDP报头当中,会涉及到两个比较重要的信息:
源端口和目的端口
UDP报头(包含源端口和目的端口) | 1234567 | 7654321 | 2023-1-14 | "hello" |
除了UPD报头,往后的数据,也就是应用层传输来的数据,被称为"UDP载荷"。
包装好之后,会把UDP报头+UDP载荷封装成一个UDP数据段
无论是TCP协议还是UDP协议,它们当中都会包含源端口和目的端口;
源端口和目的端口都是使用2字节(2kb大小)来表示的,也就是16个比特位来表示的
占用内存(字节数) | 对应的比特位 | 数据范围 |
1 | 8bit | 有符号:(-2^7,2^7-1);无符号:(0,255) |
2 | 16bit | 有符号:(-32768,+32767)==>(-2^15,2^15-1); 无符号:(0,65535) |
4 | 32bit | 有符号:(-2^31,2^31-1);无符号:(2^32-1) |
也就是,客户端与服务端的主机之间的端口号,范围都是(0,65535)
但是,不建议直接在程序当中指定范围<1024的端口号
因为,在(0,1023)这个范围的端口,被称为"知名端口",这一些端口号属于已经分配给了一些知名的、广泛使用的进程来使用了。
即使在这个范围的进程没有被占用,但是在应用程序当中也无法确定哪些端口被占用了。因此,不建议在这个范围内指定端口号;一旦端口号冲突,那就会抛出异常。
网络层比较知名的协议就是IP协议。
IP协议,会针对传输来UDP数据报,打包成一个IP数据报:
也就是,针对UDP数据报,再次拼接了一个IP报头。
IP报头,也是一个字符串。其中,包含的比较核心的信息就是源IP和目的IP
即:发送的主机IP是什么,目的的主机IP是什么
IP报头(包含源IP、目的IP) | UDP报头(包含源端口和目的端口) | 1234567 | 7654321 | 2023-1-14 | "hello" |
网络层是以包为单位进行数据传输到数据链路层的
到了这里,就可以得出,一次通信当中的基础五元组:
①源IP
②源端口
③目的IP
④目的端口
⑤协议类型
网络层的数据包准备好了,就需要交给数据链路层进行进一步地"打包"。
基于上述数据,需要打包成一个"以太网数据帧"。
以太网数据帧,会对网络层传输过来的数据据包进行进一步的"包装”,又多了两个部分:以太网帧头和以太网帧尾。
以太网帧头 | IP报头(包含源IP、目的IP) | UDP报头(包含源端口和目的端口) | 1234567 | 7654321 | 2023-1-14 | "hello" | 以太网帧尾 |
其中,数据链路层是按照帧为单位进行传输的
下图来源于《小林coding》
网站地址:
2.1 TCP/IP 网络模型有哪几层? | 小林coding
到了物理层,就会把数据帧转化为二进制信号(0100001....)这样,然后传输出去。
从应用层----------》物理层的这一个过程称为封装
同样地,作为接收方,也需要把数据进行"分用"。
简单概括一下:
接收方的物理层会接收到01000111......的电信号,然后交给接收方的数据链路层,然后去掉帧头、帧尾并且把数据传输到网络层,再由网络层解析IP等等的信息,去掉IP头之后,交给接收方的传输层,再由接收方的传输层解析端口信息等等,解析完毕之后,再去掉TCP/UP头,这个时候就只剩下应用数据了,因此就可以反馈给接收设备的应用层。
以上过程,和封装对立,被称之为"分用"。