局域网和广域网
局域网
局域网,即 Local Area Network,简称LAN。
Local 即标识了局域网是本地,局部组建的一种私有网络。
局域网内的主机之间能方便的进行网络通信,又称为内网;局域网和局域网之间在没有连接的情况下,是无法通信的。
局域网组建网络的方式有很多种:
1.基于网线直连
两根线,将三台主机连接起来,这三个主机就构成了一个局域网.咋们日常的主机一般都是一个网口,但是有的主机是多个端口的.
2.基于交换机组建
借助交换机,组成一个局域网,交换机上的网口之间是对等的(都是一样的口)
效果就是把插在交换机上的设备给创建成一个局域网,这个局域网内部至今的主机可以相互访问.交换机可以把若干个设备组建成一个局域网.
3.基于路由器组建
路由器上有两种接口,一种叫做LAN口,一种叫做WAN口
其中插在LAN口的设备,再同一局域网里,通过WAN口可以连接到其他的局域网
此时路由器A的WAN连接的就是B的LAN口,所以A其实是B的局域网中的一个设备
广域网
广域网,即 Wide Area Network,简称WAN。
通过路由器,将多个局域网连接起来,在物理上组成很大范围的网络,就形成了广域网。广域网内部的局域网都属于其子网。
通俗点说,很多个局域网组合在一起就构成了一个广域网.
网路通信基础
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范围的数字,在网络通信中,进程可以通过绑定一个端口号,来发送及接收网络数据。
注意事项
两个不同的进程,不能绑定同一个端口号,但一个进程可以绑定多个端口号。
了解:
一个进程启动后,系统会随机分配一个端口(启动端口)
程序代码中,进行网络编程时,需要绑定端口号(收发数据的端口)来发送、接收数据。
进程绑定一个端口号后,fork一个子进程,可以实现多个进程绑定一个端口号,但不同的进程不能绑定同一个端口号
认识协议
要想进行有效的通信,前提就是能够明确通信协议
本质就算是发出来的数据是什么样子的格式 , 接收方按照对应的格式来接收
网络通信的时候,本质上,传输的是光信号和电信号
通过光信号的频率,(高频率/低频率),电信号的电平(高电平/低电平)来表示0和1
所以协议就是一种约定
协议分层
网络通信这个过程,其实很复杂,里面有很多细节,如果就只通过一个协议,来约定所有的细节,这个协议会十分庞大,复杂,更好的办法就是把一个大的复杂的协议,拆成多个小的,更简单的协议,每个协议只负责部分工作.
就和写代码一样,写一个复杂的程序不能一个文件将所有代码装进去,把一个代码拆分成更小的,更简单的文件,每一个文件负责一部分工作.
协议分层类似于打电话时,定义不同的层次的协议
这就体现了协议分成的两个好处
1 每层协议不需要知道其他层协议的细节(封装)
打电话的人不需要知道电话的工作原理,就能完成打电话的操作
制作电话的人不需要成为语言大师.就可以制作出电话
2 把对应层的协议替换成其他协议(低耦合)
打电话的人可以使用汉语,也可以使用英语
打电话的人可以使用有线电话,也可以使用无线电话
TCP/IP五层网络模型
我们听到的最多的是OSI五层参考模型,如下图
但实际上,这种参考模型只出现在教科书中,所以不做过多介绍
真实情况下,使用最多的是TCP/IP五层(四层)网络模型
如图,左侧是OSI七层参考模型,右侧是TCP/IP五层网络模型.可以看出,下面四层其实都是一样的,
下面的四层,和程序猿的关系不是特别大,这里的代码逻辑都是通过操作系统和驱动以及硬件实现好的,程序猿打交代最多的其实是应用层的协议
站在全局的角度,这是五层模型
但是在一个程序猿的角度来看,最下面的物理层描述的是硬件设备,(和软件没啥关系,和程序猿的距离比较远),所以这时会认为就是四层
物理层
网络通信中的硬件设施
比如网线、网卡…针对硬件设备的约定,就是物理层协议负责的范畴,需要保证所有的主机和网络设备之间,都是相互匹配的
比如我随便买一个路由器都可以插上我买的网线,我不需要考虑网卡不匹配这样的问题,因为物理层协议已经规定好了
数据链路层
负责相邻(一根网线连接的两个设备)的设备之间的通信
主机1和路由器是相邻的
主机2和路由器是相邻的
但是主机1和主机2不是相邻的
网络层
负责点到点之间的通信.也就是网络中的任意节点到任意节点之间的通信
网络层负责这两个点之间,规划出一条合适的路线
实际上,网络中的环境非常复杂,两个点之间的路线不止一条,就需要规划处一条最合适的路线
传输层
负责端到端之间的通信(起点到终点之间的通信)
传输层只关注结果(数据到没到),不关注过程(数据是怎么到的)
比如我们快递买东西,商家就是起点,消费者就是终点
消费者提供住址和电话,商家负责根据增地址将快递打给消费者
此时消费者和商家就只关注结果,不负责过程
此时的快递公司就要关注其中的过程
应用层
和应用程序密切相关的,不同的程序就有不同的用途
比如博主有一天在网上买一个物品
商家站在传输层.考虑这个东西能不呢达到我手上
快递公司站在网络层规划路线
快递小哥站在数据链路层,骑着电动车把货拉到集散中心
电动车/集装箱卡车/公路就是物理层.提供传输的基础
以上的所有只考虑包裹如何传输,不关系包裹内部是啥,更不关系包裹里的东西是干啥的
而我作为购物的人,是是抱着一定的用途/目的来购买的
一个主机,其实就对应了物理层到应用层五层(五层全部实现)
一台路由器,主要是物理层到网络层(主要实现了物理层,数据链路层,网络层)
一台交换机.主要就是物理层到数据链路层(主要是实现了物理层,数据链路层)
封装和分用
不同分层的写意之间,是如何相互配合的
举个栗子:
封装
用户A在键盘上输入了一个"hello",按下回车键
应用层(QQ应用程序)
根据用户输入的内容,把数据构造成一个应用层的协议报文(协议是一种约定,报文就是遵守这个约定的一组数据)
QQ代码中就会根据程序猿所设计的应用层协议,来构造出一个应用层数据报文。
其他的传输层,网络层。。。的协议都是现成的,操作系统/硬件/驱动实现好的,但是应用层的协议大概率是程序猿自己设计的
假设的应用层协议
发送方是A,接收方是B发送时间为2022/4/8 18:48 ,发送内容为“hello”
应用层协议就调用操作系统提供的API(称为socket API),把应用层的数据,交给传输层(就已经进入了操作系统内核了)
传输层(操作系统内核)
根据刚才传过来的数据,基于当前使用的传输层协议,构造出一个传输层协议报文
传输最经典的协议 (TCP/DCP) 这里一TCP为例
TCP的数据报 = TCP报头 + 数据载荷(Payload ,也就是一个完整的应用层数据)
构造TCP的过程可以视为是一个字符串拼接(二进制数据)
TCP的报头有很多的信息,最重要的就是”源端口“ 和 ”目的端口“ (相当于发送人电话和收件人电话)
网络中的封装的目的就是为了贴标签,贴上辅助转发的信息
接下来就将这个传输层的数据报交给网络层
网络层(操作系统内核)
拿到完整的传输层数据报,就会再根据当前使用的网络层协议(例如IP),再次进行封装,把TCP数据报狗造成IP数据报(添加上一个协议报头)
IP数据报 = IP协议报头+载荷(完整的TCP/UDP的数据报)
IP协议报头中也有很多的信息,其中最重要的就是源IP和目的IP。相当于发件人的地址和收件人的地址
紧接着,当前的网络层协议就会将这个IP数据报交给数据链路层
数据链路层(驱动难关程序)
以太网数据报 = 帧头 + IP数据报 —— 帧尾i
帧头最重要的信息就是接下来要传入的设备的地址是啥
帧尾放的是校验和
数据链路层又会把则会个数据交给物理层
物理层(硬件设备)
工作就是根据刚刚的以太网数据帧(一组0 1 )把这里的0 1 变成高低电平,通过网线传输出去;或者把这里的0 1 变成高频、低频的电磁波,通过光纤、无线的方式传播出去
此时的数据就已经离开了当前主机,前往了下一个设备。
分用
数据到了B的主机后。
物理层(硬件设备/网卡)
主机B的网卡感知到了一组高低电平,然后将这些电平分翻译为0 1 的一串数据 ,然后这一串0 1 就是完整的以太网数据帧
物理层九就把这个数据交给了数据链路层
数据链路层(驱动)
数据链路层负责对这个数据进行解析,去掉帧头和帧尾,去除里面的IP数据报,然后交给网络协议
网络层(操作系统)
网络层协议(IP协议)又会对这个数据进行解析,去掉IP协议报头,去取出里面的TCP数据报再交给传输层
传输层(操作系统内核)
传输层协议(TCP协议)又会对这个数据进行解析,去掉TCP报头,取出里面的TCP数据报,交给应用层
应用层(应用程序)
应用层就会调用socket API从内核中读取到这个应用层数据报。再按照应用程协议进行解析。
再根据解析结果给显示到窗口中
中间的过程
无论网络多么复杂,这里整体的传输过程都是类似的,只是在不断的封装和分用