<dl id="opymh"></dl>

<div id="opymh"></div>
      <div id="opymh"><tr id="opymh"></tr></div>

        <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

        <em id="opymh"></em>

        <em id="opymh"><ol id="opymh"></ol></em>

              频道栏目
              首页 > 程序开发 > web前端 > HTML/CSS > 正文
              一文讲透前端开发所需网络知识
              2019-01-30 15:23:53           
              收藏   我要投稿

              UDP

              面向报文

              UDP 是一个面向报文£¨报文可以理解为一段段的数据£©的协议¡£意思就是 UDP 只是报文的搬运工£¬不会对报文进行任何拆分和拼接操作¡£

              具体来说

              在发送端£¬应用层将数据传递给传输层的 UDP 协议£¬UDP 只会给数据增加一个 UDP 头标识下是 UDP 协议£¬然后就传递给网络层了 在接收端£¬网络层将数据传递给传输层£¬UDP 只去除 IP 报文头就传递给应用层£¬不会任何拼接操作

              不可靠性

              UDP 是无连接的£¬也就是说通信不需要建立和断开连接¡£ UDP 也是不可靠的¡£协议收到什么数据就传递什么数据£¬并且也不会备份数据£¬对方能不能收到是不关心的 UDP 没有拥塞控制£¬一直会以恒定的速度发送数据¡£即使网络条件不好£¬也不会对发送速率进行调整¡£这样实现的弊端就是在网络条件不好的情况下可能会导致丢包£¬但是优点也很明显£¬在某些实时性要求高的场景£¨比如电话会议£©就需要使用 UDP 而不是 TCP¡£

              高效

              因为 UDP 没有 TCP 那么复杂£¬需要保证数据不丢失且?#34892;?#21040;达¡£所以 UDP 的头部开销小£¬只有八字节£¬相比 TCP 的至少二十字节要少得多£¬在传输数据报文时是很高效的¡£

              \vcq9o6zSsr7NysfLtSBVRFAgzOG5qcHLtaWypaOstuCypaOsueOypbXEuabE3KGjPC9wPg0KPGgxPlRDUDwvaDE+DQo8aDI+zbeyvzwvaDI+DQo8cD5UQ1Agzbeyv7HIIFVEUCDNt7K/uLTU07XEtuA8L3A+DQo8cD48aW1nIGFsdD0="" data-="" src="/img/remote/1460000018038495" title="\" />

              对于 TCP 头部来说£¬以下几个字段是很重要的

              Sequence number£¬这个序号保证了 TCP 传输的报文都是?#34892;?#30340;£¬对端可以通过序号顺序的拼接报文 Acknowledgement Number£¬这个序号表示数据接收端期望接收的下一个字节的编号是多少£¬同时也表示上一个序号的数据已经收到 Window Size£¬窗口大小£¬表示还能接收多少字节的数据£¬用于流?#38752;?#21046;

              标识符

              URG=1£º该字段为一表示本数据报的数据部分包含紧急信息£¬是一个高优先级数据报文£¬此时紧急指针?#34892;§¡?#32039;急数据一定位于当前数据包数据部分的最前面£¬紧急指针标明了紧急数据的尾部¡£ ACK=1£º该字段为一表示确认号字段?#34892;§¡£´送⣬TCP 还规定在连接建立后传送的所有报文段都必须把 ACK 置为一¡£ PSH=1£º该字段为一表示接收端应该立即将数据 push 给应用层£¬而不是等到缓冲区满后再提交¡£ RST=1£º该字段为一表示当前 TCP 连接出现?#29616;?#38382;题£¬可能需要重新建立 TCP 连接£¬也可以用于拒绝非法的报文段和拒绝连接请求¡£ SYN=1£º当SYN=1£¬ACK=0时£¬表示当前报文段是一个连接请求报文¡£当SYN=1£¬ACK=1时£¬表示当前报文段是一个同意建立连接的应答报文¡£ FIN=1£º该字段为一表示此报文段是一个?#22836;?#36830;接的请求报文¡£

              状态机

              HTTP 是无连接的£¬所以作为下层的 TCP 协议也是无连接的£¬虽然?#27492;?TCP 将两端连接了起来£¬但是其实只是两端共同维护了一个状态

              TCP 的状态机是很复杂的£¬并且与建立断开连接时的握手息息相关£¬接下来就来详?#35813;?#36848;下两种握手¡£

              在这之前需要了解一个重要的性能指标 RTT¡£该指标表示发送端发送数据到接收到对端数据所需的往返时间¡£

              建立连接三次握手

              在 TCP 协议中£¬主动发起请求的一端为客户端£¬被动连接的一端称为服务端¡£不管是客户端还是服务端£¬TCP 连接建立完后都能发送和接收数据£¬所以 TCP 也是一个全双工的协议¡£

              起初£¬两端都为 CLOSED 状态¡£在通信开始前£¬双方都会创建 TCB¡£ 服务器创建完 TCB 后遍进入 LISTEN 状态£¬此时开始等待客户端发送数据¡£

              第一次握手

              客户端向服务端发送连接请求报文段¡£该报文段中包含自身的数据通讯初始序号¡£请求发送后£¬客户端便进入 SYN-SENT 状态£¬x 表示客户端的数据通信初始序号¡£

              第二次握手

              服务端收到连接请求报文段后£¬如果同意连接£¬则会发送一个应答£¬该应答中?#19981;?#21253;含自身的数据通讯初始序号£¬发送完成后便进入 SYN-RECEIVED 状态¡£

              第三次握授喎?/kf/yidong/wp/" target="_blank" class="keylink">WPC9zdHJvbmc+PC9wPg0KPHA+tbG/zbuntsvK1bW9way9082s0uK1xNOmtPC686Osu7nSqs/yt/7O8bbLt6LLzdK7uPbIt8jPsajOxKGjv827p7bLt6LN6tXiuPaxqM7Ets6687HjvfjI60VTVEFCTElTSEVEINe0zKyjrLf+zvG2y8rVtb3V4rj206a08Lrz0rK9+MjrIEVTVEFCTElTSEVEINe0zKyjrLTLyrHBrL3TvajBorPJuaahozwvcD4NCjxwPlBTo7q12sj9tM7O1crWv8nS1LD8uqzK/b7do6zNqLn9IFRDUCC/7MvZtPK/qqOoVEZPo6m8vMr1oaPG5Mq11rvSqsnmvLC1vc7Vyta1xNCt0umjrLa8v8nS1Mq508PA4MvGIFRGTyC1xLe9yr2jrL/Nu6e2y7rNt/7O8bbLtOa0os/gzawgY29va2llo6zPwrTOztXK1sqxt6Kz9iBjb29raWUgtO+1vbz1ydkgUlRUILXExL+1xKGjPC9wPg0KPHA+PHN0cm9uZz7E48rHt/HT0NLJu/PD98P3wb20zs7Vyta+zb/J0tS9qMGixvDBrL3To6zOqsqyw7S7udDo0qq12sj9tM7TprTwo788L3N0cm9uZz48L3A+DQo8cD7S8s6q1eLKx86qwcu3wNa5yqfQp7XEway908frx/OxqM7Ets6xu7f+zvG2y73TytWjrLTTtviy+sn6tO3O86GjPC9wPg0KPHA+v8nS1M/rz/PI58/Cs6G+sKGjv827p7bLt6LLzcHL0ru49sGsvdPH68fzIEGjrLWrysfS8s6qzfjC59St0vLU7LPJwcuzrMqxo6zV4sqxIFRDUCC74cb0tq+zrMqx1ti0q7XEu/rWxtTZtM63osvN0ru49sGsvdPH68fzIEKho7TLyrHH68fzy7PA+7W9tO+3/s7xtsujrLf+zvG2y9OmtPDN6r7NvajBosHLx+vH86GjyOe5+8GsvdPH68fzIEEg1NrBvbbLudix1brz1tXT2rXWtO/By7f+zvG2y6OsxMfDtNXiyrG3/s7xtsu74cjPzqq/zbuntsvT1tDo0qq9qMGiIFRDUCDBrL3To6y007b406a08MHLuMPH68fzsqK9+MjrIEVTVEFCTElTSEVEINe0zKyho7TLyrG/zbuntsvG5Mq1yscgQ0xPU0VEINe0zKyjrMTHw7S+zbvhtbzWwrf+zvG2y9K71rG1yLT9o6zU7LPJ18rUtLXEwMu30aGjPC9wPg0KPHA+UFOjutTavajBosGsvdPW0KOsyM7S4tK7tsu19M/fo6xUQ1Agtry74dbYt6IgU1lOILD8o6zSu7Dju+HW2MrUzuW0zqOs1Nq9qMGiway909bQv8nE3Lvh0/a1vSBTWU4gRkxPT0QguaW796Gj0/a1vdXi1tbH6b/2xOO/ydLU0aHU8bX3tc3W2MrUtM7K/bvy1d+4ybTg1Nqyu8TctKbA7bXEx+m/9s/Cvty++Mfrx/OhozwvcD4NCjxoMz62z7+qwbS908vEtM7O1crWPC9oMz4NCjxwPjxpbWcgYWx0PQ=="" data-="" src="/img/remote/1460000018038498" title="\" />

              TCP 是全双工的£¬在断开连接时两端都需要发送 FIN 和 ACK¡£

              第一次握手

              若客户端 A 认为数据发送完成£¬则它需要向服务端 B 发送连接?#22836;?#35831;求¡£

              第二次握手

              B 收到连接?#22836;?#35831;求后£¬会告诉应用层要?#22836;?TCP 链接¡£然后会发送 ACK 包£¬并进入 CLOSE_WAIT 状态£¬表示 A 到 B 的连接已经?#22836;Å£?#19981;接收 A 发的数据了¡£但是因为 TCP 连接时双向的£¬所以 B 仍旧可以发送数据给 A¡£

              第三次握手

              B 如果此时还有没发完的数据会继续发送£¬完毕后会向 A 发送连接?#22836;?#35831;求£¬然后 B 便进入 LAST-ACK 状态¡£

              PS?#21644;?#36807;延迟确认的技术£¨通常有时间限制£¬否则对方会误认为需要重传£©£¬可以将第二次和第三次握手合并£¬延迟 ACK 包的发送¡£

              第四次握手

              A 收到?#22836;?#35831;求后£¬向 B 发送确认应答£¬此时 A 进入 TIME-WAIT 状态¡£该状态会?#20013;?2MSL£¨最大段生存期£¬指报文段在网络中生存的时间£¬超时会被抛弃£© 时间£¬若该时间?#25991;?#27809;有 B 的重发请求的话£¬就进入 CLOSED 状态¡£当 B 收到确认应答后£¬也便进入 CLOSED 状态¡£

              为什么 A 要进入 TIME-WAIT 状态£¬等待 2MSL 时间后才进入 CLOSED 状态£¿

              为了保证 B 能收到 A 的确认应答¡£若 A 发完确认应答后直接进入 CLOSED 状态£¬如果确认应答因为网络问题一直没有到达£¬那么会造成 B 不能正常关闭¡£

              ARQ 协议

              ARQ 协议也就是超时重传机制¡£通过确认和超时机制保证了数据的正确送达£¬ARQ 协议包含停止等待 ARQ 和连续 ARQ

              停止等待 ARQ

              正常传输过程

              只要 A 向 B 发送一段报文£¬都要停止发送并启动一个定时器£¬等待对端回应£¬在定时器时间内接收到对端应答就取消定时器并发送下一段报文¡£

              报文丢失或出错

              在报文传输的过程中可能会出现丢包¡£这时候超过定时器设定的时间就会再次发?#25237;?#21253;的数据直到对端响应£¬所以需要?#30475;?#37117;备份发送的数据¡£

              即使报文正常的传输到对端£¬也可能出现在传输过程中报文出错的问题¡£这时候对端会抛弃该报文并等待 A 端重传¡£

              PS£º一般定时器设定的时间都会大于一个 RTT 的平均时间¡£

              ACK 超时或丢失

              对端传输的应答也可能出现丢失或超时的情况¡£那么超过定时器时间 A 端照样会重传报文¡£这时候 B 端收到相同序号的报文会丢弃该报文并重传应答£¬直到 A 端发送下一个序号的报文¡£

              在超时的情况下也可能出现应答很迟到达£¬这时 A 端会判断该序号是否已经接收过£¬如果接收过只需要丢弃应答即可¡£

              这个协议的缺点就是传输效率?#20572;?#22312;良好的网络环境下?#30475;?#21457;送报文都得等待对端的 ACK ¡£

              连续 ARQ

              在连续 ARQ 中£¬发送端拥有一个发送窗口£¬可以在没有收?#25509;?#31572;的情况下?#20013;?#21457;送窗口内的数据£¬这样相比停止等待 ARQ 协议来说减少?#35828;?#24453;时间£¬提高了效率¡£

              累计确认

              连续 ARQ 中£¬接收端会?#20013;?#19981;断收到报文¡£如果和停止等待 ARQ 中接收一个报文就发送一个应答一样£¬就太浪费资源了¡£通过累计确认£¬可以在收到多个报文以后统一回复一个应答报文¡£报文中的 ACK 可以用来告诉发送端这个序号之前的数据已经全部接收到了£¬下次请发送这个序号 + 1的数据¡£

              但是累计确认也有一个弊端¡£在连续接收报文时£¬可能会遇到接收到序号 5 的报文后£¬并未接到序号 6 的报文£¬然而序号 7 以后的报文已经接收¡£遇到这种情况时£¬ACK 只能回复 6£¬这样会造成发送端重复发送数据£¬这种情况下可以通过 Sack 来解决£¬这个会在下文说到¡£

              滑动窗口

              在上面小节中讲到了发送窗口¡£在 TCP 中£¬两端都维护着窗口£º分别为发送端窗口和接收端窗口¡£

              发送端窗口包含已发送但未收?#25509;?#31572;的数据和可以发送但是未发送的数据¡£

              发送端窗口是由接收窗口剩余大小决定的¡£接收方会把当前接收窗口的剩余大小写入应答报文£¬发送端收?#25509;?#31572;后根据该值和当前网络拥塞情况设置发送窗口的大小£¬所以发送窗口的大小是不断变化的¡£

              当发送端接收?#25509;?#31572;报文后£¬会随之将窗口进行滑动

              滑动窗口实现了流?#38752;?#21046;¡£接收方通过报文告知发送方还可以发?#25237;?#23569;数据£¬从而保证接收方能够来得及接收数据¡£

              Zero 窗口

              在发送报文的过程中£¬可能会遇到对端出现零窗口的情况¡£在该情况下£¬发送端会停止发送数据£¬并启动 persistent timer ¡£该定时器会定时发送请求给对端£¬让对端告知窗口大小¡£在重试次数超过一定次数后£¬可能会中断 TCP 链接¡£

              拥塞处理

              拥塞处理和流?#38752;?#21046;不同£¬后者是作用于接收方£¬保证接收方来得及接受数据¡£而前者是作用于网络£¬防止过多的数据拥塞网络£¬避免出现网络负载过大的情况¡£

              拥塞处理包括了四个算法£¬分别为£º慢开始£¬拥塞避免£¬快速重传£¬快速恢复¡£

              慢开始算法

              慢开始算法£¬顾名思义£¬就是在传输开始时将发送窗口慢慢指数级扩大£¬从而避免一开始就传输大量数据导致网络拥塞¡£

              慢开始算法步骤具体如下

              连接初始设置拥塞窗口£¨Congestion Window£© 为 1 MSS£¨一个分段的最大数据量£© 每过一个 RTT 就将窗口大小乘二 指数?#23545;?#38271;肯定不能没有限制的£¬所以有一个阈值限制£¬当窗口大小大于阈值时就会启动拥塞避免算法¡£

              拥塞避免算法

              拥塞避免算法相比简单点£¬每过一个 RTT 窗口大小只加一£¬这样能够避免指数?#23545;?#38271;导致网络拥塞£¬慢慢将大小调整到最佳值¡£

              在传输过程中可能定时器超时的情况£¬这时候 TCP 会认为网络拥塞了£¬会马上进行以下步骤£º

              将阈值设为当前拥塞窗口的一半 将拥塞窗口设为 1 MSS 启动拥塞避免算法

              快速重传

              快速重传一般和快恢复一起出现¡£一旦接收端收到的报文出现失序的情况£¬接收端只会回复最后一个顺序正确的报文序号£¨没有 Sack 的情况下£©¡£如果收到三个重复的 ACK£¬无需等待定时器超时再重发而是启动快速重传¡£具体算法分为两种£º

              TCP Taho 实现如下

              将阈值设为当前拥塞窗口的一半 将拥塞窗口设为 1 MSS 重新开始慢开始算法

              TCP Reno 实现如下

              拥塞窗口减半 将阈值设为当前拥塞窗口 进入快恢复阶段£¨重发对端需要的包£¬一旦收到一个新的 ACK 答复就?#39034;?#35813;阶段£© 使用拥塞避免算法

              TCP New Ren 改进后?#30446;?#24674;复

              TCP New Reno 算法改进了之前 TCP Reno 算法的?#27605;Ên?#22312;之前£¬快恢复中只要收到一个新的 ACK 包£¬就会?#39034;?#24555;恢复¡£

              TCP New Reno 中£¬TCP 发送方先记下三个重复 ACK 的分段的最大序号¡£

              假如我有一个分段数据是 1 ~ 10 这十个序号的报文£¬其中丢失了序号为 3 和 7 的报文£¬那么该分段的最大序号就是 10¡£发送端只会收到 ACK 序号为 3 的应答¡£这时候重发序号为 3 的报文£¬接收方顺利接收并会发送 ACK 序号为 7 的应答¡£这时候 TCP 知道对端是有多个包未收到£¬会继续发送序号为 7 的报文£¬接收方顺利接收并会发送 ACK 序号为 11 的应答£¬这时发送端认为这个分段接收端已经顺利接收£¬接下来会?#39034;?#24555;恢复阶段¡£

              HTTP

              HTTP 协议是个无状态协议£¬不会保存状态¡£

              Post 和 Get 的区别

              先引入副作用和幂等的概念¡£

              副作用指对服务器上的资源做改变£¬搜索是无副作用的£¬注册是副作用的¡£

              幂等指发送 M 和 N 次请求£¨两者不相同且?#21363;?#20110; 1£©£¬服务器上资源的状态一致£¬比如注册 10 个和 11 个帐号是不幂等的£¬对文章进行更改 10 次和 11 次是幂等的¡£

              在规范的应用场景上说£¬Get 多用于无副作用£¬幂等的场景£¬例如搜索关键字¡£Post 多用于副作用£¬不幂等的场景£¬例如注册¡£

              在技术上说£º

              Get 请求能缓存£¬Post 不能 Post 相对 Get 安全一点点£¬因为Get 请求都包含在 URL 里£¬?#19968;?#34987;浏览器保存历史纪录£¬Post 不会£¬但是在抓包的情况下都是一样的¡£ Post 可以通过 request body来传输比 Get 更多的数据£¬Get 没有这个技术 URL有长度限制£¬会影响 Get 请求£¬但是这个长度限制是浏览器规定的£¬不是 RFC 规定的 Post 支?#25351;?#22810;的编码类型且不对数据类型限制

              常见状态码

              2XX 成功

              200 OK£¬表示从客户端发来的请求在服务器端被正确处理 204 No content£¬表示请求成功£¬但响应报文不含实体的主体部分 205 Reset Content£¬表示请求成功£¬但响应报文不含实体的主体部分£¬但是与 204 响应不同在于要求请求方重置内容 206 Partial Content£¬进行?#27573;?#35831;求

              3XX 重定向

              301 moved permanently£¬永久性重定向£¬表示资源已被分配了新的 URL 302 found£¬临时性重定向£¬表示资源临时被分配了新的 URL 303 see other£¬表示资?#21019;?#22312;着另一个 URL£¬应使用 GET 方法获取资源 304 not modified£¬表示服务器允许访问资源£¬但因发生请求未满足条件的情况 307 temporary redirect£¬临时重定向£¬和302含义类似£¬但是期望客户端保持请求方法不变向新的地址发出请求

              4XX 客户端错误

              400 bad request£¬请求报文存在语法错误 401 unauthorized£¬表示发送的请求需要有通过 HTTP ?#29616;?#30340;?#29616;?#20449;息 403 forbidden£¬表示对请求资源的访?#26102;?#26381;务器拒绝 404 not found£¬表示在服务器上没有找到请求的资源

              5XX 服务器错误

              500 internal sever error£¬表示服务器端在执行请求时发生了错误 501 Not Implemented£¬表示服务器不支持当前请求所需要的某个功能 503 service unavailable£¬表明服务器暂时处于超负载或正在停机维护£¬无法处理请求

              HTTP 首部

              通用字段 作用
              Cache-Control 控制缓存的行为
              Connection 浏览器想要优先使用的连接类?#20572;?#27604;如 keep-alive
              Date 创建报文时间
              Pragma 报文指令
              Via 代理服务器相关信息
              Transfer-Encoding 传输编码方式
              Upgrade 要求客户端升级协议
              Warning 在内容中可能存在错误
              请求字段 作用
              Accept 能正确接收的媒体类型
              Accept-Charset 能正确接收的字符集
              Accept-Encoding 能正确接收的编码格式列表
              Accept-Language 能正确接收的语言列表
              Expect 期待服务端的指定行为
              From 请求?#25509;?#31665;地址
              Host 服务器的域名
              If-Match 两端资源标记比较
              If-Modified-Since 本地资?#27425;?#20462;改返回 304£¨比较时间£©
              If-None-Match 本地资?#27425;?#20462;改返回 304£¨比较标记£©
              User-Agent 客户端信息
              Max-Forwards 限制可被代理及网关转发的次数
              Proxy-Authorization 向代理服务器发送验证信息
              Range 请求某个内容的一部分
              Referer 表示浏览器所访问的前一个页面
              TE 传输编码方式
              响应字段 作用
              Accept-Ranges 是否支持某些种类的?#27573;?/td>
              Age 资源在代理缓存中存在的时间
              ETag 资源标识
              Location 客户端重定向到某个 URL
              Proxy-Authenticate 向代理服务器发送验证信息
              Server 服务器名字
              WWW-Authenticate 获取资源需要的验证信息
              实体字段 作用
              Allow 资源的正确请求方式
              Content-Encoding 内容的编码格式
              Content-Language 内容使用的语言
              Content-Length request body 长度
              Content-Location 返回数据的备用地址
              Content-MD5 Base64?#29992;?/a>格式的内容 MD5检验值
              Content-Range 内容的位置?#27573;?/td>
              Content-Type 内容的媒体类型
              Expires 内容的过期时间
              Last_modified 内容的最后修改时间

              PS£º缓存相关?#35328;?#21035;的模块?#34892;?#23436;£¬你可以 阅读该小节

              HTTPS

              HTTPS 还是通过了 HTTP 来传输信息£¬但是信息通过 TLS 协议进行?#24605;用Ü¡?/p>

              TLS

              TLS 协议位于传输层之上£¬应用层之下¡£首次进行 TLS 协议传输需要两个 RTT £¬接下来可以通过 Session Resumption 减少到一个 RTT¡£

              在 TLS 中使用了两种?#29992;?#25216;术£¬分别为£º对称?#29992;?#21644;非对称?#29992;Ü¡?/p>

              对称?#29992;?/strong>£º

              对称?#29992;?#23601;是两边拥有相同的秘钥£¬两边都知道如何将密文?#29992;?#35299;密¡£

              非对称?#29992;?/strong>£º

              有公钥私钥之分£¬公钥所有人都可以知道£¬可以将数据用公?#32771;用Ü£?#20294;是将数据解密必须使?#30431;?#38053;解密£¬私钥只有分发公钥的一?#35762;?#30693;道¡£

              TLS 握手过程如下图£º

              \

              客户端发送一个随机值£¬需要的协议和?#29992;?#26041;式 服务端收到客户端的随机值£¬自己也产生一个随机值£¬并根据客户端需求的协议和?#29992;?#26041;式来使用对应的方式£¬发送自己的证书£¨如果需要验证客户端证书需要说明£© 客户端收到服务端的证书并验证是否?#34892;§£?#39564;证通过会再生成一个随机值£¬通过服务端证书的公钥去?#29992;?#36825;个随机值并发?#36879;?#26381;务端£¬如果服务端需要验证客户端证书的话会附带证书 服务端收到?#29992;?#36807;的随机值并使?#30431;?#38053;解密获得第三个随机值£¬这时候两端?#21152;?#26377;了三个随机值£¬可以通过这三个随机值按照之前约定的?#29992;?#26041;式生成密钥£¬接下来的通信就可以通过该密钥来?#29992;?#35299;密

              通过以上步骤可知£¬在 TLS 握手阶段£¬两端使用非对称?#29992;?#30340;方式来通信£¬但是因为非对称?#29992;?#25439;耗的性能比对称?#29992;?#22823;£¬所以在正式传输数据时£¬两端使用对称?#29992;?#30340;方式通信¡£

              PS£º以上说明的都是 TLS 1.2 协议的握手情况£¬在 1.3 协议中£¬首次建立连接只需要一个 RTT£¬后面恢复连接不需要 RTT 了¡£

              HTTP 2.0

              HTTP 2.0 相比于 HTTP 1.X£¬可以说是大幅度提高了 web 的性能¡£

              在 HTTP 1.X 中£¬为了性能考虑£¬我们会引入雪碧图¡¢将小图内联¡¢使用多个域名等等的方式¡£这一切都是因为浏览器限制?#36865;?#19968;个域名下的请求数量£¬当页面中需要请求很多资源的时候£¬队头阻塞£¨Head of line blocking£©会导致在达到最大请求数量时£¬剩余的资源需要等待其他资源请求完成后才能发起请求¡£

              你可以通过 该链接 感受下 HTTP 2.0 比 HTTP 1.X 到底快了多少¡£

              在 HTTP 1.X 中£¬因为队头阻塞的原因£¬你会发现请求是这样的

              在 HTTP 2.0 中£¬因为引入了多路复用£¬你会发现请求是这样的

              二进?#25340;?#36755;

              HTTP 2.0 中所有加强性能的核心点在于此¡£在之前的 HTTP 版本中£¬我们是通过文本的方式传输数据¡£在 HTTP 2.0 中引入了新的编码机制£¬所有传输的数据都会被分割£¬并采用二进制格式编码¡£

              多路复用

              在 HTTP 2.0 中£¬有两个非常重要的概念£¬分别是帧£¨frame£©和流£¨stream£©¡£

              帧代表着最小的数据单位£¬每个帧会标识出该帧属于哪个流£¬流也就是多个帧组成的数据流¡£

              多路复用£¬就是在一个 TCP 连接中可以存在多条流¡£换句话说£¬也就是可以发?#25237;?#20010;请求£¬对端可以通过帧中的标识知道属于哪个请求¡£通过这个技术£¬可以避免 HTTP 旧版本中的队头阻塞问题£¬极大的提高传输性能¡£

              IOSvwMDG97+qyry94s72zsS8/qOsyOe5+8rHIGd6aXAguPHKvbXEu7C74c/IveLRudK7z8KjrMi7uvPNqLn9zsS8/rXEseDC67jxyr3WqrXAuMPI57rOyKW94sLrzsS8/iDOxLz+veLC67PJuaa687vh1f3Kvb+qyrzk1si+wfezzKOsz8i74bj5vt0gSFRNTCC5ub2oIERPTSDK96Os09AgQ1NTILXEu7C74cilubm9qCBDU1NPTSDK96GjyOe5+9P2tb0gc2NyaXB0ILHqx6m1xLuwo6y74cXQts/Kx7fxtObU2iBhc3luYyC78tXfIGRlZmVyIKOsx7DV37vhsqLQ0L340NDPwtTYsqLWtNDQIEpTo6y689Xfu+HPyM/C1NjOxLz+o6zIu7rztci0/SBIVE1MIL3izvbN6rPJuvPLs9Dy1rTQ0KOsyOe5+9LUyc+2vMO709CjrL7Nu+HX6Mj716Hk1si+wfezzNaxtb0gSlMg1rTQ0M3qsc+ho9P2tb3OxLz+z8LU2LXEu+HIpc/C1NjOxLz+o6zV4sDvyOe5+8q508MgSFRUUCAyLjAg0K3S6bXEu7C74byrtPO1xMzhuN+24M28tcTPwtTY0KfCyqGjILP1yry1xCBIVE1MILG7zerIq7zT1Ni6zb3izva687vhtKW3oiBET01Db250ZW50TG9hZGVkIMrCvP4gQ1NTT00gyve6zSBET00gyve5ub2ozeqzybrzu+G/qsq8yfqzySBSZW5kZXIgyvejrNXi0ruyvb7NysfIt7ao0rPD5tSqy9i1xLK8vtahotH5yr21yLXI1u624Le9w+a1xLarzvcg1NrJ+rPJIFJlbmRlciDK97XEuf2zzNbQo6zkr8DAxve+zb+qyry199PDIEdQVSC75tbGo6y6z7PJzbyy46OsvavE2sjdz9TKvtTaxsHEu8nPwcsNCjxwPjxpbWcgYWx0PQ=="" data-="" src="/img/remote/1460000017892174w=900&h=500" title="" />

              点击复制链接 与好友分享!回本站首页
              上一篇£ºReacthooks实践之前端
              下一篇£ºjs词法作用域和动态作用域
              相关文章
              图文推荐

              关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报?#34892;?/a>

              版权所有: 红黑联盟--致力于做实用的IT技术学习网站

              ¼«ËÙ·ÉͧºÃ¼Ù
              <dl id="opymh"></dl>

              <div id="opymh"></div>
                  <div id="opymh"><tr id="opymh"></tr></div>

                    <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

                    <em id="opymh"></em>

                    <em id="opymh"><ol id="opymh"></ol></em>

                          <dl id="opymh"></dl>

                          <div id="opymh"></div>
                              <div id="opymh"><tr id="opymh"></tr></div>

                                <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

                                <em id="opymh"></em>

                                <em id="opymh"><ol id="opymh"></ol></em>