计算机网络协议总结

OSI七层模型

OSI七层模型从下到上分别是:

1.Physical layer(物理层)
2.Data Link layer(数据链路层)
3.Network layer(网络层)
4.Transport layer(传输层)
5.Session layer(会话层)
6.Presentation layer(表示层)
7.Application Layer(应用层)

Please Do Not Throw Sausage Pizza Away,正好首字母对应,方便背诵记忆。

在这里插入图片描述
各层的细节:

第 1 层或者物理层(Physical layer):

名字:物理层
作用:为通信提供传播媒介
辅助作用:没有
相关设备:集线器(也就是常说的 Hub)

第 2 层或者数据链路层(Data Link layer):

名字:数据链路层
作用:使局域网中的机器互相连接
辅助作用:侦测传输错误
相关设备:交换机(也就是常说的 Switch)

第 3 层或者网络层(Network layer):

名字:网络层
作用:使各个网络相互连接
辅助作用:分割传输的数据包
相关设备:路由器(也就是常说的 Router)


第 4 层或者传输层(Transport layer):

名字:传输层
作用:管理应用程序的连接
辅助作用:保证连接的有效建立
相关设备:没有


.
第 7 层或者应用层(Application layer):

名字:应用层
作用:没有
辅助作用:没有
相关设备:代理(也就是常说的 Proxy)

OSI七层模型是一个理论模型,而实际模型是TCP/IP模型,后者不适用OSI的第五层和第六层,所以我们先不用掌握。

而且每一层是相对独立的,只能和相邻的层通信,那么在改换一层所关联的协议时,无需更改其他层,按照浏览器输入网址,那么通信流程就是跳过5,6层的 7 -> 4 -> 3 -> 2 -> 1

第一层:物理层

概念

物理层的作为主要就是为通信提供传输媒介,有线上网的时候需要网线来连接,那么传输媒介就是网线。

物理层旨在传输电信号,也就是0和1这样的信息,代表电信号的状态或大小。

同轴电缆

同轴电缆的结构是:最里面是一根数据线,网状导体提供一个0V的参考电信号,对内外层导体和外层网状导体做一个电位差来获得电信号。

在这里插入图片描述

同轴电缆也有两类,一个是10B2,另一个是10B5,10表示传输速率10Mbps(兆比特每秒),B表示编码0和1的方式,最后的数字表示同轴电缆的最大传输距离 / 100,所以10B5,长度是500米,超过最大传输举例之后,信号有明显减弱。

10B5是比较老的同轴电缆,也比较难用,需要手动在线缆上开一个口子,割破绝缘层,然后用类似夹板的装置的金属引导针夹住开口部位,就可以接触到数据线,获取电信号,电缆非常粗,如果弯曲泰国,内部的数据线就被折断,网络也就断开,所以使用起来比较不方便。

10B2同轴电缆比10B2要细很多,而且可以用连接器来连接多台设备,但是一台设备断开网络,整个网络也会被断开。

在这里插入图片描述

双绞线

双绞线与同轴电缆不同,有8根线,且两两成对,绞在一起,而且8根的设计是为了以后可能会用到的设计,现在看来确实明智之举。

在这里插入图片描述

如果要用双绞线与设备连接,就要使用RJ45接口了。

在这里插入图片描述

现在也就使用了4根线,而且不是随便的四根,而是下面对应的1,2,3,6,而且我们需要两个RJ4接口需要内部交叉的线缆,如果都是在一个位置,都是发送线和接受线,那么数据是无法流通的。

在这里插入图片描述
如果我们这边要连接多台设备,那么就需要一个连接所需的设备了,对于OSI第一层来说,这个设备就是集线器,也就是hub。

但是集线器不会指定将信息发送到特定机器,而是将接收到的信息广播发送给所有连接的机器,然后机器看到是发给自己的,就会读取信息,不是就丢弃信息,但是由于双绞线比较常用,但是已经有更好的线缆了,那就是光纤。

光纤

光纤是一种由石英或塑料制成的纤维,所以使用光纤通信的成本比同轴电缆等要低很多。光纤分为单模光纤,多模光纤,单模光纤传输的光波长是单一的,多模光纤传输的光则是白光,包括各种波长,单模光纤的传输举例要比多模光纤的传输距离更长,多模光纤的有效传输距离大概是 2 千米;单模光纤的有效传输距离大概是 60 千米。

如今的光纤要疲惫所有的接口必须是光卡口,那么价格就会比双绞线的网卡贵很多,而且光纤的信号传输载体是玻璃芯,所以不能突破走直角的瓶颈,很有可能造成线芯的损坏,导致网络不能是使用,所以还是家庭里还是用双绞线,而光纤则是通过网络盒子提供网络服务。

网络拓扑

网络拓扑是机器相互连接的网络的方式,有好几种,一般分为:

1.总线拓扑

所有的机器都连接到一条相同的线缆,来进行相互通信,但是同一时间,只能由一台机器发送消息,因为只有一条主线缆,那么机器数量越多,每台机器发送信息的机会就会越少。

在这里插入图片描述

2.环型拓扑

环型拓扑的通信方式比较特别,因为有一个令牌(token),每台机器只有持有令牌的时候,才能发送消息,那么当持有令牌时发送给特定的机器,那么就会顺着某个方向,向下一个机器发送消息,然后如果不是这个机器,那么就会沿此方向继续传递。

这个结构中也不能连接很多机器,因为所有机器只共享一个令牌,而且机器越多,环越大,令牌的传递所需时间就越久。

在这里插入图片描述

3.星型拓扑

星型拓扑中,所有的通信都需要经过中央的机器,连着中央机器的其他机器向中央机器发送消息时,会带着发送目标机器的名字,那么中央机器就会把信息根据目标机器的名字发送给正确的接收者。

那么中央机器的处理机器数目就决定了可以连接的数量,把交换组组合在一起,可以处理几十亿台机器,而且只要根据中央机器,就可以快速的反应到目标,所以可以构建尺寸无限的网络。

在这里插入图片描述

所以星型拓扑也是主要使用的方式。

CSMA/CD 协议

CSMA/CD 协议是带有冲突检测的载波侦听多路存取,因为在总线拓扑中,所有机器共享一个主线缆,因此在某一时刻,有可能发生冲突,那么为了避免冲突,就需要这个协议来通过分配发送消息的权利,限制冲突的数目。

协议内容为:

1.监听总线,来检测是否有其他机器发送信息,或者是否有冲突发生

2.只有当没有其他机器发送信息时,才可以发送信息

3.如果发送信息的时候,其他机器正好也开始发送信息,那么都停止发送,并且随机分配等待的时间

4.等待时间结束后,再尝试发送信息。

第二层:数据链路层

概念

数据链路层的作用是使局域网中的机器互相连接,也就是使这些连接的机器相互通信,还有一个作用就是侦测传输错误,不是修正,而只是发现错误。

MAC地址

MAC地址使网卡的地址,如果某台机器有多个网卡,那么就会有多个MAC地址,MAC地址是用十六进制表示的,类似:00:0c:29:10:5a:55,前面3个是由IEEE分配,后面三个则由制造商自行分配,那么就不会出现重复的情况了。

MAC地址中,用冒号隔开的每两个字符,因为都是十六进制的字符,也就是2的4次方,那么两个就是2的8次方,正好是一个字节,那么一个MAC地址就是6个字节。

