网络的知识太多了,我决定慢慢写,零零散散写,有很多对软件学生来说不太重要的知识点,我还是记下来了,但有标注重要😀/一般般🤪/不重要😭
1. TCP/IP 5层模型😀
物理层:负责转换比特流(101001010)和高低电平。中继器、集线器、RJ45接口
数据链路层:负责网络间数据传送。路由器、以太网、MAC、网桥、交换机、VLAN
网络层:主机对主机。IP、ARP、RARP、ICMP、IGMP、RIP等协议
传输层:端口对端口(说白了就是程序对程序)。TCP、UDP、SSL等协议
应用层:应用和展示。HTTP、SSH、FTP、DNS、DHCP、RPC
2. 物理层😭
物理层有个东西要知道:信道复用技术,快速划过知道有哪几种复用技术就行
频分复用FDM😭
时分复用TDM😭
统计时分复用STDM:数据到达的时间是不固定的
波分复用WDM😭
不介绍了
码分复用CDM🤪
这里可能会有笔试题:
S站的码片序列是 00011011(也有些地方0用-1表示)
发送比特 1 时,就发送序列 00011011
发送比特 0 时,就发送反码 11100100
如果多个站,每个站的码片序列必须正交(也就是对应相乘再相加等于0)比如
S站(–1 –1 –1 +1 +1 –1 +1 +1)
T站(–1 –1 +1 –1 +1 +1 +1 –1)
3. 数据链路层🤪
下图红线过程就是数据链路层的工作
特点🤪
这层解决了三个基本问题
封装成帧
透明传输
差错控制
封装成帧😭
也就是用开始和结束符分段标记了数据
透明传输😭
帧的数据部分如果恰好也有开始/结束符,那么也要求能接收并且正确传,而不是规定数据不能含开始/结束符,这就叫透明传输。
实现方式有字节填充和零比特填充两种
字节填充
“SOH”或“EOT”的前面插入一个转义字符“ESC”(十六进制编码是 1B)
如果转义字符也出现数据当中,那么应在转义字符前面插入一个转义字符
接收端必须将转义字符删除再将数据移交给上层
零比特填充
将数据字段中出现连续6个1的情况破坏
发送端:只要发现有5 个连续 1,立即填入一个 0
接收端:只要发现 5 个连续1,对之后一位进行检查,若为0,则删除;若为1,则表示帧开始或帧结束。
差错控制🤪
由于物理和环境原因,传输数据可能出现差错,比如由1变成0,所以接收端需要循环冗余检验CRC
//TODO
注意:循环冗余检验CRC差错检测技术只能做到无差错接受,而不是可靠传输
MAC子层😀
IEEE802委员会将局域网的数据链路层拆成两个子层
逻辑链路控制 LLC (Logical Link Control)子层
媒体接入控制 MAC (Medium Access Control)子层
LLC子层的作用已经消失
MAC地址又称为硬件地址或物理地址。 固化在计算机的网卡的ROM中,实际上是适配器(网卡)的标识符
MAC地址6个字节,48位。前三个字节(即高位 24 位)是组织唯一标识符,有注册机构RA向生产网卡的厂家分配。后三个字节(即低位 24 位)是扩展标识符,一个地址块可以生成2^24个不同的地址
交换机😀
交换机刚接入以太网时,交换表是空白的,交换机通过自学习算法处理收到的数据帧,从而逐步建立起交换表:交换机每收到一个数据帧,就将其源地址写到交换表的地址项,将其进入的接口写到交换表的接口项
帧转发过程
转发帧。查找交换表
如没有,则向所有其他接口(进入的接口除外)转发。
如有,则转发给对应接口。
若交换表中给出的接口就是该帧进入交换机的接口,则应丢弃这个帧
VLAN😀
虚拟局域网 VLAN(Virtual LAN)
这图什么意思呢?是说原来的局域网分配的不合理,可以通过VLAN重新分配局域网。
举个例子:公司原来是每层楼一个部门(财务部,开发部),每层各自为一个局域网,有一天领导改战略了,每层楼组成一个子公司,财务人员和开发人员都分区各个子公司,但是电脑呢还是想开发人员和开发人员共用一个局域网,那么就可以添加交换机4,重组VLAN,如上图,VLAN1为一个局域网,VLAN2为一个局域网。
交换机的接口分为两种类别:
接入接口(access接口):用于连接主机设备,只能转发某一特定VLAN的数据。即上图的交换机1-3的1-4号接口
干道接口(trunk接口):通常用于交换机互连,它能转发所有VLAN的数据。即上图的交换机1-3的5号接口,交换机4的1-3号接口
4. 网络层😀
网络层负责的是主机到主机之间的通信以及IP数据包的路径选择
链路层是两个节点之间,网络层是多个节点可能构成不同的通路,负责选择路径
网络层提供无连接的,尽最大努力交付的,不可靠的传输服务
这一层最主要的是IP(Internet Protocol)协议,与之配套的
地址解析协议 ARP(Address Resolution Protocol)
逆地址解析协议 RARP(Reverse Address Resolution Protocol)
网际控制报文协议 ICMP(Internet Control Message Protocol)
网际组管理协议 IGMP (Internet Group Management Protocol)
IP地址和编址方法😀
全世界范围是唯一的32位的标识符,现在由“因特网名字与号码指派公司”ICANN进行分配。
两个特点
ICANN只分配网络号,主机号可以自行编址。
路由器路由表仅根据目的主机所连接的网络号来转发分组,而不考虑目的主机号(下面讲arp的时候会用到,记住它)
编址方法经历了3个阶段:分类的IP地址、子网的划分、构造超网。三个阶段是因为ip地址不够用了,原来的方法要么太多要么太少太浪费了!
分类的IP地址😀
网络号 + 主机号 net-id + host-id
注:判断是否是同一个网络,就看net-id是否一样
分成了这几类
常表示成点分十进制记法,也就是每8个转换成十进制,我们常见的192.168.1.1就是这么来的
有一些ip比较特殊(网络号全0,主机号全0),所以实际上可用的网络号和主机号为
说明:
A类:
网络位全0为00000000表示本网络,全1为01111111用于软件环回测试(也就是127开头的比如127.0.0.1),因此要-2
所以第一个可用的网络号为00000001,最后一个为01111110
主机数2^24 - 2,全0和全1的主机号有特殊的作用
B类:
网络位全100000000 00000000不指派,因此要-1(B、C类不需要软件环回测试)
所以第一个可用的网络号为100000000 00000001即128.1.0.0,最后一个为10111111 11111111即191.255.0.0
主机数2^24 - 2,全0和全1的主机号有特殊的作用
C类:
网络位全110000000 00000000 00000000不指派,因此要-1
所以第一个可用的网络号为110000000 00000000 00000001即192.0.1.0,最后一个为11011111 11111111 11111111即223.255.255.0
主机数2^8 - 2,全0和全1的主机号有特殊的作用
特殊作用究竟是指什么呢?这里有一张表
划分子网和子网掩码😀
分类的IP地址有不合理的地方,比如我编址的时候有300台机子,C类网络不够,B类又太浪费。
引入了子网掩码的概念:子网掩码说白了就是11100000…000这样的标志位,和ip地址一样也是32位,1代表网络位,0代表主机位。如何得到网络号呢?用ip和子网掩码相与,由于&运算的性质,会使得网络号留下,主机号全变为0,。
比如192.168.10.1,子网掩码是255.255.255.0,那么二进制来看,192.168.10都能&1被保留下来,而最后的.1&0,得到0,那么就得到了网络号192.168.10.0
这样一来,可以任意的划分网络位了,7位,10位,12位……
因特网规定:所有的网络都必须使用子网掩码,在路由器的路由表中也必须有子网掩码字段
如果一个网络不划分子网,则该网络使用默认的子网掩码
注:划分子网属于单位内部的事情,对外仍然表现为一个网络
ABC3个企业都是300人,申请了3个B类子网,现在可以成立一个联盟,申请一个B类网络,划分给3个企业
无分类编址CIDR😀
划分子网在一定程度上缓解了因特网在发展中遇到的困难。然而因特网仍然面临三个必须尽早解决的问题:B类地址在1992年已分配了近一半,眼看就要全部分配完毕!因特网主干网上的路由表中的项目数急剧增长。整个 IPv4 的地址空间最终将全部耗尽
CIDR 消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念,将IP地址分为两部分:前面部分是网络前缀,用于指明网络,后面部分指明主机。即网络前缀 + host-id
斜线记法:如128.14.35.7/20表示前面20位是网络前缀,后面的12位是主机号
假设一个企业有800台主机,2^9<800<2^10,32-10=22,现在可以申请一个网络前缀为22的地址块了
最长前缀匹配:如果路由表两条路由都可以匹配,优先选哦前缀最大的,也就是22和25要选25
如果
构造超网(路由聚合)😀
构成超网,也称为路由聚合,目的在于减少路由表的路由条目
化成二进制一看就明白了,不解释
编址题😀
先编网络,根据题目对应的编址方法(分类/子网/超网)合理的划分对应的网络,怎么才算合理?要看主机数量,比如下面这题,如果题目制定采用分类的IP地址进行编址,发现同一网络主机数量最多为4台,加上路由器的接口也才5个主机号,那么肯定采用C类
如果题目允许自由发挥,那么我随便编,比如222.1.x(当然每个点8位最大也是225你不能555.555.1.0),那么LAN1为222.1.1.0,LAN2为222.1.2.0以此类推
路由器之间:每个接口要属于不同的网络,所以才有图中的222.1.4.0,222.1.5.0,222.1.6.0
看一看就会了,采用其他编址方式大体也是一样的,主要是以路由器为划分的网络号不同
分组转发和路由表🤪
路由表🤪
讲清楚了IP地址,下面我们来看网络中的IP数据包是如何转发的
IP数据报(也称为网络层的分组)是由路由器转发的,路由器转发分组的依据是路由表,路由表最主要的两个信息:目的网络地址,下一跳地址[或转发接口]
- 目的网络地址:要到达的目的主机的网络号
- 下一跳地址(遥远网络):路由器为了能将分组送达目的网络,下一步应将分组交付给哪个IP地址的接口
- 转发接口(相邻网络):路由器将分组从自己的哪个接口转发
路由表可以通过以下命令查看
1 | route -n |
要找的ip与子网掩码相与,能匹配的就是下一跳。一般子网掩码为0.0.0.0都是在最后一条,接口enp6s0代表的是路由器,前面的是局域网,当然图中没有局域网,局域网匹配到的话直接走交换机的接口
抽象一点的图可以帮助理解:
路由表中的每一条记录称为一条路由,路由的类型主要有三种:
- 网络路由:如果记录的是主机号,路由表过于庞大,所以记录的是一个网络
- 特定主机路由:有时就像指定路由到某一个主机,或者网络管理人员为了更方便地控制网络和测试网络,可以是一个特定的目的主机的IP地址
- 默认路由:0.0.0.0,能与所有网络匹配,其实就是现在的路由表中没有,得从因特网找地址
下面是一张带特定主机路由的路由表,自己试试写下一跳看掌握没有
分组转发算法😀
- 从数据报的首部提取目的地址D, 和子网掩码相与提取出目的网络地址为N
- N为本网络则直接通过arp协议转发到目的主机(arp协议下面会讲),否则执行3
- 若网络 N 与此路由器直接相连,则把数据报直接交付目的网络,随后经arp协议交给目的主机,否则间接交付,执行4
- 若路由表中有目的地址为 D 的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器,否则执行5
- 对路由表中的每一行的子网掩码和 D 逐位相“与”看是否有到达网络 N 的路由,则把数据报传送给路由表指明的下一跳路由器,否则执行6
- 走默认路由0.0.0.0,从internet上找
- 找不到,分组转发出错
ARP协议😀
地址解析协议ARP:就是将同一个局域网内IP地址转换为MAC地址
还记得数据链路层说的“主机A/路由器发送帧给主机D时查找和建立交换表的过程吗”(不记得的可以点击目录中的“交换机”那节),主机A怎么知道要发送给主机D呢?通过IP地址?ip地址是个虚拟的东西,必须要映射成物理地址(MAC地址才可以知道是哪台主机)
或者看前面说的ip分组转发,转发到目的网络了,如何给目的主机呢?ip是不行的,必须要物理地址
arp协议相当于网络层和数据链路层中间的一个东西
每一个主机、路由器都设有一个 ARP高速缓存(ARP cache),里面有所在的局域网上的各主机和路由器的 IP 地址到硬件地址的映射表
可以通过arp -a命令来看arp映射表
太少了效果不是很好,其实就是ip和mac
1. 当主机A(或路由器)欲向本局域网上的某个主机B(或路由器)发送IP数据报时,就先在自己的 ARP 高速缓存中查看有无主机B的IP地址
2. 如有,则将其对应的硬件地址写入MAC帧,然后通过局域网将该MAC帧发往主机B
3. 如果没有,则进行ARP广播,得到主机B的硬件地址,写入MAC帧,再发送
如何验证呢?
还是通过抓包
1 | tcpdump -nn -i enp6s0 -p 80 or arp |
另一个窗口
1 | arp -d 本机ip && curl www.baidu.com |
如果没有建立过映射,那么在三次握手之前会发arp包
5. 传输层😀
提供端到端的逻辑通信,也就是端口或者说进程之间
Socket😭
我们说网络编程学过socket,它到底是什么?他是网络中进程通信的一种方式。起源于Unix/Linux基本哲学之一就是“一切皆文件”,理解为一种特殊的文件,用“打开open –> 读写write/read –> 关闭close”模式来完成网络间的进程通信。Socket不是什么模型啊层啊,只是一个接口,接口无非就是类似协议/标准/规范嘛,TCP/UDP连接就可以用它来实现建立
我们能看到吗?能!文件嘛怎么不能看到呢!我们首先要抛开java的socket封装,咱们用ubuntu看看这个socket“文件”
和百度进行socket连接
exec 8<> /dev/tcp/www.baidu.com/80
使用的是tcp方式(别问为什么tcp这个目录就可以建立tcp连接,还是那句话,一切皆文件)
8是什么?8就是这个socket文件
<>是输入输出流
翻译过来就是:用一个称为8的文件代表了这个socket连接
建立了tcp连接后可以发送http请求根目录
echo -e "GET / HTTP/1.0\n" 1>& 8
echo是输出, -e是解析\n转移字符串,1是输入流,>是重定向,也就是本来echo是输出在控制台上的,用了>就被输入到了这个叫8的文件中去
既然发送了请求,打开看一下这个8响应了什么?
cat 0<& 8
这不就是我们熟悉的http响应头和html嘛,这不就是所谓的tcp后发送了http嘛
从目录中看看这个8,也就是这个socket文件
$$代表当前进程的意思,/proc里面一个进程就是一个文件夹,别问我为什么文件夹可以代表进程,问就是linux一切皆文件
总之,我想说的就是socket是确实存在的,让你能真实的感受到这个socket像一个管道一样能输入输出进行进程间的通信,在linux下表现为一个文件,其他系统有其他系统的表现方式
套接字究竟是什么😭
我们常把socket翻译成套接字,套接字是什么?为什么要这么翻译?所谓套接字,就是
src: port -> dest: port
你想,网络中主机和端口千千万,将某两个对应起来,这不就“套接”上了嘛,所以叫套接字
我们通过netstat命令可以查看,这个命令使用来查看网络状态的
1 | netstat -natp |
参数t代表只看tcp的,n代表不解析名称(否则local那里显示的是wjw)p代表显示pid(就是最后一列),a自然是代表全部
参考:简书yongfutian
三大要素🤪
与其说是socket三个参数,不如说是网络进程通信的三大要素
(ip地址,协议,端口)
协议就是tcp和udp,当然实际上参数为以下两个
SOCK_STREAM:表示面向连接的数据传输方式,也就是建立tcp连接
SOCK_DGRAM:表示无连接的数据传输方式,即udp
端口,服务端需要监听一个端口(不能冲突),客户端的端口是随机的(0~65535)
这里有一道面试题:两个服务端ipA:80,ipB:80,问客户端ipC最多可以建立多少个tcp/udp连接?或者说socket连接
要想弄明白这个问题,首先是看服务端,两个不一样的ip,肯定没有关系,比如ipA是阿里的服务器,ipB是腾讯的服务器,都能用80端口对吧,不影响,这个好理解。问题在于客户端呢?我们说不考虑任何系统和其他应用进程的情况下,最多是65536个,那么ipC:3000访问ipA:80后还可以访问ipB:80吗?
答案是可以,我们说socket是采用套接字,也就是src: port -> dest: port,那么ipC:3000 -> ipA:80和ipC:3000 -> ipB:80自然不是一个东西(其实就是上面netstat那张图的最后一列PID)
题目2:客户端多个连接,服务端消耗多少个端口号?这个问题比较简单,答案就是监听的那一个,不管多少个连接进来,linux表现为fork那个文件8,java表现为开启一个线程完成请求。但是端口代表进程,一直就一个
能不能多个socket对应一个进程呢?能!这个就叫做多路复用比如epoll,这里就不展开了,埋个坑以后有机会填
UDP😀
用户数据报协议 UDP (User Datagram Protocol)
特点😀
面向数据报(无连接)
最大努力交付(不可靠)
一次发送一个报文(不分段)
支持一对一、一对多、多对一和多对多的交互通信
开销小
首部格式😀
伪首部仅仅是为了计算检验和
计算检验和😭
停止等待协议ARQ
//TODO
TCP😀
传输控制协议 TCP (Transmission Control Protocol)
特点😀
- 面向连接
- 字节流,可拆分
- 可靠交付
- 一对一
- 确认、超时重传、流量控制、拥塞控制
首部格式😀
三次握手😀
- 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
- 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1(这是值而不是标志位),随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
- 第三次握手:Client收到确认后,检查ack是否为J+1,ACK标志位是否为1,如果正确则将标志位ACK置为1,并将该数据包发送给Server,Server检查ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
四次挥手😀
- 第一次挥手,客户端设置seq和 ACK ,向服务器发送一个 FIN(终结)报文段。此时,客户端进入FIN_WAIT_1状态,表示客户端没有数据要发送给服务端了。
- 第二次挥手,服务端收到了客户端发送的 FIN 报文段,向客户端回了一个 ACK 报文段。服务端进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态
- 第三次挥手,服务端向客户端发送FIN 报文段,请求关闭连接,同时服务端进入LAST_ACK状态。
- 第四次挥手,客户端收到服务端发送的 FIN 报文段后,向服务端发送 ACK 报文段,然后客户端进入 TIME_WAIT状态。服务端收到客户端的 ACK 报文段以后,就关闭连接。此时,客户端等待2MSL(指一个片段在网络中最大的存活时间)后依然没有收到回复,则说明服务端已经正常关闭,这样客户端就可以关闭连接了。
为什么第二次挥手的时候服务端不发FIN直接关闭?
因为服务端还有数据未发送,发送完再主动关闭
一张充满水印的图道清了一切…
6. 应用层😀
HTTP😀
常见的HTTP请求动词😀
GET: 从服务器获取资源
POST: 在服务器新建资源
PUT: 在服务器更新资源
DELETE: 在服务器删除资源
HEAD: 获取资源的元数据
OPTIONAL: 查询对指定的资源支持的方法
HTTP状态码表😀
状态码 | 状态码英文名称 | 中文描述 |
---|---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 | |
100 | Continue | 继续。客户端应继续其请求 |
101 | Switching Protocols | 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 |
2** | 成功,操作被成功接收并处理 | |
200 | OK | 请求成功。一般用于GET与POST请求 |
201 | Created | 已创建。成功请求并创建了新的资源 |
202 | Accepted | 已接受。已经接受请求,但未处理完成 |
203 | Non-Authoritative Information | 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 |
204 | No Content | 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 |
205 | Reset Content | 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 |
206 | Partial Content | 部分内容。服务器成功处理了部分GET请求 |
3** | 重定向,需要进一步的操作以完成请求 | |
300 | Multiple Choices | 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择 |
301 | Moved Permanently | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 | Found | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
303 | See Other | 查看其它地址。与301类似。使用GET和POST请求查看 |
304 | Not Modified | 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 |
305 | Use Proxy | 使用代理。所请求的资源必须通过代理访问 |
306 | Unused | 已经被废弃的HTTP状态码 |
307 | Temporary Redirect | 临时重定向。与302类似。使用GET请求重定向 |
4** | 客户端错误,请求包含语法错误或无法完成请求 | |
400 | Bad Request | 客户端请求的语法错误,服务器无法理解 |
401 | Unauthorized | 请求要求用户的身份认证 |
402 | Payment Required | 保留,将来使用 |
403 | Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置”您所请求的资源无法找到”的个性页面 |
405 | Method Not Allowed | 客户端请求中的方法被禁止 |
406 | Not Acceptable | 服务器无法根据客户端请求的内容特性完成请求 |
407 | Proxy Authentication Required | 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 |
408 | Request Time-out | 服务器等待客户端发送的请求时间过长,超时 |
409 | Conflict | 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突 |
410 | Gone | 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 |
411 | Length Required | 服务器无法处理客户端发送的不带Content-Length的请求信息 |
412 | Precondition Failed | 客户端请求信息的先决条件错误 |
413 | Request Entity Too Large | 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息 |
414 | Request-URI Too Large | 请求的URI过长(URI通常为网址),服务器无法处理 |
415 | Unsupported Media Type | 服务器无法处理请求附带的媒体格式 |
416 | Requested range not satisfiable | 客户端请求的范围无效 |
417 | Expectation Failed | 服务器无法满足Expect的请求头信息 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 | |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
501 | Not Implemented | 服务器不支持请求的功能,无法完成请求 |
502 | Bad Gateway | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 | Gateway Time-out | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 | HTTP Version not supported | 服务器不支持请求的HTTP协议的版本,无法完成处理 |
HTTP和HTTPS的区别🤪
HTTPS(Hyper Text Transfer Protocol over SecureSocket Layer)是身披SSL外壳的HTTP,与HTTP明文协议对比,HTTPS具备两大网络安全功能:加密以及身份验证。
- 加密:HTTPS传输协议可对客户端与服务器之间的传输数据进行加密,防止第三方的窃取、篡改、窥视等中间人攻击(中间人攻击可以看大佬的讲解https://www.zhihu.com/question/304030251)。
- 身份验证:客户端用户可通过HTTPS背后的SSL证书对服务器进行身份验证,辨别真假网站,避免掉入钓鱼网站的陷阱。
//TODO
输入网址敲下回车后发生了什么😀
第一步:浏览器查找域名的IP地址(DNS协议)
- 查找浏览器缓存:因为浏览器一般会缓存DNS记录一段时间,如果有缓存则返回IP
- 查找系统缓存:浏览器会进行系统调用,查找本机的hosts文件,如果找到则返回IP
- 查找路由器缓存:借助网络,路由器一般都有自己的DNS缓存,会去查找ISP 服务商缓存DNS的服务器,如果查找到则返回IP
- 递归查询:所谓递归查询就是如果主机所询问的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其他根域名服务器继续发出查询请求报文
- 迭代查询:其他根域名服务器告诉本地域名服务器下一级的服务器ip,本地域名服务器向这个服务器ip查找,再得到下一级,本地域名服务器再查找,直到找到想查找的域名对应的ip,本地服务器再发送给主机
第二步:浏览器与目标服务器建立TCP连接(TCP协议)
- 三次握手,参考上面第5小结TCP三次握手
第三步:浏览器发送HTTP请求(HTTP协议)
- 就是我们熟悉的http请求,这里包括了请求头,get的话可能会有查询字符串,post的话可能还有请求体:
第四步:可能会有重定向
部分网站会显示300开头的重定向,这是因为有些网站展示页需要做SEO优化。为了提高SEO排名,通常将www.wjw.today和wjw.today绑定为一个网站,统一经过一个服务器,再做负载均衡到不同主机服务器。
如果有重定向,那么获取到重定向的访问地址后,会再发送一次http请求
第四步:服务器处理和响应
也就是我们常说的后台,接收到请求后做处理,通常是操作数据库啦等等等等,然后返回一个响应,可能是整页HTML,也可能是现在流行的json,并返回一个200 OK状态码
第五步:释放TCP连接
四次挥手,参考上面第5小结TCP四次挥手
第六步:浏览器渲染
浏览器根据Content-type对返回的数据进行渲染,html就是text/html,json是application/json,这里通常都是异步的,浏览器不需要完全接收到响应数据包就已经开始渲染了,接收到数据后再进行相应的渲染。接下来是一些样式/图片/js文件,浏览器通过这些文件的url发送对应的请求,和之前的html页面一样的过程,只是有时这些文件不在自己的服务器,而是缓存或者cdn托管
参考