互联网上最有效的沟通方式是异步沟通,不要期待作者马上回复,也不要心烦意乱着急地等待。出去看看天,数数云朵,你会逐步明白什么是云淡风轻。
根据计划,第一章节介绍【软件测试理论】部分,目前已输出十一篇文章:
下面开始我的第十二篇文章,分享【HTTP协议常见面试题三】(接着上一篇继续)。
十、https:
- 使用传输层安全性(TLS)或安全套接字层(SSL)对通信协议进行加密。(也就是 HTTP + SSL(TLS) = HTTPS)
- TLS 是使用 对称加密 和 非对称加密 的混合加密方式来实现机密性。
- 在通信刚开始的时候使用非对称算法,比如 RSA、ECDHE ,首先解决密钥交换的问题。然后用随机数产生对称算法使用的会话密钥(session key),再用公钥加密。对方拿到密文后用私钥解密,取出会话密钥。这样,双方就实现了对称密钥的安全交换。
- 使用数字证书验证发送者是客户端还是中间人攻击。
十一、TLS
- 客户端请求服务端建立SSL链接,服务端并向客户端发送一个随机数 randomC 和 CA 机构颁发的证书。
- 客户端对证书进行验证,验证通过后,生成一个随机数 randomS ,用公钥对 randomS 加密 ,同时用 randomS 生成一段签名,发送给服务端。
- 服务端接收到后,用私钥对秘文解密,用解密后的 key 生成签名,并与客户端传来的签名进行比较,检验通过后,然后生成一个随机数 randomP ,并用私钥加密,还有随机数生成的 hash 值,一并发给客户端。
- 客户端用公钥解密,并校验 hash 值通过后,两端利用 randomC randomS randomP 通过一定的算法生成 session key,后续的报文将通过 session key 对称加密进行传输。
十二、CA 证书
- CA证书,是由 CA 机构颁发的一个凭证,里面关键的信息有,签名算法、签名hash算法、颁发者、有效期、公钥、指纹,这个两个算法就表示对称阶段和非对称阶段采用的算法,公钥就是服务端的公钥,在申请的时候,企业需要上传公钥给CA机构,重点是这个指纹,这个指纹是由 CA 机构通过私钥对一段签名加密生成的。
- 在浏览器和个人PC中,都预装了顶级的 CA 机构证书和公钥,所以浏览器获取到证书后,通过内置的公钥对指纹进行解密得到签名,然后浏览器也根据同样的规则生成一段签名,两段签名进行比较,验证通过,那么这个证书中公钥就是可信的。
十三、http/http2
- http1.1以文本的方式,http2是一个二进制协议,使用二进制帧传输,增加了数据传输的效率。
- http2可以在一个TCP链接中并发请求多个HTTP请求,移除了HTTP/1.1中的串行请求。
- HTTP2采用HPACK压缩算法压缩头部,减小了传输的体积。
- HTTP2支持服务端推送。
十四、JWT
- JSON Web Token(简称 JWT)是目前最流行的跨域认证解决方案。
- JWT 由三部分组成:Header,Payload,Signature 三个部分组成,并且最后由.拼接而成。
- Header 部分是一个 JSON 对象,描述 JWT 的元数据,通常是下面的样子,最后将 JSON 对象使用 Base64URL 算法转成字符串。 {"alg": "HS256", // 表示签名的算法,默认是 HMAC SHA256(写成 HS256)"typ": "JWT" // 表示这个令牌(token)的类型 }
- Payload 中由 Registered Claim 以及需要通信的数据组成。它也是 JSON 格式,另外这些数据字段也叫 Claim。JWT 规定了7个官方字段如下,除了官方的字段外你也可以自定义一些字段,最后将 JSON 对象使用 Base64URL 算法转成字符串。iss (issuer):签发人exp (expiration time):过期时间sub (subject):主题aud (audience):受众nbf (Not Before):生效时间iat (Issued At):签发时间 jwt 创建时间jti (JWT ID):编号
- Signature 部分是对前两部分的签名,防止数据篡改。首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。 // 由 HMACSHA256 算法进行签名,secret 不能外泄const sign = HMACSHA256(base64.encode(header) + '.' + base64.encode(payload), secret)
// jwt 由三部分拼接而成const jwt = base64.encode(header) + '.' + base64.encode(payload) + '.' + sign - 一旦发布,在令牌过期之前是不能被取消的。
十五、TCP/IP四层模型
- 数据链路层:用来处理连接网络的硬件部分。
- 网络层:用来处理在网络上流动的数据包。
- 传输层:对上层应用层提供处于网络连接中的两台计算机之间的数据传输,有两个不同性质的协议TCP/UDP。
- 应用层:决定了向用户提供应用服务时通信的活动,FTP/DNS/HTTP存在于该层。
十六、一个 tcp 连接能发几个 http 请求
- HTTP 1.0 版本协议,一般情况下,不支持长连接,因此在每次请求发送完毕之后,TCP 连接即会断开,因此一个 TCP 发送一个 HTTP 请求。
- HTTP 1.1 版本协议,默认连接都是长连接(想断开则指定 Connection 为 close),因此只要 TCP 连接不断开,便可以一直发送 HTTP 请求,持续不断,没有上限。
- HTTP 2.0 版本协议,支持多路复用,一个 TCP 连接是可以并发多个 HTTP 请求的,同样也是支持长连接,因此只要不断开 TCP 的连接,HTTP 请求数也是可以没有上限地持续发送。
十七、gzip默认使用http 1.1
- Nginx 对于满足条件(请求头中有 Accept-Encoding: gzip,响应内容的 Content-Type 存在于 gzip_types 列表)的请求会采用即时压缩(On-The-Fly Compression),整个压缩过程在内存中流式完成。也就是说,Nginx 不会等文件 GZip 完成再返回响应,而是边压缩边响应,这样可以显著提高 TTFB(Time To First Byte,首字节时间,WEB 性能优化重要指标)。这样唯一的问题是,Nginx 开始返回响应时,它无法知道将要传输的文件最终有多大,也就是无法给出 Content-Length 这个响应头部。
- HTTP/1.1 默认支持 TCP 持久连接(Persistent Connection),HTTP/1.0 也可以通过显式指定 Connection: keep-alive 来启用持久连接。HTTP 运行在 TCP 连接之上,自然也有着跟 TCP 一样的三次握手、慢启动等特性,要想提高 HTTP 性能,启用持久连接就显得尤为重要。
- 对于 TCP 持久连接上的 HTTP 报文,客户端需要一种机制来准确判断结束位置。而在 HTTP/1.0 中,这种机制只有 Content-Length。
- HTTP/1.1 新增的 Transfer-Encoding: chunked 所对应的分块传输机制可以完美解决这类问题。
以上原文来自我的公众号【不只是测试】,扫描加关注哦O(∩_∩)O~