其中有一个特殊的MAC地址,ff:ff:ff:ff:ff:ff,这个MAC地址称为广播地址,也就是可以代表任意一个网卡,会发送到所在网络的所有网卡上。

协议

为了使连接到网络上的各个机器之间能相互交流,就需要通信所使用的语言和规定,这就是协议,在数据链路层中,最常使用的就是以太网协议。

由于都是用二进制数据来进行数据传输,所以并不知道里面的信息到底是什么意义,那么就需要协议来定义什么样的信息会被传输,以及传输的顺序。

传输的信息里,包含:发送方的地址,接收方的地址,信息的实际内容,这样一个信息的总的单元,称为帧。

以太网帧的形式

由于接收方的MAC地址对于一台机器来说可以立即得知信息是不是发给本机器,如果不是就可以无视掉,所以接收方MAC会放在前面,后面紧跟着发送方MAC(MAC源地址),然后就是其他信息了。

由于传输数据需要从第三层到第二层,那么第二层就需要知道第三层使用的协议,那么在接收方的机器的第二层检测完MAC目标地址后,接收方第二层需要将信息发送到第三层对应的协议,接收方的:

在这里插入图片描述

除此之外,还需要侦测数据的正确性,那么就需要CRC,CRC是循环冗余检测,也就是CRC对于每条发送的信息都是不一样的,发送方使用某公式计算出被传送数据所含信息的一个CRC值,然后接收方则对接收到的同一数据进行相同的计算,得到另一个CRC值,两个CRC值一致,那么说明发送中没有出错,如果不一致,那么接收方会要求发送方重新发送该数据。

至此,完整的一帧结构为:

在这里插入图片描述
其中深色的为帧头,也有分法是将CRC分成帧尾。帧头就是格式固定的,接收方和发送方MAC地址分别占用6字节,第三层协议用2个字节编码,CRC用4个字节编码,一共18个字节。以太网帧的最小尺寸是64字节,最大是1518字节,也就是除帧头外,可以放入1500字节的数据。

那么机器A和机器B交换数据的流程为:

1.机器A的一个应用发送数据到机器B的应用上
2.在机器A这个发送方,此数据从应用层 -> 物理层,穿过OSI各层
3.发送方的第三层告知第二层所使用的协议
4.第二层用这些信息,包装成一个帧,通过网络传输
5.机器B收到机器A发送的帧,首先检查帧头的接收方MAC地址
6.检查CRC是否一致
7.如果正确,那么依据帧中的协议部分,机器B的第二层就把数据正确地发送给第三层
8.数据在接收方从物理层 -> 应用层 到达机器B地应用

交换机和 CAM 表

交换机地作用是用来连接多个可以互联机器的设备。

在这里插入图片描述

交换机之所以比hub强大的地方在于,可以将一个RJ45接口和一个MAC地址相关联,这个表就是CAM表,也叫内容可寻址寄存表。

开始CAM表里是空的,此时,收到了一个帧请求,假设如下:

在这里插入图片描述

那么交换机读取此帧,就会发现源MAC地址,是23号机器的网卡MAC地址,而且这个帧是从端口1来的,那么就会将端口1和23号机器的网卡MAC地址更新到CAM表中。

但是由于不知道发送到哪个端口,就会发送给除了源MAC所关联的机器以外的所有机器,这种操作叫做flooding(泛洪),之后25号机器收到这个帧,就会发送回23号机器:

在这里插入图片描述
这个时候,交换机就知道了对应的端口是25号机器,然后就会更新CAM表。

由于CAM表的内容会不断增加,所以有效的解决这个问题,就引入了一个TTL(生存时间),TTL结束,那么就会从CAM表中清空,如果相同的MAC地址和端口发送帧,且CAM表中还存在这一条,那么TTL时间就会被重置。

由此可以看出,交换机不会主动获取机器的MAC地址,而是根据发送的帧被动更新CAM表,且一般交换机本身是没有MAC地址的,但是有些交换机可以配置管理,这种情况下,就需要一个MAC地址了。

CAM表的实例:

在这里插入图片描述

可以看出,相同的端口有不同的MAC地址,这是因为这个端口上连接了另一台交换机,那么第二胎交换机上的机器的MAC地址就会显示在第一台交换机的端口上。

tips:如果向不存在的目标MAC地址发送大量的帧,那么交换机就会发送所有连着的机器端口,那么很快就会超负荷,还有就是发送大量的帧,且每个帧里面的源MAC地址都变换,那么CAM表就会被填充的更多,那么读取数据花的时间就会更长,很快交换机的内存就不够用了。

交换机带来的变革

交换机在发生冲突的时候,已经被设计好了来应对,因为交换机本身拥有内存,所以当收到一个或多个帧时,就会将其存储在内存里,当目标机连接的双绞线的传输对空闲时才会转发该帧。

所以就不用CSMA/CD了,这时候的网卡称为全双工的方式来运作的,那么CSMA/CD的网卡就是以半双工的方式来运作的,除了双工,还有单工的方式:

1.单工:数据传输是单向的,通信双方中,一方为固定发送端,另一方为固定接收端,数据只能沿一个方向传输。

2.半双工:数据传输是双向的,数据在通信双方之间能够在两个方向上进行发送,但不能同时发送,同一时间只允许一方发送信息。

3.全双工:数据传输是双向的,且双方在发送数据的同时也能够接受数据,两者可以同步进行。

但是如果一个机器的网卡设置成全双工连接到hub上,那么可能其他机器就只能等待hub空闲的时候才可以发送信息,那么很有可能剩下的其他机器效率就很低,而且如果这个全双工机器下载很大的文件,不断传输信息,那么其他的机器可能就无法工作了。

如果一个交换机连接集线器了,那么连接集线器的交换机端口就会设置成半双工来适应集线器,其他端口还是以全双工的方式。

随着交换机的提升,出现了一种VLAN(虚拟局域网)技术,就是将交换机的端口分隔成不同网络中的能力,使得分隔开开的端口不能再相互通信,只能在自己的VLAN组中通信。

VLAN的作用是通过网络分隔提供安全性,比如讲学校的管理部门分成学生,老师和高层,各部分用自己的VLAN组,如果想换成其他的VLAN,只需要在交换机上配置即可,那么学生就没有权利访问老师和高层,老师也不能访问高层的网络等等,这样就可以在一个大型交换机上进行权限分隔。

在这里插入图片描述

第三层:网络层

概念

网络层的作用就是互连网络,但是我们在到达目标网络的主机之前,需要经过几个其他网络,在网络层中的地址是用IP地址来表示的。

IP地址

IP地址是由一部分网络地址和另一部分主机地址表示的,IP地址编码为32位,也就是4个字节:192.168.0.1这样的表示方式,而每个段最多是2的8次方,也就是0~255,那么可以推断出最小IP地址是0.0.0.0,最大IP地址是255.255.255.255

而判断网络地址和主机地址是根据子网掩码来得到的,子网掩码指明了IP地址的哪些部分是网络地址,哪些部分是主机地址,子网掩码中为1的二进制代表IP地址的网络部分,也就是网络地址,二进制0代表主机部分,也就是主机地址。

在这里插入图片描述

