首先来介绍一个叫协议的东西, 为什么需要协议? 没有协议, 各个电脑厂商, IBM, 苹果都弄自己的协议, 结果就是苹果电脑只能跟苹果电脑通信, 和IBM电脑不可以通信, 这很尬; 所以搞一个国际通行的协议, 大家按照这个来, 所有电脑都可以通信了
OSI七层模型, 搞一个标准的网络模型出来, 大家都按照这个来走, 那么大家都有统一的规范. OSI七层模型, 是应用层, 表示层, 会话层, 传输层, 网络层, 数据链路层, 物理层; TCP/IP模型 , 数据链路层, 网络层, 传输层, 应用层
主要是负责传输0和1的电路信号
物理层将各个电脑连接起来, 但是0 和1怎么发送呢, 需要一个电信号分组方式, 后来出现了以太网协议; 一组电信号就是一个数据包, 叫一个帧(frame), 每个帧分成2个部分, 表头(head)和数据(data), 标头包涵一些说明性的东西, 发送者, 接受者和数据类型;
每台电脑要往另一台电脑发送数据, 一堆0/1电路信号, 封装成数据包, 包含头和数据, 头里包含了从哪里来到哪里去, 必须从一台电脑的网卡 到另一台电脑的网卡, 所以以太网发送数据包必须指定, 目标电脑网卡的mac地址
note: 每块网卡出厂的时候, 就有一个唯一的mac地址, 48位的二进制位, 但是一般用12个16进制数字表示, 前6个16进制是厂商编号, 后6个16进制是网卡流水号
传输: 以太网的数据包不是从一个mac地址发送到另一个mac地址, 这个不是精准推送的, 以太网里面, 如果一个电脑发一个数据包出去, 会广播给局域网内的所有电脑设备的网卡, 然后每台电脑都从数据包里获取接收者的mac地址, 跟自己的mac地址对比一下, 如果一样, 就说明这个是发送给自己的数据包(广播是广播数据给一个子网内的电脑)
上面提及, 子网内的电脑通过以太网发送/接收数据包. 如果不是同一个子网的呢??? 这个靠网络层了. 有一套IP地址可以让我们区分那些电脑是一个子网的.
网络层里有IP协议, ip协议定义的地址有32位(IPv4), 前24位代表网络号, 后8位代表主机号; 至于怎么区分呢? 比如一个ip地址是192.168.56.1, 子网掩码是255.255.255.0, 来了一个数据包目标ip地址是192.168.32.7
分别拿2个IP地址跟子网掩码进行与运算
192.168.56.1 11000000.10101000.00111000.00000001
255.255.255.0 11111111.11111111.11111111.00000000
与运算 11000000.10101000.00111000.00000000
192.168.32.7 11000000.10101000.00100000.00000111
255.255.255.0 11111111.11111111.11111111.00000000
与运算 11000000.10101000.001000.00000000
这2个很明显是不一致的,所以不是同一个子网, 其实有时候不用做运算, 看ip地址可以知道的, 第三部分,一个是56一个是32…
如果发现不在同个子网, 那就需要路由器来发送数据包, 路由器是负责将多个子网进行连接. 路由器其实就是配置了多个网卡的专用设备, 可以通过不同的网卡接入不同的网络. 路由器上每个网卡都有mac地址和对应的ip地址.路由器虽然有mac地址, 但是不能通过mac地址寻址, 必须通过ip地址寻址, 所以路由器其实是工作在网络层的设备.
(补充:) 网络交换机, 也是一种设备, 是工作在数据链路层的, 路由器是工作在网络层. 交换机是通过mac地址寻址和发送数据包的, 但是路由器是通过ip地址寻址和传输数据包的.
大致过程是 路由器配置2块网卡, 每个网卡可以连到一个局域网内. 局域网1内的电脑要发送数据包到局域网2内的电脑, 在数据包上面带上自己的ip地址和对方的ip地址, 但是他们两不在同一个局域网内, 于是局域网1内的电脑先通过交换机将数据包发送给路由器, 这个过程需要将路由器的一块网卡的IP地址和mac地址写到数据包的头部, 通过交换器广播出去, 路由器接收到之后比较自己一块网卡的mac地址, 就知道是来找自己的.
路由器接收到之后, 就在局域网2内, 将目标的ip地址和mac地址写入头部, 接着再通过交换机进行广播通知, 发送到局域网2内的电脑, 如此类推. 就发送到了局域网3内的目标ip地址的机器了
具体可以看图: 上面有1 2 3 4的标识
到了这一层的数据, 已经达到了目标机器内, 接下来需要的是数据包需要发送给对应的应用程序, 所以还需要一个端口的概念, 目标机器监听指定端口的程序就可以提取这个端口的数据, 知道是自己的数据; 端口号是065536的范围内,01023被系统占用了,别的应用程序就用1024以上的端口就ok了
tcp和udp协议也是工作这这一层上的, 在数据包上加入了端口号, 能够进行点对点的通信, 但是传输层的tcp协议, 仅仅是规定了一套基于端口的点对点通信协议, 包括如何建立连接, 发送和读取消息, 但实际上如果你是基于tcp协议开发, 你一般是socket进行网络编程
通过传输层的tcp协议可以传输数据, 但是收到数据之后, 怎么来解释? 比如网页怎么处理, 邮件又是我怎么处理?
所以整出不少应用层的协议, 最经典就是http了,
比如第一场肯定是这样的 GET http://localhost:8080/ http/1.1
第二行是怎样的… 类似规范