去某公司三面的时候面试官问了关于请求头和响应头的问题,可能他觉得通信专业对于计算机网络应该都很精通吧……
但是我答得很不好,所以回家之后整理了一下,发现控制台好多东西都是只到表面啊,一往深了问我就
请求头
Connection: keep-alive keep alive表示使一次TCP连接为同一用户的多次请求服务,提高了响应速度。比如图片、js、css、html都在同一台服务器上,当用户访问html时图片、js、css也构成了访问请求,如果使用一次TCP就可以解决很多请求,毫无疑问这对于减少http进程数从而降低内存使用是极好的(甄嬛脸)
Upgrade-Insecure-Requests:1 浏览器告诉服务器,自己支持这种操作,也就是我能读懂你服务器发过来的上面这条信息,并且在以后发请求的时候不用http而用https,相当于在http和https中间起一个过渡作用。
cookies 是服务器发送到浏览器并保存在本地的一小块数据,存储在header中,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上,通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。
响应头
响应头中Cache-Control
客户端第一次向服务器请求数据,返回200状态码,客户端将文件和对应的响应头都换存下来。下一次客户端再请求这个文件时,会先查看上一次返回的响应头中的Cache-Control,比较过期时间与当前的请求时间,若本地资源未过期,则不再请求服务器。
Cache-Control的5个值:
- no-cache:需要先和服务器端协商,询问之前的文件是否更改,若之前的相应中存在ETag,请求时会把这个值发送给服务器端。即不直接使用本地缓存。
- no-store:禁止浏览器缓存。
- public:允许所有浏览器和中间代理服务器缓存
- private:只允许浏览器缓存
- max-age:资源经过xxx秒后失效(类似于http1.0中的expires,但max-age优先级高)
响应头中Last-Modified与请求头中If-Modified-Since
客户端向服务器请求数据,服务器返回文件的同时也会返回这个文件上次更改的时间戳,并通过Last-Modified字段经由响应头发送给客户端。客户端将这个时间存起来。下一次客户端再请求这个文件的时候,会把上次保存起来的时间戳通过If-Modified-Since字段经由请求头发送至服务器。服务器会对比这个时间是否为文件的最后更改时间,如果是,则返回304状态码,通知客户端可以直接从本地加载文件;如果不是,返回最新的资源以及更新后的Last-Modified字段。
响应头中ETag与请求头中If-None-Match
客户端向服务器请求数据,服务器返回文件的同时也会返回这个文件的摘要信息,并通过ETag字段经由响应头发送给客户端。客户端将这个时间存起来。下一次客户端再请求这个文件的时候,会把上次保存起来的摘要信息通过If-None-Match字段经由请求头发送至服务器。服务器会对比这个摘要信息是否为最新的,如果是,则返回304状态码,通知客户端可以直接从本地加载文件;如果不是,返回最新的资源以及更新后的ETag字段。
HTTP 1.0
短连接
只能短连接,每请求一次就建立一次连接。并且不跟踪客户端也不记录过去的请求。
HTTP 1.1
长连接
支持长连接,对一个html文档和其之下的js、css、图片等资源的请求总共只建立一次连接,也只关闭一次连接。每个响应都是按照请求的顺序一次返回,以保证客户端能识别每个响应是针对哪个请求。
增加头
http 1.1中新增host请求头字段,表明一台服务器可以用两个不同主机名表明这是两种服务,host表明对哪个主机名的请求。
新增connection: keep-alive/close,从而实现长连接。
新增身份认证、缓存相关的请求响应头。
HTTP 2.0
多路复用
http 1慢的原因主要有:
- 资源只能一个一个请求,必须收到上一个才能请求下一个
- TCP慢启动时间长
http 2针对此做出了改动,允许并行请求多个资源,只要将资源拆分成更小的帧,每个帧前都标好号,等到达对面时再根据号将其串起来即可。应用层里多加了二进制分帧层,headers封装到headers frame,data封装到data frame中。同时由于TCP链接减少,TCP慢启动的次数也减少了。
首部压缩
http 1的问题:
- headers不压缩直接发送
- 每次都要发很多不频繁改动的headers,浪费
http 2客户端和服务器端共同维护一份静态字典和一份动态字典,都是headers键值对,本次与上一次请求的headers相同的部分不再重新发送,不同的部分添加到动态字典中,发送headers帧的时候只发变动的。
服务器主动推送
http 1的问题:
- 每一个资源都要明确请求
http 2允许服务器端在浏览器请求之前,主动推送资源给浏览器,即一个请求对多个响应。比如浏览器请求html页面,服务器判断浏览器可能会需要logo和css样式表,所以页面连同这些资源一齐响应,加快了响应速度。
HTTPS
https = http + SSL(安全套接字层)
http是是明文传输,https是安全的http,在应用层多加了SSL。
http的端口是80,https的端口是443。
HTTPS主要流程
客户端发起https请求;
服务器端从CA申请一个证书,这个证书其实就是一对公钥和私钥;
服务器发给客户端公钥;
客户端验证公钥的过期时间和证书机构,如果满足条件,则生成一段随机值,用公钥进行加密,发给服务器端;
服务器端用私钥解密出会话密钥(就是那串随机值),再将内容与会话密钥进行对称加密(同一个密钥可以用来加密和解密就叫做对称加密)发给客户端;
客户端用会话密钥解密。
状态码
200 完成
204 也是成功,只是仅有响应头没有传过来资源
301 是永久重定向。搜索引擎抓到新内容同时网址也是新的
302 是暂时重定向。搜索引擎抓到新内容但是网址是旧的
304 是服务器未更新资源,所以浏览器直接使用缓存的资源吧
307 是如果客户端请求方法是get或head,可以直接向重定向后得到的新url发请求,如果不是,则必须让客户端先确认要不要跳转到新url
400 请求有问题,服务器无法识别
401 没有权限却想访问一个受密码保护的页面
403 禁止访问
404 not found
500 服务器代码有bug
503 服务器正忙