子网掩码的呈现形式中,只能是左边为1,右边为0,并不是交叉混合使用,比如11111111.11100011.00000000.00000000就是错误的,所以子网掩码的每个字节能取得值始终是下面得这些:

00000000 -> 0
10000000 -> 128
11000000 -> 192
11100000 -> 224
11110000 -> 240
11111000 -> 248
11111100 -> 252
11111110 -> 254
11111111 -> 255

那么IP地址的范围通过子网掩码可以确定从网络地址开始到最大为止。比如:

在这里插入图片描述
由于网络地址是相同的,那么上面的范围就是:

在这里插入图片描述

所以要找到网络中的地址数量,就需要知道主机地址的二进制位数即可,那么IP地址数量就是2的“子网掩码中 0 的个数” 次方。

地址范围中的第一个IP地址是这个网络的地址本身,不能为某个主机所用,最后一个则是广播地址,标识该网络中的所有主机。

RFC是一种文档,私人或公司内部使用的IP地址范围是有约束的,由RFC 1918定义,为了不和互联网上的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地址的划分

为了网络上的安全性,大的网络往往要分成几个较小的网络,这些小的网络就被称为子网。子网掩码也可以用CIDR的表示方法,代表前多少位是1,比如10.0.0.0/16,就代表前16位是1,等同于255.255.0.0。

当要进行IP划分的时候,要注意,每个IP区域的网络地址不能有重合,如果有重合,那么就可以访问到相同网络地址的IP地址。

我们根据要划分的数量可以判断其IP范围,这里可以用巧妙的神奇数字的方式,比如:

10.45.185.24 / 255.255.248.0

神奇数字是256 - 248 = 8,对应IP地址中的185,然后找到小于或等于185的神奇数字的倍数中的最大值,那么就是184,下一个是192,那么184就是这个IP子网的第一个地址,最后一个地址就是192 - 1,后面二进制都是1,因此,网络的第一个地址是 10.45.184.0,最后一个地址是 10.45.191.255。

当在一个大的地址范围内选取一个子网,这个子网比在它之前的子网更大时,有必要跳过一定范围的地址,并在大的地址范围内留一个“空洞”。因为很有可能大的地址的网络地址会包含之前的子网的网络地址。

举例:

将 10.47.192.0 / 255.255.240.0 这个网络划分为三个子网,三个子网分别包含以下的群组:880 名技术人员;400 名商务人员;60 名经理。

首先计算每个子网的子网掩码:

技术人员的网络:880 小于 2 的 10 次方(是 1024),因此子网掩码是 255.255.252.0;
商务人员的网络:400 小于 2 的 9 次方(是 512),因此子网掩码是 255.255.254.0;
经理的网络:60 小于 2 的 6 次方(是 64),因此子网掩码是 255.255.255.192。

但是62个的IP地址对于60个经理来说使用有些限制,那么可以扩大一些到128,那么:

技术人员的网络:因为 880 小于 2 的 10 次方(是 1024),因此子网掩码是 255.255.252.0;
商务人员的网络:因为 400 小于 2 的 9 次方(是 512),因此子网掩码是 255.255.254.0;
经理的网络:因为 60 也小于 2 的 7 次方(是 128),因此子网掩码是 255.255.255.128。

技术人员地址范围:神奇数字是4,那么范围就是10.47.192.0 ~ 10.47.195.255;
商务人员地址范围:神奇数字是2,那么范围就是10.47.196.0 ~ 10.47.197.255;
经理的地址范围:神奇数字是128,那么范围就是10.47.198.0 ~ 10.47.198.127

假设这时候需要加入120位会计人员,那么会计人员的网络:因为120小于 2 的 7 次方(是 128),但是使用范围太小,可以适当扩大为2 的 8 次方(256),那么子网掩码就是255.255.255.0,这时候不能从10.47.198.128开始,因为这个子网掩码下的网络地址是10.47.198.0,能访问到经理网络,所以要从10.47.199.0开始,那么范围就是10.47.199.0 ~ 10.47.199.255。

路由

封装

一条消息从OSI模型的第七层发送,跨越所有层,直到抵达第一层,通过网络发送,那么每跨越一层,一个对应的头部就会被添加到消息单元中,因此,我们将积累不同层的对应头部:

在这里插入图片描述

这种机制被称为封装,将一条消息封装在另一条消息中,层层嵌套,那么其实在第二层中,实际的以太网帧是这样的:

在这里插入图片描述

概念

路由,使我们能够向自己所属网络之外发送消息,因为各个网络之间是相互连接的,需要经过多个网络之后,才能连接上某个网络。

在这里插入图片描述

路由器

路由器是OSI第三层的硬件,可以连接多个网络,因此对于所连接的每个网络,路由器都有一个对应的接口,因此,路由器就是一个具有多个玩过接口的机器,每个接口连接到一个网络,他的作用就是把接收到的数据包分发给不同的网络,与普通电脑区别就是,路由器将不是发给自己的数据包准确地分发出去,起到中继作用,而普通电脑会将不是发给自己地数据包丢弃。

比如收到了如下地以太网帧:

在这里插入图片描述

源IP地址为10.0.0.1,源MAC地址并不知道,这个帧地MAC地址只是最后一个向我们发送此帧的路由器的MAC地址,第二层通过目标MAC地址可知,是自己的MAC地址,那么读取帧头的其余部分,读取到第三层的协议是IP协议,并且得到IP数据报,发送给第三层的IP协议来处理。

第三层从IP地址得知不是自己的IP地址,那么就通过路由的方式去发送给下一个IP地址。这里如果直到下一个IP地址,就要通过路由表,与CAM表类似,路由器也有一个路由表,里面存放了要访问的IP网络地址和对应的网关,也就是如果你想访问这个IP地址,那么就需要访问这个网关才可以走下去,类似这样的结构:

要连接的网络的地址网关的 IP 地址
192.168.1.0/2410.0.0.253
192.168.122.0/2410.0.0.47
default10.0.0.23

除了普通的路由信息,还有一个默认路由,就是default,不同操作系统中有的会以0.0.0.0来表示,默认路由表示,如果要加入的网络地址不属于路由表中的任何网络,那么就需要使用默认路由来连接互联网。

路由的相关举例

在这里插入图片描述

上面的逻辑网络图中,我们想要表示路由器1和IP 地址为 192.168.0.1 的机器的路由表,首先要按照三步法来表示:

1.写出本机连接的网络
2.写出默认路由
3.写出本机无法通过前面两个步骤加入的所有其他网络

路由器1:

本机连接的网络中,可以连接192.168.0.0/24和192.168.1.0/24,且分别通过网关192.168.0.254和192.168.1.254来路由,默认路由则是192.168.1.253来通过路由器3向互联网进行路由,剩下的其他网络就剩10.0.0.0/24,通过路由192.168.0.253来通过路由器2进行路由,那么路由表就是:

要连接的网络网关的 IP 地址
192.168.0.0/24192.168.0.254
192.168.1.0/24192.168.1.254
default192.168.1.253
10.0.0.0/24192.168.0.253

192.168.0.1 的机器:

要连接的网络网关的 IP 地址
192.168.0.0/24192.168.0.1
default192.168.0.254
10.0.0.0/24192.168.0.253

那么10.0.1.2 这台机器的路由表:

