目录
1、网络
-
1)复杂的网络
-
网络传输从A主机传输到B主机,可能要经历一系列复杂的过程
-
数据丢包、数据发送重复、数据完整性校验、数字信号转换模拟信号、信号衰减、。。。
-
-
-
2)七层网络参考模型及TCP/IP分层概览
-
2、HTTP协议
-
HTTP,超文本传输协议,HyperText Transfer Protocol
-
是用于从万维网【www:world wide web】服务器传输超文本到本地浏览器的传送协议
-
http传输的超文本包括
-
html文件
-
js脚本
-
图片
-
视频
-
。。。等
-
-
http是应用层的协议
-
Http协议是一种 无状态的 ,以请求/应答方式运行的协议,它使用可扩展的语义和自描述消息格式,与基于网络的超文本信息系统灵活的的互动
-
不会存储用户的信息
-
以request/response的方式运行
-
可扩展--->可以加一些header
-
消息格式--->文本、图片、音频、视频等
-
与超文本信息系统互动--->html
-
-
1)Http报文格式:
-
请求报文和响应报文结构基本相同,三部分组成
-
1)起始行【startline】,描述请求或者响应的基本信息
-
2)头部字段集合【header】,使用key-value格式更详细的说明报文
-
3)消息正文【entity】,实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据
-
-
-
-
2)请求行报文格式
-
请求方法:GET/PUT/HEAD/POST,表示对资源的操作类型
-
请求目标:通常是一个URI,标记了请求方法要操作的资源
-
版本号:表示报文使用的HTTP协议版本
-
当前主流的http协议版本:1.0、1.1和2.0
-
http1.0 短连接,可以想象成打电话
-
打电话前要先拨号,要先建立一个连接;打完电话就挂掉电话,通话完成
-
每一次通话都要建立连接
-
对服务器资源占用就有点大
-
http1.1,http2.0,长连接,可以想象成玩游戏
-
账号登录成功后,账号挂在这里,也不会退出
-
就是只要第一次连接成功,以后使用都不用再建立连接了,都使用的是第一次的连接
-
2.0要比1.1效率更高些
-
-
-
3)响应行报文格式
-
版本号:表示报文使用的HTTP协议版本
-
状态码:一个三位数,用代码的形式表示处理的结果,比如200是成功,500是服务器错误
-
原因:作为数字状态码补充,是更详细的解释文字,帮助人理解响应状态码的原因
-
-
-
4)Http头字段
-
头部字段是key-value格式,key和value之间用":"分隔,最后用CRLF换行表示字段结束
-
如Content-Type: application/json
-
Http头部字段非常灵活,可以使用标准字段如Host、Connection等已有的头字段,也可以任意添加自定义头,比如token,JSessionid等
-
这就给http协议带来了无限的扩展可能
-
-
注意事项:
-
字段名不区分大小写
-
字段名里面不允许空格
-
可以使用连字符"-",但是不允许出现下划线"_",因为有的服务器不解析这种
-
字段名后面必须紧接着冒号":",中间不允许出现空格
-
":"后面可以有多个空格
-
字段的顺序没有意义,所以可以任意排序
-
字段原则上不允许重复,除非这个字段本身的语义允许,比如set-cookie
-
-
5)常用的头字段
-
一般分为几类:
-
请求字段
-
请求中的头字段,如Host、Referer
-
cookie,使用服务器返回的通过set-cookie设置管理的http cookie信息
-
host,客户端指定自己想访问的web服务器的域名,ip地址和端口号
-
referer,浏览器向web服务器表明自己是从哪个url获取当前请求的url的
-
user-agent,告诉服务器,浏览器/或者其他客户端的类型、内核和版本等
-
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36
-
浏览器标识,客户端操作系统类型、版本、架构,浏览器渲染引擎的内核的类型及版本(兼容的内核及版本),浏览器真实版本信息以及兼容的浏览器类型、版本
-
accept,客户端告诉服务器,客户端能够接受什么媒体类型
-
如 accept: text/html,application/xhtml+xml,application/json,application/xml,...
-
accept-encoding,接收的编码
-
accept-language,接收的语言
-
accept-charset, 接收的字符集
-
accept-version,指明客户端请求的软件版本号
-
cache-control,对服务器的缓存控制
-
connection,对服务器的连接控制
-
-
响应字段
-
响应中的头字段,如Server
-
date, 设置消息发送的日期和时间
-
server,指明服务器的软件类型以及版本
-
content-type,设置响应体的MIME类型
-
content-encoding, 设置数据使用的编码类型
-
expires,设置响应体的过期时间
-
via,通知客户端代理,通过其要发送什么响应
-
accept-ranges,服务器表明自己是否接收
-
authorization,客户端接收来自web服务器的www-authenticate响应时,该头部自己的身份验证信息给web服务器
-
cache-control,对客户端的缓存控制
-
location,访问的对象已经被移到别的位置,应该到本头字段指向的地址获取
-
connection,连接状态通知
-
set-cookie,服务器设置cookie
-
-
通用字段
-
在请求和响应头里面都可以出现,如Content-Type、Connection
-
connection: keep-alive
-
持久连接意思是,一端没有明确断开连接,那么保持tcp的连接
-
content-type常用:媒体类型,MIME,
-
如果是请求的content-type:
-
客户端告诉服务器,发送给服务器的数据的媒体类型
-
如果是响应的content-type
-
服务器返回的数据的媒体类型
-
text/html:html文件
-
image/png:图片
-
application/json: 服务器返回json,如{key1:value1,key2:value2}
-
application/x-www-form-urlencoded, form表单提交数据 【默认的content-type类型】
-
数据格式为:key1=value1&key2=value2
-
multipart/form-data, 表单文件上传提交
-
application/json,json格式提交文件
-
数据格式为:{key1:value1,key2:value2}
-
text/xml, xml格式提交文件
-
-
-
6)URL,统一资源定位符
-
如:http://www.xxx.com:8888/xxxx.jpg
-
协议,http
-
域名,www.xxx.com,就是服务器
-
端口,8888
-
服务器的资源路径, /xxxx.jpg,就是服务器下的资源存放路径
-
-
7)http常用的请求方法:
-
get
-
获取资源,如果要传参【浏览器地址栏传参】,格式为:url?key1=value1&key2=value2
-
-
post
-
提交资源,如果要传参,【请求体中传参】,默认的格式是key1=value1&key2=value2...
-
-
put
-
更新资源
-
-
delete
-
删除资源
-
-
-
8)http常用的状态码
-
1xx
-
100 continue,服务器近收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求
-
-
2xx
-
200 ok,请求成功
-
-
3xx
-
301 Moved Permanently,永久重定向
-
302 Found, 临时重定向
-
-
4xx
-
400 Bad Request,客户端错误的请求,服务器未能理解请求
-
401 Unauthorized,被请求的页面需要用户名和密码
-
403 Forbidden,对被请求的页面禁止访问
-
404 Not Found,页面找不到
-
-
5xx
-
500 Internal Server Error,服务器内部错误
-
502 Bad Gateway, 服务器从上游服务器收到一个无效的响应,网关错误
-
503 Service Unavailable,服务器临时过载或者宕机
-
504 Gateway Timeout, 网关超时
-
505 Http Version Not Supported,服务器不支持请求中所指明的http版本
-
-
-
9)http的认证
-
基本认证
-
basic auth,输入用户名和密码那种形式
-
常规认证
-
digest auth,
-
自定义认证
-
http认证可能使用到的场景:
-
比如postman接口调试的时候可能需要选择是哪种认证
-
3、Http请求的过程
-
当用户在浏览器中输入网址回车之后,网络协议都做了哪些工作?
-
1)首先干活的是客户端【浏览器】应用程序,它要解析出URL中的域名
-
2)根据域名获取对应的ip地址,首先从浏览器的缓存中查看,如下可以查看浏览器中域名对应ip的解析
-
chrome://net-internals/#events
-
chrome://net-export/
-
如果没有,则从本机域名解析文件hosts(/etc/hosts)中查看,还没有则从LDNS(Localdnsserver)、Rootserver域名服务器、国际顶级域名服务商的DNS的层层解析
-
-
3)拿到ip地址后,浏览器就发起与服务器的三次握手
-
4)握手建立后,就可以组装http请求报文,发送报文
-
5)服务器收到请求报文后开始,请求报文解析,生成响应数据,发送响应数据
-
6)浏览器收到响应数据之后,开始渲染页面
-
7)http协议1.1和http2.0【长连接】,断开连接,进行四次挥手
-
-
-
http客户端:
-
浏览器、postman、jmeter、python requests等
-
-
http服务端
-
apache httpd、tomcat、nginx、IIS、BWS(百度)、Tengine(淘宝)
-
-
http的默认端口是80,也可以改成其他端口,https的默认端口为443
4、TCP协议
-
tcp协议是面向连接的、可靠的、基于字节流的传输层通信协议
-
特点:
-
基于连接的:数据传输之前需要建立连接
-
全双工的:双向传输
-
字节流:不限制数据大小,打包成报文段,保证有序接收,重复报文自动丢弃
-
流量缓冲:解决双方处理能力的不匹配
-
可靠的传输服务:保证可达,丢包时通过重发机制来实现可靠性
-
拥塞控制:防止网络出现恶性拥塞
-
-
http是建立在tcp协议之上的
-
tcp协议是可靠的,udp协议是不可靠的。
-
qq、微信这些都是用的tcp
-
飞鸽传书用的udp,还有一些视频类也是用udp
-
5、Https协议
-
https:
-
安全的超文本传输协议,是具有安全性的ssl加密传输协议
-
为浏览器和服务器之间的通讯加密,确保数据传输的安全。
-
-
https协议是由http + ssl协议构建的可进行加密传输,其中ssl用来加密数据包
-
SSL【Secure Socket Layer】安全套接层的网络安全协议。它是在tcp/ip协议上实现的一种安全协议,采用公开密钥技术。
-
http协议的特点
-
1)http协议是明文传输协议
-
https = http + ssl【安全的超文本传输协议】
-
-
2)http协议是无状态的协议
-
-
https的特点
-
请求和响应在发送到网络前,需要进行加密
-
ssl,Secure Sockets Layer,后来改名为tls
-
-
http和https的区别:
-
1)http是明文传输协议,https是加密的传输协议
-
2)https = http + ssl,ssl是用来对数据加密的,比http协议安全
-
3)https协议传输的性能要比http低【传输效率低,响应时间更长】
-
4)https需要CA【Certificat Authority,证书签发机构】机构申请CA认证,证书【国际主流的CA机构有Symantec、GeoTrust、DigiCert、GlobalSign等,需要一定的费用】
-
5)http的端口是80,https的端口为443
-
6、cookie、session、token
-
cookie和session都是http协议状态保持的方案
-
http协议是无状态的,所以就有了cookie和session这些技术
-
cookie和session的区别
-
1)cookie是存储在客户端的,session是存储在服务器的
-
2)cookie容易被篡改,session比cookie更安全
-
3)session过多会对服务器造成压力
-
单个cookie不能超过4k,单个域名不能超过53cookie
-
-
cookie和session的流程
-
1)客户端发送请求,比如登录请求
-
2)服务端收到请求,并校验客户客户端发送过来的数据,并在服务端生成session【session中包含有返回给客户端的数据】
-
3)服务器返回数据,并将cookie数据以响应头部字段set-cookie的形式,返回给客户端
-
4)客户端收到服务器返回的数据,并将set-cookie的值存储在本地。
-
5)客户端再次发送请求,并携带cookie数据,一起发送给服务器
-
6)服务器收到客户端再次发来的请求,并使用服务器端的session来校验客户端携带来的cookie,校验通过后正常返回数据。
-
-
session的弊端:
-
1)session是不是要存储啊,所以session越多,会影响服务器的性能
-
2)session的扩展性不强
-
-
所以就衍生出了一个概念叫token
-
token
-
token是通过算法生成的
-
JWT:json web token,这个是比较流行一点的token
-
头部.载荷.签名
-
-
token的流程
-
1)客户端发送请求,比如登录请求
-
2)服务端收到请求,并校验客户客户端发送过来的数据,通过算法生成token【token中包含有返回给客户端的数据】
-
3)服务器返回数据,并将token数据包含在响应体中,返回给客户端
-
4)客户端收到服务器返回的数据,并将token的值存储在本地。
-
5)客户端再次发送请求,并携带token数据(一般是请求头),一起发送给服务器
-
6)服务器收到客户端再次发来的请求,并使用算法校验token,校验通过后正常返回数据。
-
总的来说,就是token更简单、生成的更好。
-