自上而下分别是
应用层 ==> 为计算机用户提供接口和服务表示层 ==> 数据处理(编码解码、加密解密等)会话层 ==> 管理(建立、维护、重连)通信会话传输层 ==> 管理端到端的通信连接网络层 ==> 数据路由(决定数据在网络的路径)数据链路层 ==> 管理相邻节点之间的数据通信物理层 ==> 数据通信的光电物理特性OSI欲成为全球计算机都遵循的标准
OSI在市场化过程中困难重重,TCP/IP在全球范围成功运行
OSI最终并没有成为广为使用的标准模型
OSI失败的原因:
OSI的专家缺乏实际经验OSI标准制定周期过长,按OSI标准生产的设备无法及时进入市场OSI模型设计的并不合理,一 些功能在多层中重复出现所以最后采用了TCP/IP四层模型
TCP/IP四层模型分别对应OSI七成模型中的
应用层 ==> HTTP/FTP 应用层表示层会话层 传输层 ==> TCP/UDP 传输层 网络层 ==> IP/ICMP 网络层 网络接口层 ==> Ethernet/ARP/RARP 数据链路层物理层常用单位Mbps bps=b/s=bit/s=1/8Btyes/s = 1/8B/s
发送时延 = 数据长度(bit)/发送速率(bit/s)
发送速率受限于计算机网卡
传播时延传播时延 = 传输路径距离/传播速率(bit/s)
传播速率受限于传输介质(铜线or光纤…)
排队时延数据包在网络设备中等待被处理的时间
处理时延数据包到达设备或者目的机器被处理所需要的时间
总时延=发送时延+排队时延+传播时延+处理时延
RTT(Route-Trip Time)是评估网络质量的一项重要指标
RTT表示的是数据报文在端到端通信中的来回一次的时间
通常使用ping命令查看RTT
发送和接收会不会冲突?冲突了怎么办?
物理层帮助我们解决了这一个问题,使用全双工通信信道
单工通信信道 只能一个方向通信,没有反方向反馈的信道(有线电视、无线电收音机等等) 半双工通信信道 双方都可以发送和接收信息不能双方同时发送,也不能同时接收 全双工通信信道 双方都可以同时发送和接收信息作用:提高信道的利用率
频分复用时分复用波分复用码分复用数据里面恰好有这些比特流咋办?
使用透明传输
即是控制字符在帧数据中,但是要当做不存在的去处理
再往物理层传输的时候,会先判断“帧”的数据,如果其中含有EOT字符(00000100),则会在EOT字符前面加上转义字符,到时候传输过去的时候,如果检查到有EOT字符,就会先判断前面是否有转义字符,从而判断是否是帧尾部
如果链路层对这种情况没有特殊处理,那么就可以理解链路层为非透明传输(因为无法传输EOT这个字符),但是数据链路层通过对这个字符添加转义符(如果网络层数据中还存在转义符,就再添加一个转义符)的办法来使数据部分可以传输EOT字符,就实现了透明传输
00110010 ==> 0+0+1+1+0+0+1+0=3 ==> 奇数 在比特流后面添加1 ==> 001100101
00111010 ==> 0+0+1+1+1+0+1+0=4 ==> 偶数 在比特流后面添加0 ==> 001100100
假设我们现在需要传输00110010 1
如果在传输过程中出错,变成了00010010 1
我们就可以通过0+0+0+1+0+0+1+0=2,发现最后一位应该是0 但是传过来的结尾却是1,于是可知传输出错
但是会出现一个问题
如果出错两位,奇偶校验码校测不到错误
例题:使用CRC计算101001的可校验位串
1.G(x)=x3+x2+1 ==> 二进制位串:1101,最高阶:3
2.根据最高阶为r 所以给101001末尾添加r个0,这里r为3 ===> 101001000
3.将添加r个0后的数据101001000使用模2除法除以多项式的位串 也就是101001000/1101 得到商为110101 余数001
4.得到的余数填充在原数据r个0的位置得到可校验的位串 101001000 ==> 101001001
接收端接收的数据除以G(x)的位串,根据余数判断出错(余数为0则没有出错)
注意
CRC的错误检测能力与位串的阶数r有关数据链路层只进行数据的检测,不进行纠正CRC中的G(x)并不是随便取的,而是有一定的规定的路径MTU由链路中MTU的最小值决定
整个称作数据帧
目的地址源地址类型帧数据CRC6字节6字节2字节46~1500字节4字节如果E在MAC地址表没有找到对应的接口,则会广播A的数据包到除A以外的端口,最终E将收到来自B、C的回应,并将地址记录
版本
占4位,指的是IP协议的版本,通信双方的版本必须一致,当前主流版本是4,即IPv4,也有IPv6首部位长度
占4位,最大数值为15,表示的是IP首部长度,单位是“32位字” (4个字节)也即是IP首部最大长度为60字节总长度
占16位,最大数值为65535,表示的是IP数据报总长度(IP首部+IP数据)TTL
占8位,表明IP数据报文在网络中的寿命,每经过一个设备,TTL减1,当TTL=0时,网络设备必须丢弃该报文,避免数据在网络中无限传输协议
占8位,表明IP数据所携带的具体数据是什么协议的(如: TCP. UDP等)
协议名ICMPIGMPIPTCPUDPOSPF…字段值12461789…首部校验和
占16位, 校验IP首部是否有出错计算机或者路由器都拥有路由表
路由表结构
目的IP地址下一跳IP地址IP1IP4IP2IP5IP3IP6……如果只看网络层,那么流程如下
如果结合网络层和数据链路层,那么流程如下
第一步
A发出目的地为C的IP数据报,查询路由表发现下一跳为EA将IP数据报交给数据链路层,并告知目的MAC地址是E数据链路层填充源MAC地址A和目的MAC地址E数据链路层通过物理层将数据发送给E第二步
E的数据链路层接收到数据帧,把帧数据交给网络层E查询路由表,发现下一跳为FE把数据报交给数据链路层,并告知目的MAC地址为FE的数据链路层封装数据帧并发送第三步
F的数据链路层接收到数据帧,把帧数据交给网络层F查询路由表,发现下一-跳为CF把数据报交给数据链路层,并告知目的MAC地址为CF的数据链路层封装数据帧并发送MAC地址和IP地址在传输过程中的差别
数据帧每一跳的MAC地址都在变化IP数据报每一跳的IP地址始终不变ARP(Address Resolution Protocol)地址解析协议
将网络层32位IP地址转化为数据链路层MAC48位地址
ARP缓存表(存着IP地址与MAC地址的映射关系) ARP缓存表缓存有IP地址和MAC地址的映射关系ARP缓存表没有缓存IP地址和MAC地址的映射关系 ARP协议会通过广播 获取目的主机的MAC地址与IP地址ARP缓存表可以通过终端arp -a查看
RARP(Reverse Address Resolution Protocol)逆地址解析协议
将数据链路层MAC48位地址转化为网络层32位IP地址
总结
®ARP协议是TCP/IP协议栈里面基础的协议
ARP和RARP的操作对程序员是透明的
理解®ARP协议有助于理解网络分层的细节
所以正确的子网和主机数量应该基于上表,每一类各减一些(如下表)
127.0.0.1,通常被称为本地回环地址(Loopback Address),不属于任何-一个有类别地址类。它代表设备的本地虚拟接口,所以默认被看作是永远不会宕掉的接口。在Windows操作系统中也有相似的定义,所以通常在安装网卡前就可以ping通这个本地回环地址。一般都会用来检查本地网络协议、基本数据接口等是否正常的。
某公司拥有256名员工,每人配备一个计算机,请问该公司应该申请哪种网络段?
解:因为申请A类地址只能有254台主机连接达不到要求,但是如果申请B类地址,虽然能满足,但是造成了大量地址的浪费,所以有了子网划分的概念
比如下图的193.10.10.0 我们通过子网划分,分成了两段,我们取其中一段使用即可,比如当前有100名员工,在没有子网划分的时候,我们需要使用到C类地址,可连接254台主机,这样会造成资源的极度浪费,但是通过子网划分,我们现在能连接126台主机,但是仍然足够100名员工使用,于是我们从浪费154个地址降到了26个,减少了资源的浪费
如何每一类IP地址都进行子网划分的话,将会出现非常多的子网号,所以有了子网掩码帮助我们快速判断某个IP的网络号
A类地址的子网掩码255.0.0.0
B类地址的子网掩码255.255.0.0
C类地址的子网掩码255.255.255.0
假设有这么一个ip地址193.10.10.6,子网掩码为255.255.255.128,求子网号
193.10.10.6 ==> 11000001.00001010.00001010.00000110
255.255.255.128 ==> 11111111.11111111.11111111.10000000
相与得到子网号 ==> 11000001.00001010.00001010.00000000 ==> 193.10.10.0
193.10.10.129/25 表示前25位为网络前缀
相比原来子网划分更加灵活
NAT技术用于多个主机通过一个公有IP访问互联网的私有网络中
NAT (Network Address Translation)技术是如何出现的?首先是IP地址不够用
IPv4最多只有40+亿个P地址早期IP地址的不合理规划导致IP号浪费所以将IP地址分为两类,增加IP地址的利用率
内网地址
内部机构使用(手机,笔记本等等)
避免与外网地址重复
三类内网地址
10.0.0.0~10.255.255.255(支持千万数量级设备)
172.16.0.0~172.31.255.255(支持百万数量级设备)
192.168.0.0~192.168.255.255(支持万数量级设备)
内网多个设备使用同一个外网IP请求外网的服务,外部怎么知道具体是哪个设备在请求的?
这里就需要使用到我们的NAT技术
NAT技术能在本地路由器中将内网的地址以及端口号转化为新的地址以及端口号(也就是外网的IP:新的端口号),当数据传回来的时候,也是通过NAT表取查找映射关系,从而传回具体的主机
NAT表
外网地址
全球范围使用全球公网唯一网际控制报文协议(Internet Control Message Protocol)
用于
ICMP协议可以帮助IP协议进行传输,可以报告错误信息或者异常情况ICMP协议是封装在IP协议里面进行传输的,ICMP报文只是IP数据报的一组数据
在IP协议中 其中有八位用来表示协议,如果IP协议传输的是ICMP数据的话,协议的值就为1
Traceroute可以探测IP数据报在网络中走过的路径
在终端通过tracert ip地址/网址,可以查看到请求发送到目的主机走过的路径
其原理是通过TTL与ICMP协议的配合来完成的
初始TTL为1,如果下一跳不是目的主机,则返回终点不可达的报文到源主机,然后TTL+1,继续发送,重复操作,一直到TTL足够到达目的主机,从而实现记录IP数据报在网络中走过的路径
本质上是一张“图”,我们在图上运行这个算法,而路由表只是这个算法里面的一个数据结构
每一顶点表示一个网络、 路由器或计算机每一条边表示一条网络路径网络环境复杂 路由算法要比图论的算法要复杂dij = min(dix+dxj) //x为i到j需要经过的中间的某个节点
RIP(Routing Information Protocol)协议
RIP协议是使用DV算法的一种路由协议
RIP协议把网络的跳数(hop)作为DV算法的距离RIP协议每隔30s交换一次路由信息RIP协议认为跳数>15的路由则为不可达路由1.路由器初始化路由信息(两个向量Di和Si)
2.对相邻路由器X发过来的信息,对信息的内容进行修改(下一跳地址设置为X,所有距离加1)
i.检索本地路由,将信息中新的路由插入到路由表里面 ii.检索本地路由,对于下一跳为X的,更新为修改后的信息(以最新的为准) iii.检索本地路由,对比相同目的的距离,如果新信息的距离更小,则更新本地路由表
3.如果3分钟没有收到相邻的路由信息,则把相邻路由设置为不可达(16跳)
实现简单,开销很小
故障信息传递慢
假设ABC为一组线性网络,某一个时刻A断开,B想传递A,发现传递不了,然后发现C可以传递给A,于是把路径长度+1,并且下一跳设置为C,C准备传递给A时,也发现传递不了,然后发现B可以传递给A,于是把路径长度+1,并且设置下一跳为B,如此反复,经过16次后,才设置为不可达,所以故障信息传递得慢
限制了网络的规模
跳数>15的路由不管可不可达,在RIP协议中始终认为不可达,所以限制了网络的规模
1.初始化两个集合(S, U) (S为只有初始顶点点A的集合,U为其他顶点集合)
2.如果U不为空,对U集合顶点进行距离的排序,并取出距离A最近的一个顶点D
i.将顶点D的纳入S集合
ii.更新通过顶点D到达U集合所有点的距离(如果距离更小则更新,否则不更新)
iii.重复2步骤
3.直到U集合为空,算法完成
一传十十传百,而RIP协议只跟相邻的路由器交换信息
消息描述该路由器与相邻路由器的链路状态时延,带宽,距离等等,而RIP协议只描述跳数
只有链路状态发生变化时,才发送更新信息而RIP协议每隔30s交换路由信息,不管状态有没有发生变化
OSPF(Open Shortest Path First:开放最短路径优先)
OSPF协议的核心是Dijkstra算法
OSPF协议是链路状态(LS)协议的一种实现,相当于LS定义了这种规则,而OSPF则实现了这种规则
向所有的路由器发送消息获得网络中的所有信息 ==> "网络的完整拓扑”(所以每个路由器都能单独的运行Dijkstra算法)
也称为“链路状态数据库”"链路状态数据库”是全网一致的 消息描述该路由器与相邻路由器的链路状态所以OSPF协议比RIP协议更加客观、更加先进
只有链路状态发生变化时,才发送更新信息减少了数据的交换,更快收敛
OSPF协议过程图
BGP(Border Gateway Protocol:边际网关协议)
BGP协议是运行在AS(自治系统)之间的一种协议
BGP协议能够找到一条到达目的比较好的路由
BGP发言人就是一个路由器,位于AS边界的
BGP并不关心内部网络拓扑AS之间通过BGP发言人交流信息BGP Speaker可以人为配置策略 比如中国不想让一些敏感信息进入国内,就可以在BGP Speaker上人为配置策略在传输层,我们可以忽略两个设备之间是如何连接的,因为网络层已经帮我们解决了这个问题,我们可以把两个设备之间的网络连接,当成是一个虚拟互联的网络,其实说白了,两个设备的通讯也可以当成是两个进程的通讯
计算机是如何识别是哪个进程在通讯的?
端口
使用端口(Port)来标记不同的网络进程端口(Port)使用16比特位表示(0~65535) FTPHTTPHTTPSDNSTELNET21804435323UDP(User Datagram Protocol:用户数据报协议)
UDP是一个非常简单的协议
对于应用层传下来的数据,不会进行合并,也不会进行拆分,所以UDP协议的长度基本是由应用层的数据长度决定的
TCP( Transmission Control Protocol:传输控制协议)
TCP协议是计算机网络中非常复杂的一个协议
TCP是面向连接的协议
TCP的一个连接有两端(点对点通信)
TCP提供可靠的传输服务
TCP协议提供全双工的通信
TCP是面向字节流的协议
序号
范围0~2^32-1TCP是面向字节流的,每个字节都有唯一的一个序号而这里的序号只是数据首字节的序号确认号
0~2^32-1一个字节一个序号期望收到数据的首字节序号数据偏移
占4位:能表示0~15,单位为:32位字(4字节),也就是每一个偏移,就能表示4个字节的偏移数据偏离首部的距离(因为不知道TCP选项的长度)TCP标记
占6位,每位各有不同意义
标记含义URGUrgent:紧急位,u=1,表示紧急数据ACKAcknowledgement:确认位,ACK=1,确认号才生效PSHPush:推送位,PSH=1,尽快地把数据交付给应用层RSTReset:重置位,Rst=1,重新建立连接SYNSynchronization:同步位,SYN=1表示连接请求报文FINFinish:终止位,Fn=1表示释放连接窗口
占16位:0~2^16-1窗口指明允许对方发送的数据量紧急指针
紧急数据(URG=1)指定紧急数据在报文的位置TCP选项
最多40字节支持未来的拓展通过超时重传保证可靠传输
每发送一个消息,都需要设置一个定时器超时定时器
ARQ( Automatic Repeat reQuest:自动重传请求)
既然单个发送和确认效率低,可不可以批量发送和确认?
于是有了连续ARQ协议
累计确认不需要像上面一样等待一个一个消息的确认,假设我现在收到第五条信息的确认,那么就认为,前面5条都已经收到,累计确认可以减少确认报文的数量,以此提升网络的效率
TCP协议中有窗口这么一个数据段
占16位: 0~2^16-1窗口指明允许对方发送的数据量如果现在接收方准备告诉发送方窗口大小为1000,但是这个消息在发送的过程中不小心丢失了,发送方一直收到这个消息,就会造成死锁的局面(窗口大小信息没有超时重传机制),所以这里我们需要另一种定时器——坚持定时器
全过程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eHOvlsL2-1599101827388)(/Users/huangwenxun/Library/Application Support/typora-user-images/image-20200901230629460.png)]
为什么发送方要发出第三个确认报文呢?
避免已经失效的连接请求报文传送到对方,引起错误如果有一个先发后到的确认报文,接收方会有第二次回应,这样就会建立两次连接,如果有三次握手,先到的确认报文已经进行了第三次握手,因为发送方对于第二次的消息会忽略掉,不会进行任何的操作
等待计时器会等待2MSL的时间【MSL(Max Segment Lifetime):最长报文段寿命】
MSL建议设置为2分钟
为什么需要等待2MSL?
最后一个报文没有确认确保发送方的ACK可以到达接收方2MSL时间内没有收到,则接收方会重发(也就是重复第三次挥手的动作)确保当前连接的所有报文都已经过期IP:Port ==> 套接字
IP与端口的组合就叫套接字套接字(Socket)是抽象概念,表示TCP连接的一端通过套接字可以进行数据发送或接收一个IP可以有多个套接字所以TCP的连接,我们就可以理解为是两个套接字的连接
TCP = { Socket1: Socket2 } = {{ IP:Port }:{ IP:Port }}
作用
定义应用间通信的规则
应用进程的报文类型(请求报文、应答报文)报文的语法、格式应用进程发送数据的时机、规则DNS (Domain Name System:域名系统)
使用域名帮助记忆域名由点、字母和数字组成点分割不同的域域名可以分为顶级域、二级域、三级域…n级域 比如www.taobao.com com为顶级域taobao为二级域www为三级域解析域名过程
DHCP(Dynamic Host Configuration Protocol: 动态主机设置协议)
DHCP是一个局域网协议DHCP是应用UDP协议的应用层协议即插即用联网DHCP会自动分配内网的IP地址给你,而不需要手动配置
在DHCP有两个点需要注意
分配的IP是临时的租期的概念HTTP(HyperText Transfer Protocol:超文本传输协议)
HTTP协议是可靠的数据传输协议(基于TCP)工作在CS的架构之上http(s)😕/<主机>:<端口>/<路径>
怎么指定资源呢?
在url地址中指定
在请求数据中指定
POST https://coding.imooc.com HTTP/1.1 Accept-Encoding: gzip Accept-Language: zh-CN { "sort":0, "unlearn":0, "page":2 } 请求状态码 状态码含义200~299成功状态码300~399重定向状态码400~499客户端错误状态码500~599服务端错误状态码SSL (Secure Sockets Layer:安全套接层)
数据安全和数据完整对传输层数据进行加密后传输综合使用对称加密、非对称加密(生成随机数阶段)