要连接的网络网关的 IP 地址
10.0.1.0/2410.0.1.2
default10.0.1.254
192.168.1.0/2410.0.1.253
192.168.0.0/2410.0.1.253
10.0.0.0/2410.0.1.253

上面的还可以将网络 192.168.0.0/24 和 192.168.1.0/24 合并为一个具有较大掩码的单个网络来简化。但是合并的两个网络必须具有相同的规模,一个网络的地址范围紧随另一个之后,并且有可能使用新的掩码进行合并,满足这些才可以进行简化合并变为:

要连接的网络网关的 IP 地址
10.0.1.0/2410.0.1.2
default10.0.1.254
192.168.0.0/2310.0.1.253
10.0.0.0/2410.0.1.253

ARP协议

在路由的时候,就需要路由器的MAC地址,才可以发送以太网帧,那么如果通过IP地址查询到MAC地址,这就需要ARP协议了,ARP协议表示地址解析协议,ARP协议中,也会有一个ARP表(ARP缓存)来关联IP地址对应的MAC地址,那么我们在通过IP地址访问路由器的时候,就可以通过ARP表来查询,如果ARP表里没有,那么就会通过ARP广播的方式,发送给这个网络地址的所有设备,来返回对应的MAC地址,那么如果这个IP地址发现是自己,那么就会将自己的MAC地址进行返回,我们就可以得到相关联的MAC地址了。

假设我们机器是192.168.0.1,向机器192.168.1.2发送消息,然后要先将数据包发送给路由器的192.168.0.254这个网络接口,但是不知道MAC地址,步骤为:

1.首先查看本地ARP表,是否存在IP地址92.168.0.254对应的MAC地址关联记录

2.如果有,则直接向MAC地址发送信息,没有则通过网络发送ARP广播

3.机器192.168.0.254将回复我们,并返回它的MAC地址

4.在ARP表中写入IP地址192.168.0.254和对应的MAC地址的关联记录

5.向MAC地址发送信息

ARP其实是属于第二层和第三层的协议,就像一个桥梁一样。

梳理两个机器通信过程

还是之前的例子:

在这里插入图片描述

1.本地机器

先进行封装,然后消息从第七层到达第三层后,查看路由表,可知我们要先将数据包发送到192.168.0.254,我们发出ARP请求,获取到192.168.0.254的MAC地址,这时候帧的格式为:

在这里插入图片描述

2.交换机

接收到此帧的机器是 192.168.0.0/24 这个网络的交换机。

交换机接收到了帧,并且查看自己的CAM表是否有MAC地址,之后将帧发送至输出端口,连接到路由器,那么路由器就接收到了帧。

3.路由器

帧到达路由器,发现MAC地址是自己的,因此就将第二层以太网协议的头部移除,并将剩余的IP数据报发送给指定的第三层协议IP协议

OSI第三层读取整个第三层的头部,发现不是自己的IP地址,那么就要在路由表中查看发送至哪个网关,路由器看到目标 IP 地址 192.168.1.2 是在自己所属的网络之一(192.168.1.0/24)中,因此能够直接将数据包发送给它。

但是,要通过网络发送帧,将需要 192.168.1.2 的 MAC 地址,因此它将发出 ARP 请求。一旦收到 192.168.1.2 的 MAC 地址后,它将能够构建帧并通过网络发送。此时,帧的格式变成了:

在这里插入图片描述

4.交换机

帧将到达交换机,但是这次的交换机和第二步的交换机不一样,这次是网络 192.168.1.0/24 的交换机。交换机查看目标 MAC 地址,看到是机器 192.168.1.2 的 MAC 地址,因此将帧发给机器 192.168.1.2

5.被机器 192.168.1.2 接收

机器 192.168.1.2 接收到帧,OSI 第 2 层读取目标 MAC 地址。它看到目标 MAC 地址正是自己的 MAC 地址。因此,它将读取第二层头部的剩余部分,并将帧中包含的数据报发送给 OSI 第 3 层的协议,就是帧中指定的 IP 协议。第 3 层的 IP 协议接收数据报并读取数据报的头部,它发现目标 IP 地址正是自己的 IP 地址,因此它将把信息发送到第 4 层(传输层),第 4 层将把信息发送到第 7 层(应用层)。

ICMP协议

ICMP协议的目的就是使网络调试变得更加容易,大致来说,就是可以快速了解网络问题的根源,并为我们提供排查网络问题的工作。

自动消息

ICMP 协议用于在发生错误时自动指示错误;

ICMP 报文的头部(header)中有两类有用的信息:type 和 code。type 表示 “类型”,因此 type 用于说明 ICMP 消息的用途;code 表示 “代码”,因此 code 用于说明 ICMP 消息的角色。

例如,type 为 3 的 ICMP 数据包说明 “目标不可达”,如果我将数据包发送到一台机器,却收到 type 为 3 的 ICMP 消息,那么我就知道网络上存在问题,不能到达目的地。

当 type 为 3 时,消息的 code 则会告诉我到底是什么导致了此网络问题:
如果 code 为 0,则说明该网络不可达,Network Unreachable。一般来说,是因为途中的一个路由器的路由表中没有到达此目标网络的路由记录;
如果 code 为 1,则说明该机器不可达,Host Unreachable。应该是最后一个路由器发送了 ARP 请求,但没有得到响应。

除此之外,还有其他的自动消息,以下是比较常用的自动消息:
type(类型)为 5 的自动消息:“ICMP Redirect”,表示 “ICMP 重定向”,表明到目标有一条更短的路径;
type(类型)为 11 的自动消息:“TTL exceeded”,表示 “超过 TTL”。TTL 我们以前已经介绍过了,是 Time To Live 的缩写,表示 “生存时间”。所以 TTL exceeded 表明数据包的生存期已到期,需要丢弃此数据包。

当路由器通过接收数据包的接口返回数据包时,会使用 type 为 5 的自动消息。这意味着不一定要经过此接口,而有一条更短的路径。看到此消息的网络管理员就可以改善网络上的路由。

TTL则是,为了防止两个路由器的默认网关都是对方,那么就会出现无限来回路由的情况,防止因为错误的路由配置而导致网络饱和,TTL的值介于0到255之间,不同操作系统中是不同的,每次数据包通过一个路由器时,TTL就会-1,直到变0,就会发送ICMP 错误消息 “TTL exceeded”。

第四层:传输层

传输层的主要作用是管理应用程序的连接,保证连接的有效建立。

在传输层需要两个协议,因为有对应的两类不同的需求:

1.需要可靠地传输数据,但对传输速度没有特殊要求的应用程序
2.需要立即传输数据,但允许传输时丢失一些信息的应用程序

第一类包括大多数互联网程序,包括Web应用程序,大多数在线游戏等,丢失一个数据包,页面就无法正确显示。

第二类包括互联网广播或电视,重要的是实时发送信息,如果丢失一个或多个数据包,并不会停止广播,广播可能断断续续,但是广播会继续播放。

所以就分成了TCP和UDP两种协议。

端口

第四层使用的是port,也就是端口,端口是在机器上的应用程序的地址,端口的值是十进制的,是用两个字节来编码,也就是16bit,那么最大值就是65536,因此端口可以从0取到65536。

保留端口是某种类型服务器默认运行的端口。

应用程序保留端口
http80
https443
ssh22
tomcat8080
ftp20/21
dns53
mysql3306

