记法:应表会传网数物
应用层:网络服务与最终用户的一个接口,与http、ssh、dhcp、dns、qq、smtp、pop3相关
表示层:数据的表示、安全、压缩
会话层:建立、管理、中止会话
传输层:定义传输数据的协议端口号,以及流控的差错校验,与端口号、tcp、udp有关
网络层:进行逻辑地址寻址,实现不同网络之间的路径选择,与ip地址、路由器、ip、icmp、arp相关
数据链路层:建立逻辑连接,进行硬件地址寻址,差错校验等功能,与mac地址、交换机相关
物理层:建立、维护、断开物理连接,与网线、网卡、光纤等相关
详细图
功能 :数据链路的建立、维护、与拆除;帧包装、帧传输、帧同步;帧的交错回复;流量控制
以太网地址用来识别一个以太网上的某个单独的设备或一组设备
每个设备的硬件都有,只有是支持tcp/ip协议的
mac地址是由厂商固定到设备的芯片里的 --> 造网卡的厂商
16进制,12个16进制数 --> 二进制里是48位
mac地址的查看:
window里 -> ipconfig
linux里 -> ifconfig/ip add
帧的大小:18+46~1500 = 64~1518
MTU:最大传输单元 -> 一个数据帧里的数据,最大只能1500字节
数据封装过程
数据解封装过程
1.学习 学习帧里的源mac地址 --> 写入mac地址表里
2.转发
不知道目的mac地址或收到mac地址为 FF:FF:FF:FF:FF:FF,会广播 --> 给每一个接口都复制一份数据,转发过去,这样可以保证其他的所有机器都可以接收到一份相同的数据
知道目的mac地址,会单播
知道对方的ip,不知道对方的mac地址 --> 发arp广播
arp: address resolution protocol 地址解析协议:将ip地址解析到对应的mac地址
广播风暴
消耗交换机的cpu和内存,带宽 --> 现有的广播
特点:网速越来越慢,最后导致网络不可用
产生原因:是交换机和交换机之间形成了环路
避免环路的方法:
1.构建网络的时候不要形成
2.在交换机里启动STP协议 生成树协议STP spanning tree, 自动阻塞一条链路,防止出现环路
STP协议参考:https://blog.csdn.net/weixin_42442713/article/details/80909292
单工模式 :两个数据之间只能沿单一方向传输数据
半双工模式:两个数据站之间可以双向数据传输,但不能同时进行
全双工模式:两个数据站之间可双向且同时数据传输,效率最高
交换机以太网接口的速率:接口连接时进行协商,协商失败则无法正常通信
桥接模式:
若是我们上网的时候是本地连接(有线连接上网),那么交换机就会与windows本地连接的接口相连;若是使用的是无线连接(WLAN),那么交换机就会与windows WLAN接口相连。图中,只是物理上连接在一起了。
如果linux和linux2都使用桥接模式,就相当于这两台机器都与本地连接连在同一个交换机上。且我们linux和linux2要使用和本地连接相同网段的IP地址。然后交换机会与路由器相连,然后虚拟机就可以借用路由器进行上网了。选择桥接仅仅是允许VMware借用我们的本地连接虚拟出来一个连接连到路由器上。相当于我们的虚拟机与本地连接相连,本地连接连到路由器上,等于我们虚拟机连到路由器上,这样我们的虚拟机就可以上网了。
虚拟机和本地连接是相同网段,网关都要填本地连接的网关。
vmnet0 对应的桥接模式:bridge 直接连接到物理网络,其实就是虚拟机和真实机器在同一个局域网里,利用真实机器的网卡连接到真实的交换机上或者路由器上
虚拟机和真实机器在同一个网段,地位是平等的
物理网络:就是真实的网络
NAT模式:
若是使用NAT模式,windows会使用vmnet8与虚拟机的几个网卡相连接通信。外网要通过真实机器上网,所以VMware又模拟了路由器,这个虚拟路由器在连接到我们的真实路由器上边。
我们可以让VMware自动配置IP,我们也可以自己自定义IP。但是原则上虚拟机和windows必须是同一个网段。使用了NAT,虚拟机使用了什么网段,那么windows里边的vmnet8就必须是哪个网段,这样才能互相通信。
NAT模式:
vmnet8网卡 对应nat模式,用来和虚拟机的网卡模式是nat的机器通信,连接在同一个局域网里
用于共享主机的ip地址,所有的虚拟机使用真实机器的ip地址联网
SNAT
不同的vlan --》不同vlan对应不同的网段 --》做了隔离的
192.168.*.1 -->真实机器的vmnet8网卡使用
192.168.*.2 -->给vmware 模拟出来的路由器的LAN口使用,作为网关使用
Hostonly模式:
我们的虚拟机网卡与windows的vmnet1一起连接在虚拟出来的交换机上,交换机选择了hostonly不会连到外网上去,只会和本机通信,相当于windows和linux添加了一条直连路由。
使用了hostonly就让linux和windows在同一个密闭的环境,即虚拟机只能和Windows的VMnet1相互通信。
仅主机模式: hostonly
vmnet1网卡 对应host only模式
虚拟机只能和真实机器通信,处于一个封闭的网络里 --》vlan里
dhcp服务器给仅主机模式的虚拟机分配ip地址的时候,没有告诉虚拟机网关的ip,没有配置网关,导致虚拟机不能进行跨网段通信,只能和真实机器通信。
作用:隔离网络,隔离广播,划分不同的虚拟局域网;逻辑上的隔离,保证安全,控制广播
一个vlan一个网段,相同 vlan可以通信,不vlan不能通信。
不同vlan之间通信需要经过路由器。
作用:实现跨交换机的相同vlan之间的通信
只使用一条链路,且通过标识来区分不同vlan的数据
跨交换机的相同vlan之间的通信,它将数据从一个交换机到另外一个交换机的传输问题
以太通道: 聚合多条线路,增加带宽,提供高可用性
实现了不同vlan之间的额通信
相当于交换机有了路由器的功能
端口绑定技术又称链路聚合(Link Aggregation)是将一组物理接口捆绑在一起作为一个逻辑接口来增加带宽的一种方法,又称为多接口负载均衡组或链路聚合组。通过在两台设备之间建立链路聚合组,可以提供更高的通讯带宽和更高的可靠性。链路聚合不仅仅为设备通信提供了冗余保护,而且不需要对硬件进行升级。
从上我们可以得知链路聚合主要有以下三个优势:
将一个大网络划分成一个一个的小网络
ip包格式
ip地址
主机唯一的标识,保证主机间正常通信
ip地址由32位二进制(32bit)组成
ip地址的分类:
A:网+主+主+主 --> 网络部分第一个数必须是0 1~126 127网段拿来给回环接口使用了
有126个网络 每个网络可以容纳主机数2^24=16777216-2
B:网+网+主+主 --> 第一个网络部分前2个数必须是10 128~191
2^14=16384 网络 每个网络可以容纳主机数2^16=65536-2
C:网+网+网+主 --> 第一个网络部分前3个数必须是110 192~223
2^21=2097152 网络 每个网络可以容纳主机数2^8=256-2
D:组播使用
E:保留做科学研究使用
在公网上能使用的ip地址是:A,B,C
公网:任何人都可以去访问的,公开的
私网:私人网络里使用的,例如:家庭里,公司里等规模小,知识内部网络的,不希望别人能随机进来的访问
私有ip
满足企业用户在内部网络中使用的需求
私有地址不能在internet上使用
私有ip分为三组:
A类:10.0.0.0~10.255.255.255
B类: 172.16.0.0~172.31.255.255
C类:192.168.0.0~192.168.255.255
nat: 网络地址转换 network address transfer
私有地址和公用地址之间转换 --> 解决了公用ip地址不足的问题,隐藏内部网络
ipv4 32位
ipv6 128位
子网掩码
作用:用来确定ip地址的网络部分
ip地址与子网掩码做逻辑“与”运算得到网络地址(0和任何数相与都等于0,1和任何数相与都等于任何数本身)
A、B、C三类地址的默认子网掩码:
A: 255.0.0.0
B:255.255.0.0
C:255.255.255.0
作用:1.测试网络的连通性;2.测试网络的质量:丢包率,响应的时间长短
网络不可达 -> 没有填写网关ip或者填写错误
目的主机不可达 -> ip没有人使用
未知的名称或服务 -> 没有填写dns服务器或者填错了
使用ip地址就可以了,可以不必使用mac地址? 使用ip地址可以找到对方了,为什么还要使用mac地址?
IP 地址是要设备上线以后,才能根据他进入了哪个子网来分配的,在设备还没有 IP 地址的时候(或者分配 IP 地址的过程中),我们还需要用 MAC 地址来区分不同的设备
linux里手动配置ip地址
1.进入网卡配置文件的目录
[root@fengdeyong ~]# cd /etc/sysconfig/network-scripts/ 目录的路径
[root@fengdeyong network-scripts]# ls 查看内容
ifcfg-ens33
2.修改配置文件 ifcfg-ens33
interface 接口
config 配置
ens33 是具体的接口的名字
ifcfg-lo 环回接口的配置 loopback
[root@fengdeyong network-scripts]# vim ifcfg-ens33
BOOTPROTO="none" none或者static 表示静态配置ip 。dhcp表示动态获得ip地址,通过dhcp服务器的分配。
NAME="ens33" 网络连接的名字
UUID="12b5a8c4-d319-4d70-ae1f-9d1fff3b2660" 网络连接的唯一标识,一个硬件会对应一个编号,这个编号自动生成,不需要修改
DEVICE="ens33" 设备名字
ONBOOT="yes" yes表示开机的时候激活这个网络连接 no 禁用这个网络连接
IPADDR=192.168.0.203 ip地址
PREFIX=24 子网掩码的长度为24 相当于 255.255.255.0
#NETMASK=255.255.255.0 子网掩码为255.255.255.0
GATEWAY=192.168.0.1 默认网关
DNS1=114.114.114.114 首选dns服务器
DNS2=192.168.0.1 备用dns服务器
3.重新启动服务,让新的配置生效
centos8里 -》 ifup ens33
centos7里 -》service network restart 刷新网络服务
centos8里,当BOOTPROTO=dhcp的时候,会动态获得ip地址,如果下面也静态指定了ip地址,也会生效
centos7里,当BOOTPROTO=dhcp的时候,会动态获得ip地址,如果下面也静态指定了ip地址,不会生效
查看dns服务器地址
cat /etc/resolv.conf --->resolve 解析 config 配置
nameserver 114.114.114.114
查看默认网关
ip route
查看ip地址
ip add
类型:
直连路由:给接口配置ip地址,同时接口的状态是up(启动、激活)
静态路由:是人添加进去的,单向的
动态路由:是路由器自己可以学习的
默认路由:是特殊的静态路由,适合于末节网络,去任何地方都走这条路由,配置默认网关其实就是添加一条默认路由
优先级:直连路由>静态路由>动态路由>默认路由
ping 的过程
A: 192.168.1.2/24 00:0C:29:11:11:11
A主机的网关: 192.168.1.1 00:0C:29:11:11:22
B: 192.168.2.2 00:0C:29:11:11:66
A主机192.168.1.2 ping B主机 192.168.2.2
1.A主机会拿B主机的ip地址和自己的子网掩码进行与运算得到网段号192.168.2.0
2.A主机会到自己的路由表里查询是否可以到达192.168.2.0 网段,发现有一条默认路由可以走,于是就选择走默认路由
0.0.0.0 0.0.0.0 192.168.1.1
192.168.1.0
3.查询默认默认的下一条地址(网关)的ip地址,然后就到arp缓存表里查询网关192.168.1.1的mac地址,如果有就直接使用,如果没有,就发arp广播
4.先封装ip包,源ip是192.168.1.2,目的ip是192.168.2.2
5.封装帧的时候,源mac地址使用自己的,目的mac使用网关的
6.非常巧妙的将数据送给了网关
A主机会查询路由表,封装数据的时候,还要查询arp缓存表
A --> B
A:192.168.10.1 /24
B:192.168.10.2 /24
A --> ping B
1.判断B的地址是否和A在相同网段
A:192.168.10.0 B:192.168.10.0
网关:网络的关卡,路由器LAN口的位置,ip是可以随意配置的,只有是网段内的默认路由里的ip --> 默认网关的ip
2.如果B的地址和A不是相同网段
A主机会查询路由表,得到网关的ip,然后再查询网关ip的mac地址,再数据链路层封装的时候,目的mac地址就使用网关ip对于的mac地址,因为交换机只是根据目的mac做转发,不看ip地址,所以就非常巧妙的将数据传送给网关
ip地址是全局的
mac地址是局域网里使用的--》arp缓存表---》发arp广播
如果ping一台服务器ping不通,可能有哪些原因?
1.检查ip地址是否配置正确
2.检查路由表
3.分段排查
ping 网关
ping taobao
ping同机房的其他服务器
宕机了或者防火墙
参考: https://www.cnblogs.com/howhy/p/6396664.html
选项:
host ip地址
net 网段
port 端口
src 源
dst 目的地
-i 指定网卡接口
-p 指定协议
-n 数字形式显示出来
ping命令在封装数据的时候采用的协议
ICMP协议,它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要作用。
ICMP是一个“错误侦测与回馈机制”,是通过ip数据包封装的,用来发送错误和控制消息
icmp用在哪里?
用在主机和路由器之间传递控制消息
数据包类型:
echo request 请求包 类型8
echo reply 响应包 类型0
为什么icmp协议封装好数据后,还要加一个ip包头,再使用ip协议再次进行封装,也就是在网络层封装了2次?
答案: 因为icmp协议里没有写明从哪里来,到哪里去,但是ip协议的包头有源ip和目的ip
icmp协议寄生在ip协议里--》寄人篱下
将ip地址解析为mac地址
什么时候用到arp协议?
1. 当两台设备需要通信时,需要使用ARP协议来获取目标设备的MAC地址。
2. 当一个设备的MAC地址发生变化时,需要使用ARP协议来更新其他设备的ARP缓存。
3. 当一个设备加入或离开网络时,需要使用ARP协议来更新其他设备的ARP缓存。
4. 当网络中有IP地址冲突时,需要使用ARP协议来解决冲突。
数据包的类型:
arp request 广播 目的mac全是FF:FF:FF:FF:FF:FF
arp response 单播
为什么说arp请求包是广播?响应包是单播?
当一个主机第一次想去获取同一网络中某个设备的MAC地址,由于此时主机不知道设备的MAC地址,所以只能广播ARP请求,以便于这个ARP请求能被设备收到。
当第一个过程走完之后(其实就是主机收到了设备的ARP应答),双方都知道对方的IP--MAC映射,也会在自己的ARP表中生成这个映射;由于ARP老化机制第二种--单播轮询,主机会定期向设备发送点到点的单播ARP请求报文,用来确认对方是否存在,确认这条ARP缓存是该更新(主要是更新老化定时器)还是删除,同时,使用单播还可以减少网络中的ARP报文数量。
相关命令
arp -a 显示所有接口的当前 ARP 缓存表
arp -d 删除指定的 IP 地址项,此处的 InetAddr 代表 IP 地址
arp -s 绑定ip到对应的mac,向 ARP 缓存添加可将 IP 地址 InetAddr 解析成物理地址 EtherAddr 的静态项
arping 用来向局域网内的其它主机发送ARP请求的指令,它可以用来测试局域网内的某个IP是否已被使用
arping -l ens33 指定从那个接口上发生arp广播
选项:
-s <数据包大小> 设置数据包的大小
-c <完成次数> 设置完成要求回应的次数
-i <间隔秒数> 指定收发信息的间隔时间
-w
-W
如果ping一台服务器ping不通,可能有哪些原因?
请求超时:
1.对方开启了防火墙,不允许icmp协议包通过
2.中间路由器丢弃了我们的ping包
Destination Host Unreachable:
1.一般是ip地址没有人使用
网络不可达:
1.没有填写默认网关
未知的名称或服务:
1.没有填写dns服务器地址
方法:
linux里字符界面的抓包工具
了解数据的封装,捕捉数据,进行分析,然后去排查网络故障,判断数据是否达到
参考:https://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html
常用选项:
host 指定主机
net 指定网络
port 指定端口
sre 源 发送
dst 目的地 送到
-i 指定监听网络接口
-p 指定协议
-n 数字形式显示出来
协议关键字:
包括ip、arp、rarp、tcp、udp、icmp等
运算类型的:or、and、not、!
or 或 :满足一个条件
and 与: 都要满足
not 取反(非)
! 取反(非)
1.抓取访问本机的icmp报文或者arp报文
tcpdump -i ens33 icmp or arp
2.抓取源ip地址是192.168.0.1访问本机的tcp协议的80端口的数据包
tcpdump -i ens33 src host 192.168.0.1 and tcp port 80
3.抓取源ip是192.168.0.123,目的ip地址是114.114.114.114的udp的53号端口的数据包
tcpdump -i ens33 src host 192.168.0.123 and dst host 114.114.114.114 and udp port 53
4.抓取源ip是本机ip,目的ip地址是114.114.114.114的udp的53号端口的数据包
tcpdump -i ens33 src host 192.168.0.1 and udp port 53
5.抓取访问本机的22号端口或者80端口的数据包
tcpdump -i ens33 port 22 or port 80
6.抓取源ip是192.168.0.0网段来的,访问本机22号端口的数据包
tcpdump -i ens33 src net 192.168.0.0/24 and port 22
其他抓包工具
科来 : 图形界面的抓包工具,window里使用的,需要付费
wireshark:window和linux里都有,是开源并且免费的抓包工具
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),前身是BOOTP协议,是一个局域网的网络协议,使用UDP协议工作,统一使用两个IANA分配的端口:67(服务器端),68(客户端)。DHCP通常被用于局域网环境,主要作用是集中的管理、分配IP地址,使client动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。简单来说,DHCP就是一个不需要账号密码登录的、自动给内网机器分配IP地址等信息的协议。
IP地址分配方式
DHCP SERVER负责接收客户端的DHCP请求,集中管理所有客户机的IP地址设定资料,并负责处理客户端的DHCP请求,相比于BOOTP,DHCP通过“租约”来实现动态分配IP的功能,实现IP的时分复用,从而解决IP资源短缺的问题。
优势:
如果我们的客户端获得了ip地址以后,会保存曾经使用的ip地址,下次去续约的时候,直接发dhcp request包
申请以前使用过的ip地址
dhcp服务器如何知道地址池里的哪些ip地址分配出去了,哪些没有分配呢?
记录到文件里/var/lib/dhcpd/dhcpd.leases
如何局域网里有人静态配置ip地址了192.168.1.8,dhcp服务器在分配ip地址的时候,是否还会把192.168.1.8分配给其他的客户机,导致出现ip地址冲突呢?
不会
dhcp服务器从地址池里分配一个ip地址给别人的时候,会做什么工作,避免ip地址在局域网里已经使用,避免ip地址冲突呢?
发arp广播
Linux里的nat功能是通过iptables软件来实现的
优缺点:
局域网主机共享单个公网IP地址接入Internet
隐藏了内网的ip地址,保护了内网信息
SNAT策略的原理
源地址转换,Source Network Address Translation
修改数据包的源IP地址
站在用户的角度,帮助用户上网的
DNAT策略的典型应用环境
在Internet中发布位于企业局域网内的服务器
DNAT策略的原理
目标地址转换,Destination Network Address Translation
修改数据包的目标IP地址
站在企业的角度,将服务器发布出去
可以通过不同的端口号发布内网不同的服务器
iptables和netfilter的关系
iptables 是一个linux里的防火墙工具
linux系统内部有一个内核(kernel)--》对tcp/ip协议族 ---》 netfilter 模块--》专门对进出系统的数据进行过滤
iptables 是给netfilter模块传递参数的一个工具
iptables 和 netfilter 是一套 Linux 防火墙组合工具,共同合作完成系统的防护工作。iptables 是客户端工具,netfilter 是服务端程序,iptables 工作在用户态,netfilter 工作在内核态,用户可以通过 iptables 命令作用到服务端的 netfilter,netfilter 触发相应的回调函数(hook 机制)执行相应的防护动作。
用户通过 iptables 下发安全规则或策略,netfilter 执行规则所对应的动作,来完成对系统的防护。netfilter 的本质就是 对报文进行规则的匹配,针对不同的规则,执行相应的动作 。
这些规则有不同的功能,也有相同的功能,在报文传输的整个过程中,有不同的作用点,有的作用在入口,有的作用在出口,有的作用在中间协议栈等等。为了方便管理这些规则集,netfilter 实现上引入了两个概念: 链(chain)和表(table)。
路由追踪命令
traceroute
tracepath
tracert
作用:提供端口到端口的连接
不同进程会监听不同的端口
常见的进程监听的端口号:
mysql |
3306 | TCP 密文 |
web | 80 |
TCP |
ssh | 22 | TCP |
telnet | 23 | TCP 远程控制的,明文传输,不安全 |
dns | 53 | UDP dns的主从服务器之间的数据传输 |
ftp | 21 | TCP |
smtp | 25 | TCP 发送邮件 |
pop3 | 110 | TCP 收取邮件 |
nginx | 80 | TCP |
kafka | 9092 | TCP |
8000 | UDP |
特点:可靠的、面向连接的协议;传输效率低
适用场景:mysql,ssh,http
tcp封装格式:
端口号的范围: 1~ 2^16 = 1 ~ 65536
有些端口好是已经分配给了经典的服务了,或者系统预留了
1~1024 --> 经典的服务和系统预留
随机产生的端口号的范围 1024~65535
6个标志位:
URG |
紧急位 | 紧急 |
ACK | 确认位 | 确认 |
PSH | 急迫位 | 通知应用程序尽快处理数据,不要让数据在缓存里停留 |
RST | 重置位 | 重新连接 |
SYN | 同步位 | 建立连接 |
FIN | 终止位 | 请求断开连接 |
linux中的文件/etc/services 会记录哪个协议默认使用哪个端口,支持tcp还是udp
第一次握手:建立连接时,客户端发送syn包(SYN=1,初始序列号seq = x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。(第一次:客户端主动发送包syn,TCP规定SYN的报文不能携带数据,但是需要消耗一个序列号)
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;(第二次:服务器回复的时候,确认报文是:ACK=1,SYN =1,确认号:ack = x+1,自己初始一个序列号:seq = y)
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。(第三次:客户端回复的时候确认报文:ACK =1,ack =y+1,自己的序列号:seq = x+1)最后双方都进入ESTABLISHED状态,就可以开始进行通信了
先说下自己对四次挥手的总结:
第一次:客户端向服务器提出连接释放,进入等待状态。
第二次:服务器向客户端发出确认报文,进入等待关闭的状态。
第三次:客户端收到服务器的确认,继续等待。这时服务器B向客户端A发送连接释放的确认阶段,等待A的确认。
第四次:A收到B的释放确认后,发出确认关闭,此时B已经关了,但是A还在等待2∗∗MSL(最长报文段寿命)后,确认关闭,四次挥手结束
(1)第一次:A的应用进程先向其TCP发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1(终止等待1)状态,等待B的确认。(第一次,是客户端先提出关闭的指令)
(2)第二次:B收到连接释放报文段后即发出确认报文段,(ACK=1,确认号ack=u+1,序号seq=v),B进入CLOSE-WAIT(关闭等待)状态,此时的TCP处于半关闭状态,A到B的连接释放。(第二次,是服务器接收到客户端的指令并进行回复确认,发送新的报文)
(3)A收到B的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。
(4)第三次:B没有要向A发出的数据,B发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),B进入LAST-ACK(最后确认)状态,等待A的确认。(第三次就是B直接向A发出最后的确认断开的报文)
(5)第四次:A收到B的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态,此时B进入CLOSED状态了。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,A才进入CLOSED状态。(第四次:A向B回复确认断开了,此时B先进入断开,A再等待2MSL后,进入断开)
ping某个ip是否会建立三次握手?
不会,因为ping命令使用的是ICMP协议,是存在于IP协议中的,是运行在网络层的,所以并不会影响到传输层的TCP协议。
三次握手封装的数据段里是否有源端口和目的端口?
有
二次握手是否可以?
不可以。如果只有两次握手,就只有主动发起方的 ISN 被确认了,而 TCP 是全双工通信,所以我们可以得到结论,两次握手是不可以的。
记住服务器的资源宝贵不能浪费! 如果在断开连接后,第一次握手请求连接的包才到会使服务器打开连接,占用资源而且容易被恶意攻击!防止攻击的方法,缩短服务器等待时间。两次握手容易死锁。如果服务器的应答分组在传输中丢失,将不知道S建立什么样的序列号,C认为连接还未建立成功,将忽略S发来的任何数据分组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
建立连接时,ACK和SYN可以放在一个报文里来发送。而关闭连接时,被动关闭方可能还需要发送一些数据后,再发送FIN报文表示同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
MSL指的是Maximum Segment Lifetime:一段TCP报文在传输过程中的最大生命周期。2MSL即是服务器端发出为FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长。
两个存在的理由:1、无法保证最后发送的ACK报文会一定被对方收到,所以需要重发可能丢失的ACK报文。2、关闭链接一段时间后可能会在相同的IP地址和端口建立新的连接,为了防止旧连接的重复分组在新连接已经终止后再现。2MSL足以让分组最多存活msl秒被丢弃。
两个重要的算法
流量控制和拥塞控制
TCP协议通过滑动窗口来进行流量控制,它是控制发送方的发送速度从而使接受者来得及接收并处理。而拥塞控制作用于整体网络,它是防止过多的包被发送到网络中,避免出现网络负载过大,网络拥塞的情况。
流量控制
TCP协议通过滑动窗口来进行流量控制,它是控制发送方的发送速度从而使接受者来得及接收并处理。而拥塞控制作用于整体网络,它是防止过多的包被发送到网络中,避免出现网络负载过大,网络拥塞的情况。
拥塞控制
拥塞控制状态机的状态有五种,分别是:"Open,Disorder、CWR、Recovery和Loss状态"。四个算法为"慢启动,拥塞避免,拥塞发生时算法(快重传)和快速恢复"。
通过滑动窗口的值来进行流量控制 ---》网络不堵的情况下
特点:不可靠的,无连接的协议;传输效率高
适用场景:qq,dns,dhcp
内核态: 工作在内核空间里的进程的状态--》内核态
用户态: 工作用户空间里的进程 --》用户态
用户态的进程不能访问内核空间
内核态的进程可以访问用户空间
什么时候用户启动的进程的状态可以变成内核态?
1.系统调用的时候
2.中断的时候:
硬件出现问题(异常)
IO(进出或者读写)的时候
防火墙是整个数据包进入主机前的第一道关卡,是一种应用于网络上的过滤机制。
从保护对象上可分为:主机防火墙、网络防火墙;从物理上可分为:硬件防火墙、软件防火墙;
防火墙主要通过Netfilter与TCP Wrappers两个机制来管理的。
1)Netfilter:数据包过滤机制
2)TCP Wrappers:程序管理机制
关于数据包过滤机制(Netfilter)有两个软件:firewalld与iptables
iptables和netfilter的关系
防火墙:数据过滤机制
包过滤机制是netfilter,管理工具是iptables
netfilter --》阵法(机关) --》八卦阵 、一字长蛇阵、18铜人阵 等 --》是一个软件属于linux内核里的一个小功能
神话--》秦始皇陵
八卦阵--》
iptables 相当于给阵法传递参数--》告诉阵法如何调整,运转,对数据包进行过滤 --》是一个软件,只是给netfilter传递参数,查看netfilter里的信息
kernel --》netfilter(对网络里的数据进行过滤)---》iptables 是一个应用软件,和netfilter打交道,给netfilter传参,同时获取内核里的数据,展示给外面的用户看。
kernel --》netfilter(对网络里的数据进行过滤)《---》iptables 《---》人
参考:https://blog.csdn.net/lilygg/article/details/84981537
forewalld和iptables的区别:
相同点:
不同点:
4表5链
规则链
INPUT | 处理入站数据包 |
OUTPUT | 处理出站数据包 |
FORWARD | 处理转发数据包 |
POSTROUTING | 在进行路由选择后处理数据包 |
PREROUTING | 在进行路由选择前处理数据包 |
规则表
raw | 确定是否对该数据包进行状态跟踪 |
mangle | 为数据包设置标记 |
net | 修改数据包中的源、ip地址或端口 SNAT/DNAT |
filter | 确定是否放行该数据包(过滤) |
报文流向:
流入本机:PREROUTING --> INPUT-->用户空间进程
流出本机:用户空间进程-->OUTPUT--> POSTROUTING
转发:PREROUTING --> FORWARD --> POSTROUTING
iptables的语法格式
设置规则内容
-A | 在链尾追加一条新的规则append |
-I | 在指定位置(或链首)插入一条新的规则insert |
-R | 修改、替换指定位置或内容的规则replace |
-P | 设置指定链的默认策略policy |
列表查看规则
-L | 列表查看各条规则的信息 |
--line-numbers | 查看规则信息时显示规则的行号 |
-n | 以数字形式显示ip地址、端口等信息number |
-v | 显示数据包个数、字节数等详细信息verbose |
清除规则
-D | 删除指定位置或内容的规则delete |
-F | 清空规则链内的所有规则flush |
自定义规则链
-N | 创建一条新的规则链new |
-X | 删除自定规则链 |
其他 -h 查看iptables命令的使用帮助
通过条件匹配 协议匹配 -p 协议名
-j 动作
ACCEPT | 接受数据 |
DROP | 不给任何回复,直接丢弃 |
REJECT | 给不能到达的回复,还是拒绝了,但是给回复 |
LOG | 记日志功能 |
SNAT | 修改数据包的源地址信息 |
DNAT | 修改数据包的目的地址信息 |
MASQUERADE | 地址伪装,实现snat功能,不需要经常换公网ip地址 |
LOG会记录到日志里
1.记录到哪里去了?
/var/log/messages
2.谁会帮我们记录日志
service rsyslogd 帮助我们记录日志
kernel netfilter 会把日志告诉rsyslogd 让它记录日志 --》kernel 将日志记录功能外包给了rsyslog
iptables的条件:
1.协议:tcp udp icmp
-p protocol 小写的p
-p icmp --icmp-type 8 ping请求报文
-p icmp --icmp-type 0 ping响应报文
2.端口号:
-p tcp --sport 源端口
-p tcp --dport 目的端口
-p udp --sport
-p udp --dport
-p tcp --sport 20:80
iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT
3.ip地址
-s source 源ip
-d destination 目的ip
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
4.mac地址
5.状态
6.其他
-i in-interface
-o out-interface
计划任务
计划任务里很大的一个坑: 调用的脚本里,如果有些命令不使用绝对路径会导致命令查找不到,从而不能被执行
定时清除iptables规则
[root@sc 713]# crontab -l
*/1 * * * * bash /lianxi/713/clear_iptables.sh
[root@sc 713]# cat /lianxi/713/clear_iptables.sh
#!/bin/bash
/usr/sbin/iptables -F -t filter
/usr/sbin/iptables -F -t nat
/usr/sbin/iptables -P INPUT ACCEPT
80端口 传输的内容是明文
HTTP 协议(HyperText Transfer Protocol,超文本传输协议):是客户端浏览器或其他程序与Web服务器之间的应用层通信协议 。
超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。
应用层协议: 理解为某个应用软件使用的协议,http协议就是web服务器(nginx等)和浏览器之间使用的
协议的作用:在互联网上上传输网站里的内容,例如:图片,网页,视频,音频等文件
场景:
1. 用户通过浏览器访问web服务器
请求报文
响应报文
2. webhook --》web领域 --》服务器里数据发生变化,可以主动推送给客户机
Webhook 是一个 API 概念,是微服务 API 的使用范式之一,也被称为反向 API,即前端不主动发送请求,完全由后端推送;举个常用例子,比如你的好友发了一条朋友圈,后端将这条消息推送给所有其他好友的客户端,就是 Webhook 的典型场景。
简单来说,Webhook 就是一个接收 HTTP POST(或GET,PUT,DELETE)的URL,一个实现了 Webhook 的 API 提供商就是在当事件发生的时候会向这个配置好的 URL 发送一条信息,与请求-响应式不同,使用 Webhook 你可以实时接受到变化。
这又是一种对 客户机-服务器 模式的逆转,在传统方法中,客户端从服务器请求数据,然后服务器提供给客户端数据(客户端是在拉数据),在 Webhook 范式下,服务器更新所需提供的资源,然后自动将其作为更新发送到客户端(服务器是在推数据),客户端不是请求者,而是被动接收方;这种控制关系的反转可以用来促进许多原本需要在远程服务器上进行更复杂的请求和不断的轮询的通信请求;通过简单地接收资源而不是直接发送请求,我们可以更新远程代码库,轻松地分配资源,甚至将其集成到现有系统中来根据 API 的需要来更新端点和相关数据,唯一的缺点是初始建立困难。
http://www.feng.com/data --->返回数据给我
http://www.feng.com:8000/sd/disk
application interface 应用程序的接口: 其实本质上就是url,用户访问这个url,我们的web服务器返回数据给客户机,获取数据的一个入口
支付宝
微信
12306
json 轻量级数据交换格式: '{"name":"feng"}'
为什么都使用这种格式?
xml
html
excel
csv文件: 里面的数据以逗号作为分隔文件
优势:
键值对格式
文本的,几乎所有的应用程序都可以读取
www: world wide web 万维网 : 世界范围内的网站,全世界都可以看得到 --》internet
渲染: 浏览器将web服务器发送过来的响应报文的内容在浏览器里显示出来,这个过程叫渲染
114.114.114.114 中国的dns服务器
一个网站打不开了,你如果去判断故障?
1.检查域名解析是否有问题,能否解析出一个ip地址
2.ping 服务器ip地址,看服务是否开机启动
3.检查服务器的web服务是否开启或者检查服务器的web服务的端口号是否打开
4.检查服务器的防火墙是否开启
5.检查web服务器的日志,看看web服务是否有限制
思路: 由外到内,一层一层去检查
工作原理:
本图有错误:7和8应该调换
http协议的版本:
0.9
1.0
非持久性连接: 短连接
无状态 : 不知道你是否曾经访问过,是老用户还是新用户
1.1 ---》使用比较多
持久性连接: 长连接
keepalive_timeout 65;
cookie和session来让http协议成为了有状态的
2.0 ---》使用挺多--》主流的
http协议2.0比1.1有什么优势?
安全、传输速度快
采用了二进制的格式传输,速度快
压缩消息头部信息---》提升速度,传输的内容少了,时间短了
http2.0 的核心优势
http在传输的时候,是明文传输的,里面有哪些内容,抓数据包可以看到
(1)采用二进制格式传输数据,而非 http1.1 的文本格式,二进制格式在协议的解析和优化扩展上带来更多的优势和可能 --》安全性有提升
(2)对消息头采用 HPACK 进行压缩传输,能够节省消息头占用的网络的流量,而 http1.1 每次请求,都会携带大量冗余头信息,浪费了很多带宽资源,头压缩能够很好的解决该问题
(3)多路复用,就是多个请求都是通过一个 TCP 连接并发完成,http1.1 虽然通过pipeline也能并发请求,但是多个请求之间的响应会被阻塞的,所以 pipeline 至今也没有被普及应用,而 http2.0做到了真正的并发请求,同时,流还支持优先级和流量控制 ---》速度上有提升
(4)Server Push,服务端能够更快的把资源推送给客户端,例如服务端可以主动把 JS 和 CSS 文件推送给客户端,而不需要客户端解析 HTML 再发送这些请求,当客户端需要的时候,它已经在客户端了 --》速度上有提升
js ,css文件里的代码 -->html-->响应头部 --》发送
js ,css文件 --->响应头部 --》发送
有哪些http的方法:
GET 请求web服务器给我们客户机某个内容(数据)
POST 请求web服务器给我们客户机某个内容(数据)
DELETE 要求web服务器删除某个内容(数据)
PUT 要求web服务器存储某个内容(数据)
http报文格式
报文: 头部信息+身体
header+ body
头部信息相对于我们的发快递的快递单,里面有发件人和收件人等信息,例如电话号码,地址,货物类型等
身体: 就是具体的数据,发快递的时候,具体的货物
请求报文的头部信息--》最后面是一个回车
头部信息里有哪些字段?
method:获取网页信息的方法: GET POST
http version: 协议版本
host: 访问的url
user-agent: 我们使用的浏览器
connection: close 表示连接已经断开,超时 keep-alive 没有超时,连接没有断开 --》长连接是否建立
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 表示我们的浏览器接收数据的类型,支持哪些类型或者格式的数据
Accept-Encoding: gzip, deflate 接收的数据的编码,是否进行压缩 gzip 使用gzip压缩的数据
cookie: 客户机访问服务器的时候,携带数据,这些数据是用来验证用户是否连接过,是老用户还是新用户
cookie:__jda=76161171.1669619150555896661579.1669619151.1669619151.1669619151.1; __jdc=76161171; __jdv=76161171|direct|-|none|-|1669619150563; o2State={%22webp%22:true%2C%22avif%22:true}; __jdu=1669619150555896661579; areaId=18; ipLoc-djd=18-1482-0-0; PCSYCityID=CN_430000_430100_0; shshshfp=457830b3d822e567591ea2a6fdf6d40f; shshshfpa=4dbb6ded-826d-38f4-9d08-4e485cf1ffe8-1669619157; shshshfpb=eICq4UZq_LY12lJddDQI20w; 3AB9D23F7A4B3C9B=PZP3JZSMVMXI2Q4JEYWLUAPOM62JRF7BLLJRUCUVJAV63T6RYUWOX7YAA3D6B2YNW7KZYS6YY7LU7NBZPDVUKO4SA4
Referer: http://www.feng.com/ 从哪个网址跳转过来的 reference 参考引用
响应报文的头部字段:
http协议: 1.1
status code : 200 状态码
server: web服务器使用的是哪个软件 nginx
Accept-Ranges: bytes
Connection: keep-alive
Content-Length: 16 内容的长度--》body的内容大小
Content-Type: text/html 发生的body的内容是一个文本/Html类型的文件
Date: Mon, 28 Nov 2022 08:22:13 GMT 响应报文发送的日期
ETag: "63734e5d-10" 网页文件的一个摘要值,通过这个摘要值,可以判断我们的文件是否发生变化
Last-Modified: Tue, 15 Nov 2022 08:31:25 GMT 网页的文件上次修改的时间
set-cookie : 服务器让客户机保存信息
状态码:
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
常见:
200 服务器正常发送了响应报文给客户机 ok
304 服务器通过请求报文里的 If-Modified-Since和If-None-Match协议的数据判断我们服务器里的数据文件是否进行修改,如果没有修改就直接发送响应报文头部信息,body部分不封装数据了,直接告诉客户机你的缓存里的数据跟我服务器里的数据一样 ---》网页内容没有修改 not modify
302 临时重定向,从一个网站跳转到另外一个网站
404 网页不存在
403 没有权限
503 服务临时不可用,其实就是限制了某些资源的访问
443端口 传输的内容是加密的
HTTPS (全称:Hypertext Transfer Protocol Secure ),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。
好处:
1.数据传输是加密的 --》防止数据窃听或者截获,泄密
2.需要核实服务器的身份 --》防止钓鱼网站
保障了网络上的安全
钓鱼网站:就是假冒一个真正的网站,骗取用户的信息或者钱财。
制作的和真正的网站一模一样,从页面看不出差异。
HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer):可以理解为HTTP+SSL/TLS, 即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL,用于安全的 HTTP 数据传输。
SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层与应用层之间对网络连接进行加密。
TLS是ssl的创新的安全协议,建立在SSL的基础上
SSL(Secure Socket Layer,安全套接字层):1994年为 Netscape 所研发,SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。
TLS(Transport Layer Security,传输层安全):其前身是 SSL,它最初的几个版本(SSL 1.0、SSL 2.0、SSL 3.0)由网景公司开发,1999年从 3.1 开始被 IETF 标准化并改名,发展至今已经有 TLS 1.0、TLS 1.1、TLS 1.2 三个版本。SSL3.0和TLS1.0由于存在安全漏洞,已经很少被使用到。TLS 1.3 改动会比较大,目前还在草案阶段,目前使用最广泛的是TLS 1.1、TLS 1.2。
明文: 明文指的是未被加密过的原始数据。
密文:明文被某种加密算法加密之后,会变成密文,从而确保原始数据的安全。密文也可以被解密,得到原始的明文。
密钥:密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称密钥,分别应用在对称加密和非对称加密上。
对称加密 有流式、分组两种,加密和解密都是使用的同一个密钥。
对称加密又叫做私钥加密,即信息的发送方和接收方使用同一个密钥去加密和解密数据。对称加密的特点是算法公开、加密和解密速度快,适合于对大数据量进行加密,常见的对称加密算法有DES、3DES、TDEA、Blowfish、RC5和IDEA。
其加密过程如下:明文 + 加密算法 + 私钥 => 密文
解密过程如下: 密文 + 解密算法 + 私钥 => 明文对称加密的特点是算法公开、加密和解密速度快,适合于对大数据量进行加密
非对称加密 加密使用的密钥和解密使用的密钥是不相同的,分别称为:公钥、私钥,公钥和算法都是公开的,私钥是保密的。非对称加密算法性能较低,但是安全性超强,由于其加密特性,非对称加密算法能加密的数据长度也是有限的。
非对称加密也叫做公钥加密。非对称加密与对称加密相比,其安全性更好。对称加密的通信双方使用相同的密钥,如果一方的密钥遭泄露,那么整个通信就会被破解。而非对称加密使用一对密钥,即公钥和私钥,且二者成对出现。私钥被自己保存,不能对外泄露。公钥指的是公共的密钥,任何人都可以获得该密钥。用公钥或私钥中的任何一个进行加密,用另一个进行解密。
被公钥加密过的密文只能被私钥解密,过程如下:
明文 + 加密算法 + 公钥 => 密文, 密文 + 解密算法 + 私钥 => 明文
被私钥加密过的密文只能被公钥解密,过程如下:
明文 + 加密算法 + 私钥 => 密文, 密文 + 解密算法 + 公钥 => 明文非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
哈希算法 将任意长度的信息转换为较短的固定长度的值,通常其长度要比信息小得多,且算法不可逆。
数字签名 签名就是在信息的后面再加上一段内容(信息经过hash后的值),可以证明信息没有被修改过。hash值一般都会加密后(也就是签名)再和信息一起发送,以保证这个hash值不被修改。
什么是证书? 其实就是公钥和私钥
CA 一个颁发证书的机构
为什么需要证书?
为了安全,确定我访问的服务器是真正的,不是钓鱼网站
企业用户需要购买证书,提升网络的可信度
证书捆绑到域名上
HTTPS为了兼顾安全与效率,同时使用了对称加密和非对称加密。数据是被对称加密传输的,对称加密过程需要客户端的一个密钥,为了确保能把该密钥安全传输到服务器端,采用非对称加密对该密钥进行加密传输,总的来说,对数据进行对称加密,对称加密所要使用的密钥通过非对称加密传输。
HTTPS在传输的过程中会涉及到三个密钥
服务器端的公钥和私钥,用来进行非对称加密
客户端生成的随机密钥,用来进行对称加密
一个HTTPS请求实际上包含了两次HTTP传输,可以细分为8步:
所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口
作用:完成两个应用程序之间的数据传输
两个网络各自通信连接中的端点
socket也是进程和进程之间通信的方式
1.文件socket -->mysql.sock -->实现的本机里不同的进程之间的通信
2.网络socket --》ip:port --》不同的机器上的不同的进程之间的通信
参考:https://zhuanlan.zhihu.com/p/275695831
(1)post更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中)
(2)post发送的数据更大(get有url长度限制)
(3)post能发送更多的数据类型(get只能发送ASCII字符)
(4)post比get慢
(5)post用于修改和写入数据,get一般用于搜索排序和筛选之类的操作(淘宝,支付宝的搜索查询都是get提交),目的是资源的获取,读取数据
共同点: 都是客户端去服务器获取数据
差异点:
1. GET方法是在URL里传递参数,参数是明文的,而且携带的参数是有限的,http的请求报文里的url的字段的值是有限制的,不能携带过多的参数
2. POST方法是在body里传递参数给服务器,非常经典的应用就是表单信息提交,可以携带非常多的数据
参考:https://blog.csdn.net/chen13333336677/article/details/100939030
cookie和session都是用来跟踪浏览器用户身份的会话方式。
(1)cookie数据存放在客户的浏览器上,session数据放在服务器上
(2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
(3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
(4)单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
(5)所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中
HTTP特点:
针对无状态的一些解决策略:
http的三个不足:
HTTPS特点:
介绍:基于HTTP协议,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护
混合加密:结合非对称加密和对称加密技术。客户端使用对称加密生成密钥对传输数据进行加密,然后使用非对称加密的公钥再对秘钥进行加密,所以网络上传输的数据是被秘钥加密的密文和用公钥加密后的秘密秘钥,因此即使被黑客截取,由于没有私钥,无法获取到加密明文的秘钥,便无法获取到明文数据。
数字摘要:通过单向hash函数对原文进行哈希,将需加密的明文“摘要”成一串固定长度(如128bit)的密文,不同的明文摘要成的密文其结果总是不相同,同样的明文其摘要必定一致,并且即使知道了摘要也不能反推出明文。
数字签名技术:数字签名建立在公钥加密体制基础上,是公钥加密技术的另一类应用。它把非对称加密技术和数字摘要结合起来,形成了实用的数字签名技术。数字签名就是利用私钥加密信息数字摘要这样就形成了数字签名
数字证书:数字证书是指在互联网通讯中标志通讯各方身份信息的一个数字认证,人们可以在网上用它来识别对方的身份。
非对称加密过程需要用到公钥进行加密,那么公钥从何而来?
其实公钥就被包含在数字证书中,数字证书通常来说是由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,证书中包含了一个密钥对(公钥和私钥)和所有者识别信息。数字证书被放到服务端,具有服务器身份验证和数据传输加密功能。
流程:
判断输入的URL是不是一个合法的URL,,如果不是就将输入的内容作为搜索的条件;如果是,判断输入是否完整。浏览器可能会对域猜测,也就是说尝试通过在输入的内容中添加前缀、后缀或两者来 “补全” URL。比如输入 58.com 则可能会在前面添加 bj。等有了一个URL之后,就解析URL。
URL是统一资源定位符(Uniform Resouce Locator),用来唯一的标识万维网中的某一个文档。URL由协议、主机名和端口、文件名三部分组成
在浏览器中输入https://bj.58.com/aaa/bbb,浏览器首先会对URL进行解析
浏览器解析完后将会使用HTTPS协议,默认端口号为443,同时会将域名和需要请求的资源分开,从而了解需要请求的是哪个服务器,请求的是服务器上什么资源。
知道域名后,浏览器通过解析域名获取目标服务器的IP地址,由域名转换得到 IP 地址就是 DNS 协议做的事情
DNS查询的基本步骤:
浏览器缓存 -> 操作系统缓存 -> 路由器缓存 -> ISP DNS 缓存 -> 根域名服务器缓存
DNS域名解析:
获取到了目标服务器的 IP 地址之后,浏览器就知道请求要发给哪个服务器了,这个时候就可以开始建立TCP连接了。
通过TCP三次握手为浏览器和服务器之间建立可靠的连接,保证双方都具有可靠的接收和发送能力。
TCP三次握手:
TCP 三次握手完成后,浏览器与目标服务器之间就建立了一个可靠的虚拟通道。如果URL中使用的是http协议,那么浏览器就可以发起HTTP请求了。
但是由于 http协议不太安全,一般检测到用户输入的是http协议的URL,都会进行一个处理重定向到https开头的URL。例如:服务器端配置文件中location部分写了一个重定向,在匹配到http开头的URL时重定向到https开头的URL。
当访问http://bj.58.com时会重定向到https://bj.58.com
HTTP不安全的根源在于“明文传输”,HTTPS是加密传输。
HTTPS在HTTP的基础上,引入了一个加密层SSL/TLS,使用SSL有助于确保只有经过身份验证的用户才能与网站进行通信。
TCP 三次握手完成后,浏览器与目标服务器会进行TLS四次握手,确保服务端是可信的。
TLS四次握手: 在HTTP通信前进行TLS握手,校验服务器证书的可信性。
TLS四次次握手完成后,浏览器就可以向服务器发送自己的 HTTP 请求了。
浏览器中输入的URL是https://bj.58.com/aaa/bbb
所以建立连接之后浏览器会向服务器请求/aaa/bbb路径下的资源。
HTTP请求首先会打到解析出的虚拟IP上,然后服务器再根据调度算法决定将请求发送到一台后端的真实服务器上。负载均衡器会把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址和端口。
浏览器的 HTTP 请求报文通过 TCP 三次握手建立的连接通道被切分成若干报文段分别发送给服务器,服务器在收到这些报文段后,按照序号以原来的顺序重组 HTTP 请求报文。然后处理并返回一个 HTTP 响应。
真实服务器响应完请求后,查看默认路由,把响应后的数据包发送给负载均衡器,负载均衡器在接收到响应包后,把包的源地址改成虚拟地址(VIP)然后发送回给客户端。
浏览器接收到来自服务器的响应资源后,会对资源进行分析。首先查看 Response header,根据不同状态码做不同的事.如果响应资源进行了压缩(比如 gzip),还需要进行解压。然后,对响应资源做缓存。最后根据响应资源里的 MIME 类型去解析响应内容(比如 HTML、Image各有不同的解析方式)。
浏览器接收到服务器返回的 HTTP 响应报文后,就开始显示https://bj.58.com/aa/bbb的HTML页面。
浏览器在显示的时候,发现需要获取其他的标签内容,比如图片、css 样式表、Java 文件,那么浏览器就会继续去发送请求这些内容,58服务器把一些静态的文件进行缓存,利用内容分发网络(CDN)进行分发,所以这些静态文件在很多 CDN 数据中心都有备份,浏览器很快就能获取到这些静态文件。
浏览器根据html文件中需要的css,png,js等资源,再去向对应的CDN请求静态资源。因为使用的是HTTP/2协议,所以可以同时发起多个HTTP请求。
当浏览器拿到一个CDN域名时,同样会有URL解析、DNS解析以及发起HTTP请求等过程,但是不同的是浏览器向DNS服务器请求得到的会是CNAME。
例如:当浏览器去请求资源jquery-1.8.3.js,会对URL:https://j2.58cdn.com.cn/js/jquery-1.8.3.js进行之前系统的DNS解析步骤.
当浏览器通过URL解析到域名j2.58cdn.com.cn后,就会查找缓存,如果没有命中,就会去查询根域,一级域,二级域,三级域服务器。
然后,LDNS会得到这个域名的CNAM:j2.58cdn.com.cn.cdn.dnsv1.com. 。cdn.dnsv1.com.是CDN专用的DNS调度系统。
LDNS再向CDN DNS发起请求, CDN 的 DNS 服务器将 CDN 的全局负载均衡设备返回给LDNS。
LDNS再向 CDN 全局负载均衡设备发起 URL 请求, CDN 全局负载均衡设备根据用户 IP 地址,以及用户请求的 URL,选择一台用户所属区域的区域负载均衡设备,向其发起请求。
区域负载均衡设备会为用户选择最合适的 CDN 缓存服务器(考虑的依据包括:服务器负载情况,距离用户的距离等),并返回给全局负载均衡设备。
全局负载均衡设备将选中的 CDN 缓存服务器 IP 地址返回给客户端。
浏览器根据IP地址向对应的CDN缓存服务器发起请求,CDN缓存服务器返回资源。
如果CDN节点上没有浏览器要请求的资源,CDN节点就去中间源查找;
如果页面没有命中,就会去源站获取数据,然后再放到cdn上。
下次再次访问cdn时,只要缓存不过期,就能命中缓存直接返回,这就不需要再回源。
当浏览器和服务器都不再需要发送数据后,就断开TCP连接。
TCP四次挥手:
至此,整个过程就结束了。
在浏览器开发者模式中可以看到在数据传输过程中使用了HTTP/2协议。HTTP/2协议在HTTP/1.1的基础上做了一些优化。
HTTP/2协议做了头部压缩、二进制传输以及并行传输、服务器推送等优化。
头部压缩
在HTTP/1.1 报文中 Header 部分含很多固定的字段,比如 Cookie、User Agent、Accept 等,大量的请求和响应的报文里有很多字段值都是重复的,这样会使得大量带宽被这些冗余的数据占用了。
HTTP/2协议使用了HPACK 算法在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。
二进制传输
HTTP/2 不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了二进制格式,头信息和数据体都是二进制,并且统称为帧(frame):头信息帧(Headers Frame)和数据帧(Data Frame)。
HTTP/2 把响应报文划分成了两类帧(*Frame*),图中的 HEADERS(首部)和 DATA(消息负载) 是帧的类型,也就是说一条 HTTP 响应,划分成了两类帧来传输,并且采用二进制来编码。
比如状态码 200 ,在 HTTP/1.1 是用 ‘2’‘0’‘0’ 三个字符来表示(二进制:00110010 00110000 00110000),共用了 3 个字节;
在 HTTP/2 对于状态码 200 的二进制编码是 10001000,只用了 1 字节就能表示,相比于 HTTP/1.1 节省了 2 个字节。
并发传输
HTTP/1.1 的实现是基于请求-响应模型的。同一个连接中,HTTP 完成一个事务(请求与响应),才能处理下一个事务,也就是说在发出请求等待响应的过程中,是没办法做其他事情的,如果响应迟迟不来,那么后续的请求是无法发送的,也造成了队头阻塞的问题。
而 HTTP/2 引出了 Stream 概念,多个 Stream 复用在一条 TCP 连接。在一个连接中可以并行的发送请求和响应。
服务器推送
在HTTP/1.1 中客户端通过 HTTP/1.1 请求从服务器那获取到了 HTML 文件,而 HTML 可能还需要依赖 CSS 来渲染页面,这时客户端还要再发起获取 CSS 文件的请求,需要两次消息往返。
而在 HTTP/2 中,客户端在访问 HTML 时,服务器可以直接主动推送 CSS 文件,减少了消息传递的次数。