正文开始@小边小边不秃头
hi~ 宝子们,好久好久不见,从今往后,我的文章会较为随意(因为我懒得维持文章严谨的逻辑了,写文章只不过已经变成了习惯,也就是说我只是抱着“学习”的态度来更新,毕竟 —— “进大厂”已不再是我的追求了(是时候放弃幻想面对现实了
网络协议栈层状结构贯穿操作系统,其中tcp/ip属于OS的一部分 ——
认识协议:
所谓的计算机协议,本质其实就是约定,约定是由编码的程序员自己根据标准文档或者自己的喜好定义协议。
因为计算机生产厂商有很多,计算机操作系统有很多,计算机网络硬件设备有很多,如何让这些不同厂商之间生产的计算机能够相互顺畅的通信? 就需要有人站出来,约定一个共同的标准。大家都来遵守,这就是网络协议。
协议为什么要分层?
软件设计上层状结构的好处 —— 解耦
OSI的七层模型
OSI (Open System Interconnection)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范(硬件不实现,通过软件层实现)
把网络从逻辑上分为了7层,每一层都有相关、相对应的物理设备,比如路由器,交换机
OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输
它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯
但是,它既复杂又不实用,所以我们按照TCP/IP四层模型来认识。
物理层我们考虑的比较少,因此很多时候也可以称为 TCP/IP四层模型。
⬇️ 一般而言 ——
对于一台主机,它的操作系统内核实现了从传输层到物理层的内容;
对于一台路由器,它实现了从网络层到物理层;
对于一台交换机,它实现了从数据链路层到物理层;
对于集线器,它只实现了物理层
但是并不绝对,很多交换机也实现了网络层的转发;很多路由器也实现了部分传输层的内容(比如端口转发)
理解封装和解包&分用:
如何理解报头,what & why?
报头中的数据,用来指导当前层进行某种协议决策。报头是一种结构化的数据。Linux OS是C语言写的,在语言角度 ——
//自己随意定义的一个报头,只是示意
struct my_hdr
{
unsigned int src:16; //位段
unsigned int dst:16;
unsigned int type:8;
unsigned int len:24;
};
// 定义了一个位段变量→定义了一个报头
struct my_hdr my;
my.src = 0x1;
my.dst = 0x2;
my.type = 0x3;
my.len = 0x16;
几乎每一层协议的报文[ 报头+有效载荷 ],都要包含两种字段 ——
以上是协议的共性。
局域网中的两台主机能直接通信吗?可以哦
这就像在一个教室里上课。网络资源由大家共享,如果同时发送,可能发生数据碰撞的问题。每台主机都有碰撞检测的能力,也都有碰撞避免算法。这是在数据链路层做的。局域网中任何一个时刻,都只能有一台主机在向局域网中发送消息 - 互斥
如果我想攻击这个局域网,我应该怎样做?占用临界资源,造成其它主机饥饿。
理解IP的意义?
所有的变化都围绕这这一个不变展开,这也是一个人生问题,我们顺其自然就好了,宝宝们。
由于路由器的存在,在IP层向上的所有协议,看不到底层网络的任何差异。由于IP的存在,把不同的网络进行大一统。
认识IP地址
IP地址是在IP协议中, 用来标识网络中不同主机的地址;
对于IPv4来说, IP地址是一个4字节, 32位的整数; 对于IPv6, 有16字节, 128位
我们通常也使用 “点分十进制” 的字符串表示IP地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一个字节, 范围是 0 - 255;
认识Mac地址
MAC地址用来识别数据链路层中相连的节点;
长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址).