保留端口只占所有可用端口的一部分,一般是1024以下的端口,但也有部分是超过了1024的保留端口

除了服务器有端口以外,客户端也有端口,客户端的端口是操作系统随机分配的,并不是保留端口,因为客户端仅在运行时监听而已,所以只要操作系统直到哪个客户端应用程序位于哪个端口即可。

UDP

UDP 协议是一种快速但不可靠的协议。数据包会尽快被发送,但我们不在乎数据包是否被收到。我们说 UDP 是一个无连接(Connectionless)的协议。

UDP 是很简单的协议。由于 UDP 的目标是速度,并不需要知道信息是否被正确接收,因此发送的报文的格式是非常简单的。

我们称UDP协议的报文为数据报,以下是UDP数据报的格式:

在这里插入图片描述
UDP的数据报头部只有四个区域:源端口号,目标端口号,总长度,Checksum

每个区域占2个字节,所以只需要8个字节。

源端口号:发送信息的应用程序的地址

目标端口号:是接收信息的应用程序的地址

数据报的总长度:此区域占2个字节,也就是最大长度是65536,一般情况下,很少见到大于512字节的UDP数据报,因为丢失一个较小的数据报是可以接受的,但是丢失较大的数据报则比较麻烦。

Checksum:类似与OSI第二层以太网帧里的CRC,也是为了确保发送的数据和接收的数据是相同的,都属于冗余校验。

那么为什么第二层已经校验了,第四层还要校验,因为有时候数据报到达第四层时,会带着从第三层跨越到第四层时产生的错误,因此,使用冗余校验非常有必要。

绝大多数的流媒体都是使用UDP,例如互联网广播,互联网电视等。

TCP

TCP 协议属于第一类,它是一种非常可靠的协议。发送的每一个数据包都必须被接收方确认接收才行,如果接收方的接收确认没有返回,发送方将会重新发送此数据包。我们说 TCP 是面向连接(Connection-Oriented)的协议。

TCP报文的头部包含许多信息,为的是能够正确地跟踪连接。在正式进行数据传输前,先要建立通信,发送的前三个数据包只用于建立通信,这些是空的数据包,因,TCP将使用报头中的信息来判断,数据包是一个连接请求,还是一个普通数据包。

那么为了验证是哪个,就需要一个标志位来表示此数据包是一个连接请求,一个响应或是一个确认,TCP报头使用flag来作为标记信息,这些标志位只可以取值0或1的二进制而已,来表明所发送的TCP消息的类型。

三次握手

1.建立连接的第一个数据包是一个同步请求,对应的标志位是SYN,表示同步的,那么就将该数据包的SYN标志位设置为1。

2.接收到SYN请求的服务器应用程序通常会回复同意与客户端应用程序进行通信,那么就会发送ACK标志位作为响应,除此之外,服务器应用程序还会询问客户端是否要与自己通信,也要设置SYN标志位,因为想使用TCP进行通信时,建立的是两个连接,所以说TCP是全双工的,所以响应的报文中同时设置SYN和ACK两个标志位。

3.客户端接收到服务器发送的ACK,表示服务器同意进行连接,且收到SYN表示服务器也发送了连接请求,所以客户端将发送ACK标志位的数据包给服务器。

在这里插入图片描述

因此TCP连接是通过交换三个数据包来建立的,这也是为什么此过程称为“三次握手”的原因。

经过三次握手的过程,双向通信已经建立,应用程序之间可以互传数据包了,在互传数据的过程中,发送的所有数据包都会设置ACK标志,以确认收到了先前的数据包。

在这里插入图片描述

四次挥手

如果要关闭他们连接,我们将使用与SYN标志位有相反作用的FIN标志位,代表结束,因为TCP的连接是全双工 的连接,所以需要中止两个方向的连接:

1.客户端发送一个设置了FIN标志位的数据包给服务器,请求关闭客户端 -> 服务器的连接

2.服务器收到这个数据包,返回一个ACK数据包作为确认,那么客户端 -> 服务器的连接就会被终止

3.服务器请求关闭服务器 -> 客户端的连接,发送一个FIN数据包给客户端

4.客户端发回ACK数据包确认关闭请求,那么服务器 -> 客户端的连接就会被终止

在这里插入图片描述

与之前建立TCP连接时对应,TCP连接终止的过程称为四次挥手,为什么2,3步骤不能合成一个一起发送,因为大多数请求下,B到A的方向还有数据要发送,服务器B将最后的数据发送完毕后,在向客户端A发送FIN报文来请求关闭B到A的连接。

当然,上面的发送FIN的时候,也会回复上一个收到的数据包,所以会发送ACK,这里的ACK并不是收到请求关闭的ACK,所以上面1,3步骤也可以写成FIN + ACK。

TCP报文段

TCP报文段就是TCP协议传输的报文单元,格式为:

在这里插入图片描述

标志位除了上面说的SYN,ACK,FIN以外,还有RST,PSH,URG等等,其中RST比剩下的重要,如果发现连接异常的机器,那么就必须警告连接的另一端的机器,需要停止该连接,就会通过发送RST标志位的数据包来完成,表示重置。

Socket套接字

socket其实就是IP 地址 + 端口号的形式来表示,socket就是操作系统提供的独立于网络协议的一种抽象,应用程序可以通过socket来发送或接收数据。

在这里插入图片描述

那么在进行网络编程时,就不需要实现复杂的三次握手,四次握手,只需要socket提供的一些API就可以了,不同的应用程序之间要连接,先用socket来连接两端,Java里,有Socket这个类,还有其他相关的类,类的方法实现了连接的建立,连接的终止,数据发送给等等操作。

NAT

NAT为了实现使私有网络中的应用程序能和外部网络进行通信,NAT表示网络地址转换。

IPv4的问题:

1.为了节省IP地址的开销

这里就使用了私有地址,私有地址就是保留供私有使用的地址,通常用于家庭,学校,企业等。

RFC1918指定了在局域网应该使用的私有地址,如果不遵循私有地址范围,会出现什么,举个例子:

把家里的网络地址设置成13.250.177.0/24,在访问其他网站和连接都没什么问题,但是在连接Github官网却访问不了,因为Github的服务器所在的网络也是13.250.177.0/24,你机器的路由表是这样的:

要连接的网络网关的 IP 地址
13.250.177.0/2413.250.177.1
default本地路由器的 IP 地址

因此,当尝试连接到IP地址为13.250.177.0/24的Github时,路由表就会高速我们必须留在本地网络上,因此我们的请求不会离开本地网络到达互联网上

2.互联网回传到私有地址中

私有地址发送信息到互联网上,可以实现,但是互联网回传到私有地址的时候,因为私有地址不属于互联网的任何一个人,所以无法被路由到,所以就需要NAT来解决。

主要原理

将私有的源IP地址被共有地址代替,这就是NAT主要原理。

NAT分为两种类型:动态NAT和静态NAT:

动态 NAT :将多个私有地址与一个公有地址相关联。因此,仅使用一个公有地址就可以连接多台机器,这样就节约了 IP 地址。

静态 NAT :每个私有地址都和一个公有地址相关联。因此,并没有节约 IP 地址。

所以大多数使用的是动态NAT。

