osi七层模型
物理层 数据链路层 网络层 传输层 会话层 表示层 应用层
TCP/IP五层模型
物理层 数据链路程 网络层 传输层 应用层
应用层:为用户直接提供各种网络服务,常用协议HTTP、HTTPS、SMTP、POP3、FTP等,确定进程间通信性质满足用户需求
表示层:数据格式化、加密
会话层:建立、管理和维护会话
传输层:端到端通信 tcp、udp,解决进程间的通信
网络层:ip协议 寻址,解决跨网络的主机通信问题
数据链路层:解决相邻主机通信问题
物理层:最终信号的传输 网线等物理设备 透明的传输比特流
HTTP协议
1、应用层协议,请求和响应沟通,通过统一的资源标识符建立连接,传递数据
2、无状态,每一次http请求都是独立的,服务端不知道客户端的状态
3、一次HTTP请求的基本流程:建立TCP连接,客户端向服务端发起一次请求request,而服务器在接收到以后返回给客户端一个响应response。所以我们看到的http请求内容一般就分为请求和响应两部分。
http协议通常承载于tcp协议,有时也承载于tls或ssl协议层上,这个时候就成了https,http默认端口80
请求报文响应报文
要非常清楚请求报文和响应报文的组成部分,要求在写具体案例。
https://www.cnblogs.com/musecho/p/11201179.html
http请求:请求行(请求方法(get/post)+请求地址(url)+http协议)+请求头(浏览器所需头信息key:value)+请求体(post请求带的参数)
http响应:响应行(HTTP协议+状态码+状态消息)+响应头(key:value)+响应体(页面要显示的正文)
http请求组成:
请求行:请求方法+url路径+协议版本
请求报头:host(请求资源的域名,主机号和端口号)+accept(可接收的数据格式)+cookie+Accept-Encoding
请求正文:通常是post方法进行发送的数据
http响应:
状态行:http协议版本号+状态码+状态消息
响应报头:allow(服务器支持哪些方法)+data+set-cookie+content-length(响应正文的长度)+Last-Modified(最后修改的时间)
响应体:服务器回写给客户端的页面正文
状态码
1xx
100 (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。
200 请求成功
301 永久重定向,旧地址的资源已经被永久移除了,搜索引擎在抓取新地址的内容时也将旧地址换成重定向后的地址
302 暂时重定向,旧地址的资源还在,搜索引擎在抓取新地址的内容时会保存旧地址
网址劫持:用户从A做了302重定向到B,因为某种原因,浏览器显示了网址A,内容却是B。
304 请求资源没有修改,访问本地缓存 访问过某网站,资源存在本地,若下次访问,资源没有变过,就访问本地的
403 禁止 服务器拒绝请求
404 请求资源不存在,通常是用户路径写错或者服务器资源已删除 客户端
405 方法禁用 请求中的方法禁用
500 服务器内部错误,通常程序抛异常 服务端
503 服务器目前无法使用 由于超载或停机维护
504 网关超时 服务器作为网关或代理,但是没有及时从上游服务器收到请求
505 HTTP版本不受支持 服务器不支持请求中的http版本
重定向:
URL 重定向,也称为 URL 转发,是一种当实际资源,如单个页面、表单或者整个 Web 应用被迁移到新的 URL 下的时候,保持(原有)链接可用的技术
原理:
在 HTTP 协议中,重定向操作由服务器通过发送特殊的响应(即 redirects)而触发。HTTP 协议的重定向响应的状态码为 3xx 。
浏览器在接收到重定向响应的时候,会采用该响应提供的新的 URL ,并立即进行加载
如果用户请求报500错误,你怎么去定位
500 Server Internal Error
服务器遇到了未知的情况,并且不能继续处理请求。客户端可以显示特定的错误情况,并且可以在几秒种以后重新尝试这个请求。
如果这个情况是临时的,服务器应当在Retry-After头域标志客户端过多少秒钟之后重新尝试这个请求。
如果一个请求,返回的状态码是 200,但是没有内容,可能发生了什么?
请求头缺失或错误
参数 length 不符
HTTP版本区别
HTTP 0.9 仅支持get请求,不支持请求头
HTTP 1.0 一次请求建立一次tcp连接,请求完就断开 支持get post head
HTTP 1.1 长连接,一次tcp连接可以多次请求 增加了put、delete、patch
HTTP2.0 多路复用(一次tcp连接可以处理多个请求),服务器主动推送(相关资源一个请求全部推送),解析基于二进制,错误更少,http1是基于文本
Get和Post
基于 HTTP 协议:都是请求返回数据,Get 将请求体放在头上,只发一次请求,Post 将请求体放在内部,需要发送两次请求
GET 在浏览器回退时是无害的,而 POST 会再次提交请求。
GET 请求会被浏览器主动 cache,而 POST 不会,除非手动设置。
GET 请求只能进行 URL 编码,而 POST 支持多种编码方式。
GET 请求在 URL 中传送的参数是有长度限制的,而 POST 么有。
对参数的数据类型,GET 只接受 ASCII 字符,而 POST 没有限制。
GET 比 POST 更不安全,因为参数直接暴露在 URL 上,所以不能用来传递敏感信息。
HTTP和HTTPS区别
描述HTTPS和HTTP的区别、http和https的区别
从端口的区别,以及HTTPS是在SSL的基础上以及加密等方面说明
http和https的区别、https中的ca证书在客户端还是服务端,ca证书的加密算法
区别:
https协议需要到ca申请证书,一般免费证书很少,需要交费
http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议
http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443
http的连接很简单,无状态
https协议,ssl+http协议构建的可进行加密传输、身份认证的网络协议,比http安全
https协议:
对称加密:同样的秘钥 ,加密算法:RC4,AES,3DES,Camellia等 解密速度快,适合大数据,但是秘钥的安全管理困难
加密过程:明文+加密算法+秘钥 解密过程:密文+解密算法+秘钥
非对称加密:公钥和秘钥 加密解密花费时间长,速度慢,只适合对少量数据进行加密
加密算法:RSA、DSA、ECC
加密过程:明文+加密算法+公钥 解密:密文+解密算法+私钥
加密过程:明文+加密算法+私钥 解密:密文+解密算法+公钥
哈希算法:将任意长度的信息转换为较短的固定长度的值,通常其长度比信息小很多 且算法不可逆
MD5,SHA-1,SHA-2.SHA-256
数字签名:签名就是在信息的后面再加上一段内容(信息经过hash后的值),可以证明信息没有被修改过,hash值一般都会在 加密后(也就是签名)再和信息一起发送,以保证这个hash值不被修改
https就是通过非对称加密传送秘钥,对称加密传送数据
https的请求:
1、client向server发送https请求,连接到服务器的443端口
2、server有一个密钥对,server保存着私钥,公钥可以发给任何人,server将自己的公钥发给client
3、client收到server发送的证书(包含公钥),检查证书的合法性,若公钥合格,就生成一个随机值,作为client的秘钥,然后通过公钥进行非对称加密,秘钥就变成了密文
4、client向server发送第二个https请求,发送密文
5、server接收到后用私钥进行非对称解密,然后解密后的client秘钥对数据进行对称加密,变成密文,将密文发送给client
6、client收到密文,用client秘钥进行解密,得到服务器发送的数据
ssl证书:
ssl证书遵循ssl协议,ssl协议位于tcp/ip协议和各种应用层协议之间,ssl加密采用了RC4、MD5、RSA等加密算法
证书颁发机构CA+证书的有效期+公钥+证书所有者+签名
校验过程:
1、浏览器读取证书中的证书所有者、有效期等信息进行校验
2、浏览器开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否为合法机构颁发
3、如果找不到,浏览器就会报错,说明服务器发来的证书是不可信任的
4、如果找到,那么浏览器就会从操作系统中取出颁发者CA的公钥,然后对服务器发来的证书里面的签名进行解密
5、浏览器使用相同的hash算法计算出服务器发来的证书的hash值,将这个计算的hash值与证书中的签名做对比
6、对比结果一致,则证明服务器发来的证书合法,没有被冒充
7、此时浏览器就可以读取证书中的公钥,用于后续加密了
Cookie和Session
1、存储的位置,利弊 安全性
cookie
定义:实际上是一小段文本信息
原理:客户端请求服务器,若服务器需要记录该用户状态,使用response向客户端浏览器返回一个cookie,客户端浏览器就会将cookie保存起来
当浏览器再次请求该网站时,浏览器把请求的网址连同该cookie一同提交给服务器,服务器检查该cookie,以此来辨认用户状态,服务器还可以根据需要修改cookie的内容
特性:不可跨域名性 浏览器保证google只会操作google的cookie而不会操作baidu的cookie
session
原理:客户端请求服务器,服务器保存客户端的信息在服务器上,再次访问时从session中查找该客户的状态
新开的浏览器窗口就会生成新的session,子窗口除外,子窗口会共用父窗口的session
联系和区别:
session虽然保存在服务器,对客户端透明,但是正常运行仍需要客户端浏览器的支持。
因为session需要cookie作为识别标志,session不能依据http连接判断是否是同一用户,所以服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,值是seesion的id,session依据该cookie来识别是否为同一用户。
url地址重写:对客户端不支持cookie的解决方案,原理是将seesion的id信息重写到url地址中,服务器能够解析重写后的url获取session的id,这样即使客户端不支持cookie,也可以使用session来记录用户状态。
cookie 存储在客户端浏览器 但是容易被修改 安全性差 且浏览器也会限制cookie的大小和数量
session 存储在服务器端 过多的时候会消耗服务器资源
cookie的生命周期:预先设置的生存周期或永久保存与本地的文件
session的生命周期:浏览器关闭后session就消失了
运用:用户的直接登录
TCP/UDP
传输层协议
区别
TCP:面向连接,可靠的,速度慢,效率低
UDP:无连接、不可靠、速度快、效率高
tcp传输可靠性
从四个方面进行回答,ACK确认机制、超时重传、滑动窗口以及流量控制,深入的话要求详细讲出流量控制的机制
1、校验和
计算方式:在数据传输的过程中,将发送的数据段都当做一个16位的整数,最后取反,得到校验和
发送方:在发送数据之前计算校验和,并进行校验和的填充
接收方:收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方的进行比对
若校验不一致,数据一定传输有误,若校验一致,数据不一定传输成功
确认应答和序列号
每次 传输时会发送一个序列号(将每个tcp报文都排序进行了编号),接收方收到后会发送一个确认应答以及下次的序列号,表示从哪里开始发。
序列号的作用还有去除重复序列号的数据,根据接收到的序列号重新排序的功能,这也是tcp可靠传输的保障之
超时重传
发送方在发送数据后迟迟没有等到接收方的应答,就会触发重传的请求,假如是接收方之前没有接收到数据,重传后就能接收到从而做出应答,假如是接收方之前已经发送过数据,但是丢失了,接收方再次接收到重复序列号的报文时,会将这个报文丢弃,重新发送一个应答
拥塞控制:
防止发送方发送得太快,使网络来不及处理,从而导致网络拥塞
因为担心一开始就发送大量的数据,导致占满了缓存区出现丢包的现象超时,采用慢启动的方式,从1开始呈指数增长,达到一个阈值之后,呈线性增长,当达到最大值,出现网络拥塞的情况,窗口马上降为1,阈值变为丢包前置值的一半,又采用指数和线性增长
4个核心算法:慢开始、拥塞避免、快速重传、快速回复
拥塞窗口:cwnd 慢开始门限:ssthresh
慢开始算法:cwnd<ssthresh 一开始不要发送大量数据,从1开始,指数增长
拥塞避免算法:cwnd>ssthresh 线型增加
乘法减小:不论慢开始阶段还是拥塞避免阶段,只要出现超时,就把慢开始门限减半,设置为当前拥塞窗口的一半,执行慢开始算法
加法增大:执行拥塞避免算法后 拥塞窗口缓慢增大,线型增加
流量控制:
防止发送方发送得太快,耗尽接收方的资源,从而使接收方来不及处理
数据发送得过快,接收方的缓冲区被占满了,再继续发送的话会造成丢包的现象,这个时候接收方在应答的时候带上当前窗口的值,当当前窗口的值为0的时候,发送方暂停发送,并不时的发送窗口大小请求,等到有空间的时候再继续进行发送
实现:滑动窗口
tcp是以一个段为单位进行数据传输,每发送一个段,就会等待对端主机的针对这个段的确认应答信号ACK
传输缺点:数据包的往返时间越长,通信性能越低
为了解决这个问题,引入了窗口的概念,即使在往返时间比较长的情况下,也能控制网络性能的下降确认应答包不再以段为单位进行确认了,而是以更大的单位进行确认,转发时间将会被大幅度的缩短。
也就是说,发送端主机在发送了一个段之后,没必要一直等待对端主机的确认应答信号,而是继续发送窗口大小。
指的就是无需等待接收端主机的确认应答信号而可以持续发送的数据的最大值,或者说段的最大值
滑动窗口控制的实现,使用了大量的缓冲区,通过对多个段的数据同时进行确认应答来实现高效传输
流量控制和拥塞控制的区别:
相同点:现象都是丢包、实现机制都是让发送方发得慢一点,发得少一点
不同点:
丢包位置不同:流量控制丢包位置是在接收端上 拥塞控制丢包位置是在路由器上
流量控制对象是接收方,怕发送方发得太快,接收方来不及处理
拥塞控制对象是网络,怕发送方发得太快,造成网络拥塞,是的网络来不及处理
流量控制发生在发送端和接收端之间,点到点的控制
拥塞控制通常表示的是一个全局性的过程,会涉及到网络中所有的主机、所有的路由器和降低网络传输性能的所有因素
三次握手和四次挥手
面向连接,保证是在连接建立的过程中发送的请求
序号:seq序号,用来标识从TCP源端向目的端发送的字节流,发送方发送数据时对此进行标记
确认号:Ack序号,只有ACK标志位为1的时候,确认序号字段才有效,Ack=seq+1
标志位:ACK(确认序号有效)、SYN(发起一个连接)、FIN(释放一个连接)等
三次握手的过程:
1、c发送一个SYN=1 seq=x给s,说我想建立连接
2、s收到后,发送一个SYN=1 ACK=1,seq=y,ack=x+1给c,说我同意你的连接
3、c收到后,发送一个ACK=1 seq=x+1 ack=y+1,说我知道你收到我发送的数据了
四次挥手:
1、c发送一个FIN=1,seq=x给s,说我想关闭连接
2、s收到后应答一个ACK=1 seq=y ack=x+1 给c,说我知道了
3、进入closed-wait阶段,s再发送一个FIN=1,ACK=1,seq=z ack=x+1(收到客户端报文的基础上)给c,说我要关闭连接
4、c收到后进入到TIME-WAIT阶段并发送一个 ACK=1 seq=x+1 ack=z+1 给s,说我知道了,
tcp中二次握手为什么ack和syn包要一起发送,不分两次发送
因为会造成资源的浪费,连接的时候不需要准备,直接就可以连接
三次握手时,c发送一个syn序列号给s,s收到后,应答一个ack,同时捎带一个syn序列号,这个就是捎带应答
为啥是三次握手而不是两次
第三次握手是客户端向服务器端发送数据,这个数据就是告诉服务器,客户端有没有收到服务器第二次握手时传过去的数据,若发送的这个数据是收到了,接受到服务器正常建立tcp连接,否则建立tcp连接失败,服务器关闭连接端口,由此减少服务器开销和接收到失效请求发生的错误
为啥需要四次挥手
tcp三次握手是因为服务器应答的时候是把SYN和ACK一起发送给了客户端,因为建立连接时,不需要任何准备
四次挥手是因为服务器收到客户端释放连接的请求,但是服务端的数据不一定处理完了,所以服务器先返回ack确认收到报文,经过closed-wait阶段准备好释放连接后,才能返回fin释放连接报文
为啥需要time-wait
客户端在发出最后的ack确认报文的时候,并不能确认服务端能够收到该段报文,所以客户端在发送完ack确认报文之后,会设置一个2MSL的计时器,(MSL指一段tcp报文在传输过程中的最大生命周期)
如果客户端在2MSL内,再次收到了来自服务端发送的FIN报文,说明服务器端没有接受到客户端发出的ACK报文,所以重发一次,计数器重置
若2MSL内没有收到服务端的FIN报文,说明服务器正常接收到了,客户端可以进入CLOSED阶段,完成四次挥手
2、拥塞控制算法:慢启动、拥塞控制、快速重传和恢复
快速重传
1、发送端发送的数据丢包
发送报文请求后,连续收到三次重复ack应答,就重传那段报文,发送后收到应答,从收到的报文开始发,而不是2000后的都要重发,已经放进了缓冲区,滑动窗口继续移动,继续发送
超时重传:发出请求后,长时间没有收到一个ack应答,触发超时重传
快速重传:发出请求后,收到3次重复的ack请求,触发快速重传
2、接收端响应的ack丢失
连续3条ack响应都丢包,但是第四条ack响应到达,此时并不会影响发送端的发送,因为ack响应的是下一条数据包是4001,这意味着接收端已接收到前面的所有报文,所以接收端ack响应丢包其实对发送端发送的影响并不是那么大
快速恢复
发送方连续接收到3个确认时,执行乘法减小算法,把慢启动的阈值减半,但是并不执行慢启动算法,而是把窗口设置成阈值的一半,执行拥塞避免算法,使拥塞窗口缓慢增大,这就是快速恢复算法
3、延迟应答
若接收端初始缓冲区为1M,发送端发送500k数据,接收端收到后,立即ack应答,此时窗口大小是500k,假如刚才处理500k的速度很快,在ack应答还未到的时候已经处理完了,实际窗口大小变为了1M,但是响应的是500k,相当于一种浪费,所以增加了延迟应答
规则:
数量限制:每隔N个包就应答一次
时间限制:超过最大延迟时间就应答一次
距离的数量及时间限制与操作系统有关,一般情况数量取2,最大延迟时间取200ms
url连招
刷新网页的时候经历了什么/我输入网址到页面呈现的全部过程吗?
客户端获取URL->DNS解析->tcp连接->发送HTTP请求->服务器处理请求->服务器响应请求->浏览器解析渲染页面->tcp断开连接
输入url后,浏览器会先查看浏览器缓存,若缓存中有,直接在屏幕中显示页面内容,若没有,进行dns解析
dns查询过程
1、查找域名对应的IP地址
这一步会依次查找浏览器缓存,系统缓存,路由器缓存,ISP DNS缓存,根域名服务器。
2、向IP对应的服务器发送HTTP请求
3、服务器响应请求,发回网页内容
4、浏览器解析网页内容
由于网页可能有重定向,或者嵌入了图片,AJAX,其它子网页等等,这4个步骤可能反复进行多次才能将最终页面展示给用户