现在需要更改通过互联网发送的数据包钟地源IP地址,用一个公有IP地址代替,这个IP地址选择的就是本地路由器在互联网端的一个合法的共有IP地址。

在这里插入图片描述

图中的117.148.64.237就是本地路由器的公有IP地址。

1.将对Github网站的请求发送到局域网

在这里插入图片描述

2.路由器对数据包运用NAT技术

在这里插入图片描述
这样,源IP地址就被更改为本地路由器的IP地址,那么响应就会往117.148.64.237发送响应,但是本地路由器如何将响应数据包发送到正确的机器呢,这里就需要使用源端口号和目标端口号,发出请求的机器选择一个源端口号,那么第四层的信息,就会得到以下帧的内容:

在这里插入图片描述

那么本地路由器将收到该帧,并记录源地址92.168.0.1 与使用的源端口 12345 的对应关系。实际上,它甚至会在一个表中记录一个四元组信息(源 IP 地址,目标 IP 地址,源端口号,目标端口号),这个表被称为 NAT 表,内容如下所示:

源 IP 地址,目标 IP 地址,源端口号,目标端口号源 IP 地址,目标 IP 地址,源端口号,目标端口号
192.168.0.1,13.250.177.223,12345,80117.148.64.237,13.250.177.223,12345,80

左边是局域网中的帧的四元组信息,右边是使用NAT技术之后,帧从本地路由器发出时的四元组信息。

因此,本地路由器发送到互联网中的帧的内容为:

在这里插入图片描述
Github网站的服务器将响应此请求,并向本地路由器发送以下帧:

在这里插入图片描述
那么本地路由器收到 Github 网站的服务器发来的帧,就在自己的 NAT 表中查找,查找到了对应 12345 这个源端口号的那条信息,发现须要以相反的方向来使用 NAT,将帧发送给 192.168.0.1 这台机器。

但是如果局域网中两个机器使用相同的源端口发出请求,路由器的NAT表是这样的:

源 IP 地址,目标 IP 地址,源端口号,目标端口号源 IP 地址,目标 IP 地址,源端口号,目标端口号
192.168.0.1,13.250.177.223,12345,80117.148.64.237,13.250.177.223,12345,80
192.168.0.2,13.250.177.223,12345,80117.148.64.237,13.250.177.223,12345,80

这首路由器会同时修改源IP地址和源端口号,以响应对应的机器:

源 IP 地址,目标 IP 地址,源端口号,目标端口号源 IP 地址,目标 IP 地址,源端口号,目标端口号
192.168.0.1,13.250.177.223,12345,80117.148.64.237,13.250.177.223,5678,80
192.168.0.2,13.250.177.223,12345,80117.148.64.237,13.250.177.223,5679,80

这时候,当帧目标端口号5678返回时,本地路由器就直到将其发送192.168.0.1这台机器,如果是5679返回,就将其发往 192.168.0.2 这台机器。

因为是路由器自己选择源端口,所以永远不会存在网格相同的源端口。

端口转发

虽然借助动态NAT,拥有私有地址的机器也可以访问互联网,但是私有地址的机器却不能被外界访问,我们只有一个公有IP地址,因此,连接是从外部发起时,本地路由器将无法直到正在请求哪个具有私有IP地址的机器。

这就需要用到端口转发,端口转发就是将本地路由器的一个端口重定向到局域网中机器上的指定端口,比如,局域网中的IP地址为192.168.0.1 的这台机器上的 80 端口运行着一个 Web 服务器。

在这里插入图片描述

因此,我们将告诉本地路由器,到达其80端口的任何数据包都必须被重定向到IP地址为192.168.0.1 的机器的 80 端口上。这里面也有一个端口穿法表:

协议外部 IP 地址外部端口号内部 IP 地址内部端口号
TCP117.148.64.23780192.168.0.180

这样,任何对本地路由器的公有IP地址的80端口访问,都将被自动重定向到局域网中的192.168.0.1 这台机器上的 Web 服务器。我们也可以将连接重定向到初始端口以外的其他端口。

在这里插入图片描述

但是如果局域网上有两个Web服务器,就不得不做出选择,就是将一个给定端口只能对应单个Web服务器。

第七层:应用层

DHCP协议

IP地址是连接其他机器的重要环节,IP地址的获取方式有两种:

1.手动的(manual):或者称为静态的(static),你可以自己选择机器的 IP 地址。
2.动态的(dynamic):IP 地址由服务器提供。这个服务器被称为 DHCP 服务器,DHCP 服务器除了 IP 地址的分配以外还有其他用途。

手动方法,首先要知道离开局域网访问别的网络,就必须知道网关的IP,而且如何确保自己所选的IP地址有没有被局域网的其他机器使用,手动设置每一台不仅可能会出问题,而且还很麻烦,因此使用一种快速可靠的机制来为网络上的机器分配IP地址是很必要的。

DHCP表示动态主机配置协议,DHCP服务器的第一个功能是提供IP地址给发出申请的机器,如果已将网卡配置设置为自动获取IP地址,则你的机器将尝试与本地网络上可能存在的DHCP服务器联系,但是为了和局域网的其他机器通信,需要一个IP地址,但是现在没有IP地址。

但是我们有MAC地址,可以和以太网相关联,因此可以发送以太网帧,但是不知道DHCP服务器的MAC地址,那么就可以用类似ARP协议处理的方式,就是广播地址。

用于查找DHCP服务器的帧是一个DHCP DISCOVER帧,表示它是广播帧,发送到MAC地址ff:ff:ff:ff:ff:ff。

一旦我们的DHCP服务器收到DHCP DISCOVER帧,就会发送回一个提议,是一个DHCP OFFER帧,它将提供一个IP地址,子网掩码,以及默认网关的IP地址,有时还提供DNS服务器的IP地址,后面两个是可选项。

客户端接收到DHCP OFFER帧,会以DHCP REQUEST 帧来响应,这个帧也是广播形式发送,用于告知接受了哪个提议,其提议已被接受的DHCP服务器将确认请求,并发送DHCP ACK帧,以确认IP地址的分配。

但是这个IP地址是有期限的,过了期限之后,就会重新请求一个IP地址,DHCP服务器会把MAC地址关联的已分配的IP地址保存在内存中,所以会保留相同的IP地址很长时间,那么续订的时候,客户端不需要进行从 DHCP DISCOVER 开始的整个过程,而是直接从 DHCP REQUEST 开始。

DHCP协议采用UDP协议作为传输层的协议,客户端发送请求消息到DHCP服务器的67号端口,DHCP服务器发送回应消息给客户端的68号端口。

在这里插入图片描述

DNS协议

由于IP地址非常不好记忆,所以就需要域名这种的方式,方便通过域名来访问。

这里就可以使用DNS协议来进行域名的解析,DNS的工作就是接收来自客户端的查询消息,然后根据消息的内容返回响应。

域名都是用句点来分隔的,比如www.lab.glasscom.com, 这里的句点代表了不同层次之间的界限,在域名中,越靠右的位置层级越高,也就是com下一层是glasscom,再下一层是lab,再下一层是www,一个层级的部分称为域。对应的域下还有域的话就作为这个域的子域。

这种具有层次结构的域名信息会注册到DNS服务器中,每个域作为一个整体来处理,也就是一个域的信息是作为一个整体存放在DNS服务器中,不能拆分来存放多台DNS服务器中,但是一台DNS服务器可以存放多个域的信息。

每个下级域也就是子域的DNS服务器IP地址会注册到它们的上级DNS服务器中,然后上级DNS服务器的IP地址注册到更上一级DNS服务器中,以此类推,那么最后的com,cn这种的域表面是最顶层,但是在上一级,还有一层根域来保存顶级域的DNS服务器IP地址,之后便将根域的DNS信息保存在互联网中的所有DNS服务器中,那么客户端可以从任意一台DNS服务器中找到根域服务器,在通过下层目标DNS服务器。

由于分配给根域的DNS服务器IP地址全世界只有13个,且几乎不发生变化,所以可以存放,实际上,根域DNS服务器的相关信息已经包含在DNS服务器程序的配置文件中。

流程为:客服端首先访问最近的一台DNS服务器,由于最近的DNS服务器没有找到,那么就会从根域开始向下查找,直到找到域名对应的信息,然后返回查询到的IP地址。

在这里插入图片描述

由于一台服务器可以管理多个域的信息,所以并不是每个域只对应一台服务器,比如www.xiaobai.niupi,com,可能xiaobai和niupi域的信息都保存在一台DNS服务器中,那么我在这个DNS服务器中没有找到这个域名,那么下回直接找www的DNS服务器就可以了。

有时候并不需要从根域开始查询,因为DNS服务器有一个缓存功能,可以保存之前查询过的域名对应的信息,如果缓存中存在,那么直接返回即可,并且查询的域名不存在,那么不存在这个结果也会被缓存。

但是注册信息发生改变的时候,可能缓存中的信息不是正确的,所以DNS服务器中保存的信息都设置有一个有效期,超过有效期,就会从缓存中删除,而且响应的时候,也会告知客户端这一响应来自缓存还是该域名的DNS服务器。

HTTP协议

Web的操作主要基于HTTP协议,它也是OSI第七层协议,HTTP表示超文本传输协议,所有的Web文件都必须遵守这个标准都是http://这样开头的。

如今使用的大多数都是HTTP/1.1,2015年HTTP/2 标准正式发表,但是还没有完全替代大部分网站。

HTTP基于TCP协议,当我们在浏览器的地址栏输入一个URL,按下回车后浏览器会分析出URL上面的域名,然后通过DNS服务器查询出域名映射的IP地址,浏览器根据查询到的IP地址与Web服务器进行通信,而通信的协议就是HTTP协议。

在这里插入图片描述

HTTP协议采用了请求/响应模型,请求由客户端主动发出,HTTP请求/响应步骤为:

1.客户端连接到Web服务器:一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口,默认为80端口,建立一个TCP套接字(socket)连接。

2.发送HTTP请求:通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行,请求头部,空行和请求数据4部分组成。

3.Web服务器接受请求并返回HTTP响应:Web服务器解析请求,定位请求资源,服务器将资源复本写到TCP套接字,由客户端读取,一个响应由状态,响应头部,空行和响应数据4部分组成。

4.释放TCP连接:若connection模式为close,则服务器主动关闭TCP连接客户端被动关闭连接,释放TCP连接,若connection模式为keep-alive,则该连接会保持一段时间,可以继续接收请求。

5.客户端浏览器解析HTML内容:客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码,然后解析每一个响应头,响应头告知以下若干字节的HTML文档和文档的字符集,客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

HTTP是一种无状态协议,HTTP协议本身不会对发送过的请求和相应的通信状态进行持久化处理,这样做的目的是为了保持HTTP协议的简单性,从而能够快速处理大量的事务,提高效率,但是由于很多应用场景下,需要保持用户登陆的状态,所以就引入了一些技术来记录管理状态,例如Cookie。

HTTP请求方法

HTTP 1.1 协议中共定义了九种方法(也叫“动作”)来以不同方式操作指定的资源:
1.GET :get 表示“得到,获得”。请求指定的资源信息,并返回实体主体。

2.HEAD :head 表示“头,头部”。类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头。

3.POST :post 表示“张贴,公布,邮递”。向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和已有资源的修改。

4.PUT :put 表示“放,放置”。从客户端向服务器传送数据,取代指定的文档的内容。

5.DELETE :delete 表示“删除”。请求服务器删除指定的资源。

6.TRACE :trace 表示“跟踪”。HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。

7.OPTIONS :option 表示“选项”。允许客户端查看服务器的性能。

8.CONNECT :connect 表示“连接”。回显服务器收到的请求,主要用于测试或诊断。

9.PATCH :patch 表示“补丁”。是对 PUT 方法的补充,用来对已知资源进行局部更新。

一般我们常用的请求方法是 GET、POST、PUT 和 DELETE。

每个 Header 一行一个,换行符是 \r\n。当遇到连续两个 \r\n 时,Header 部分结束,后面的数据全部是 Body。

HTTP状态码:

HTTP 响应的第一行都是状态行,依次是当前 HTTP 版本号,3 位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。例如:

HTTP/1.1 200 OK

状态代码的第一个数字代表当前响应的类型:

1xx 消息:Informational(信息性状态码),表示请求已被服务器接收,继续处理。
2xx 消息:Success(成功状态码),表示请求已成功被服务器接收、理解、并接受。
3xx 消息:Redirection(重定向状态码),表示需要后续操作才能完成这一请求。
4xx 消息:Client Error(客户端错误状态码),表示请求含有语法错误或者无法被执行。
5xx 消息:Server Error(服务器错误状态码),表示服务器在处理某个正确请求时发生错误。

常见的状态码有 200(OK。表示请求成功,一般用于 GET 和 POST 请求),404(Not Found。表示服务器无法根据客户端的请求找到资源),500(Internal Server Error。表示服务器内部错误,无法完成请求),等等。

响应类型:由 Content-Type 指定(content 表示“内容”,type 表示“类型”)。例如:Content-Type: text/html;charset=utf-8 表示响应类型是 HTML 文本,并且编码是 UTF-8。Content-Type: image/jpeg 表示响应类型是 JPEG 格式的图片。

URL

以下列举了现在互联网中常见的几种URL,根据访问目标的不同,URL的写法也会不同。例如在访问Web服务器和FTP服务器时,URL中会包含服务器的域名和要访问的文件的路径名等,而发邮件的URL则包含收件人的邮件地址。此外,根据需要,URL中还会包含用户名、密码、服务器端口号等信息。

在这里插入图片描述

在这里插入图片描述
后面的文件名不写的时候,大部分都是会根据服务器默认设置的文件名进行访问,比如index.html或者default.htm之类的。

远程传输

Telnet 协议

这个协议简单、易用,在 20 世纪 80 年代就被创立了。它的功用就是在机器间传输简单信息。理论上,我们就可以使用 Telnet 来与远端机器通信啦,比如与我们的服务器通信。

但是这个协议的缺点就是太简单太基础,因此传输的信息没有经过加密,是明文传输,所以当你连接到服务器时,需要提供你的登录名和密码,那么很有可能就会被别人窃取。

SSH

SSH翻译过来是安全的核,也就是安全的提供用户使用界面。

SSH有两种不同的加密方法:

1.对称加密

全称是对称密钥加密,对称加密是比较简单的加密算法,原理是用一个密钥,也就是key来进行加密信息。

举个例子,加入此密钥叫superkey,而需要被加密的信息是message,那么加密过程就是:

在这里插入图片描述

之后接收方用同样的密钥superkey进行解密,就重新得到了明文message。

在这里插入图片描述

对称加密中的对称是指加密和解密使用的是同一个密钥,因此加密方和加密方必须都知道这个密钥,虽然对称加密强大,但是致命的缺陷就是必须谨慎地传递密钥,但几乎不可能,因为首先得把密钥传递过去,那么这个过程就会被截获。

2.非对称加密

全称是非对称密钥加密,对称加密方法中,我们只用一个密钥来进行加密或解密,非对称加密方法中,我们用一个密钥来进行加密,另一个密钥来解密,因为两个密钥不一样,所以是非对称。

非对称加密有两个密钥:

一个是公钥,用于加密,一个是私钥,用于解密。

那么公钥可以进行公开,然后将私钥保管好,这里面最有名地就是RSA算法。

SSH结合使用非对称加密和对称加密两种方法:

首先,使用非对称加密,安全地传输对称加密地密钥,之后就一直用对称加密的密钥来作为加密和解密的手段,因为非对称加密比对称加密要慢100~1000倍,这也是为什么之后主要用对称加密进行传输。

那么流程为:

1.首先,我们要交换一个对称加密的密钥,但是我们又不能以明文方式传输这个密钥,不然黑客截获之后就可以用其来解密了。因此,我们要用非对称加密的方式来加密用于对称加密的密钥。

服务器将非对称加密的公钥以明文方式传输给客户机,使客户机可以用公钥来加密。如下图(用绿色标明公钥,红色标明私钥):

在这里插入图片描述

2.客户机收到服务器传给它的公钥之后,就会用公钥来加密自己的对称加密的密钥,假设是 superkey。如下图所示:

在这里插入图片描述

然后,客户机把经过公钥加密后的对称加密密钥传给服务器。黑客可以截获这个加密后的密钥,但是他没办法解密,因为他没有用于解密的私钥,这个私钥只有服务器知道。如下图所示(假设 superkey 这个对称加密密钥,经过公钥 2K49c8uE 加密后,变成了 ch4b7&6s ):

在这里插入图片描述

服务器接收到客户机传来的密钥,使用自己的私钥来解密,就得到了对称加密的密钥。如下图所示:

在这里插入图片描述

现在,客户机和服务器都知道了对称加密的密钥是 superkey,关键是他们从没在网络间以明文传递过这个密钥。

因此,从现在开始他们可以用对称加密的方式互相发送加密的信息(用 superkey 来加密和解密),不用再担心被黑客获取信息了。

现在既然客户机和服务器已经有了安全的通信方式,客户机就可以放心地将自己的登录名和密码传输给服务器,以连接服务器了。

HTTPS

HTTP协议传输的数据是明文的,在HTTP传输过程中,任何人都有可能从中截获,修改或者伪造请求发送,HTTP传输过程不会验证通信方的身份,因此HTTP信息交换的双方可能会遭到伪装,也就是没有用户验证,且在HTTP传输过程中,接收方和发送方并不会验证报文的完整性,传输不可靠。

基于上面的问题,所以需要一个安全的HTTP协议,这就是HTTPS的由来。HTTPS 其实并不是一项新的应用层协议,只是 HTTP 通信接口部分由 SSL 和 TLS 替代而已。

HTTP + SSL/TLS = HTTPS

HTTPS除了协议名和默认端口号外(HTTPS默认端口号为443),其余都是完全沿用HTTP协议。

TLS协议

TLS表示传输层安全,TLS协议是用于确保网络连接的最常用的加密协议,TLS是SSL协议(安全套接字协议)的后继者。

SSL协议在OSI七层网络模型中,位于第五层(会话层)。SSL 在 1999 年被 IETF(互联网工程组)更名为 TLS。SSL 协议已经不再被认为是安全的了,现在我们使用的是 TLS 协议。

TLS 协议一共出现过三个版本,1.1、1.2 和 1.3,目前最广泛使用的是 1.2 版本,所以接下来的探讨都是基于 TLS 1.2 或以上的版本。版本之间的主要区别是所使用的加密算法列表,称为加密套件。

TLS协议主要的作用:

1.使用对称加密来确保数据的保密性

2.使用MAC码来确保数据的完整性,这里的MAC是指消息认证码

3.使用非对称加密来确保会话密钥的交换

4.使用整数颁发机构签署的证书来保证服务器的认证。

TLS是一个独立的协议,不只有HTTP协议可以使用,其他应用层协议都可以使用。

HTTPS协议使用TLS协议来认证和解密HTTP数据,在HTTPS中,TLS协议位于TCP和HTTP协议之间,就像这样:IP(TCP(TLS(HTTP))) 。因此,所有HTTP数据都经过加密和认证,尤其是URL,HTTP报文,HTTP请求和相应的主体。

HTTP协议和HTTPS协议的主要不同在于:

在这里插入图片描述

但是IP和TCP协议上交换的数据不受TLS的保护,尤其是客户端和服务器的IP地址,此外,DNS查询不受TLS的保护,因此可以提供有关服务器主机名(或域名)的信息。

TLS协议由两部分组成:

1.连接建立(也被称为 TLS Handshake,表示“TLS 握手”),使用公钥加密技术(非对称加密和证书签名);

2.数据交换(也被称为 TLS Record,表示“TLS 记录”):使用对称加密技术(对称加密和 MAC 码)的。

非对称加密一般使用 RSA 算法,对称加密一般使用 AES 算法。

TLS 握手协议在通信开始时执行一次。它使用非对称加密技术来交换会话密钥(session key),会话密钥也就是用于对称加密的密钥。

步骤为:

1.在进行通信之前,客户端将信任根 CA (Root CA)的证书,并且服务器具有由同一根 CA 签名的证书。这是 HTTPS 的 PKI 体系。PKI 是 Public Key Infrastructure 的缩写,表示“公钥基础设施”。

2.客户端以明文形式的“Client Hello”请求开始连接,该请求包含 TLS 的版本以及它可以使用的加密算法。

3.服务器以明文形式的“Server Hello”请求作为响应,该请求包含从客户端提供的 TLS 版本中选择的 TLS 版本,以及包含公钥并由根 CA 签名的 X.509 证书。

4.客户端使用根 CA 的公钥验证证书的签名。如果证书已过期或不是由受信任的 CA 签名,则浏览器将显示错误。如果证书通过了验证,则客户端会用随机数生成对称加密的密钥(就是会话密钥)。

5.客户端使用服务器的公钥加密会话密钥,并将其发送给服务器。

6.服务器使用自己的私钥解密,得到会话密钥。客户端和服务器现在共享一个对称加密的会话密钥。

数据交换(TLS 记录)步骤为:

1.客户端使用会话密钥加密 HTTP 请求,并计算 MAC 码。它将加密的请求发送到服务器。

2.服务器使用会话密钥解密 HTTP 请求,并校验 MAC 码。

3.服务器处理 HTTP 请求,然后用会话密钥加密 HTTP 响应,并计算 MAC 码。

4.服务器将加密的 HTTP 响应发送给客户端,客户端解密此响应,并显示网站。如果客户端发送另一个 HTTP 请求,服务器将重复这样的操作。

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值