1. 协议

协议相关的考题,经常被问,不过我都只是知道一点点...每次问到都回答不出来

1.1.1. tcp三次握手和四次挥手流程示意图?

点击显示

https://blog.csdn.net/smileiam/article/details/78226816

叶落山城秋: 握手就是 我跟你发条消息,我要给你发条消息,你收到后,也给我发了条消息"我收到了你的消息",我收到后,开始给你发数据 挥手就是 我告诉你 我要关闭连接了,你收到后,给我发"我知道你要关闭了",然后你告诉我,你也要关闭了,我收到后,给你发一条,我知道你要关闭了. 然后就没有然后了.. 总共四次 大概 貌似好像是这么个意思

1.1.2. tcp 和 udp 的区别?

点击显示

1.TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前 不需要建立连接 2.TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失, 不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付 3.TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向 报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低 4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的 交互通信 5.TCP首部开销20字节;UDP的首部开销小,只有8个字节 6.TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

1.1.3. http,tcp,ip分别处于OSI哪一层?

点击显示
  • 传输层协议:TCP、UDP、SCTP
  • 网络层协议:IP、ARP、RARP、ICMP、IGMP、OSPF
  • 应用层协议:http,FTP、SMTP、RIP、DNS

记不住...

1.1.4. OSI有哪几层,会画出来,知道主要几层的各自作用?

点击显示
  1. 应用层(数据): 确定进程之间通信的性质以满足用户需要以及提供网络与用户应用
  2. 表示层(数据): 主要解决拥护信息的语法表示问题,如加密解密
  3. 会话层(数据): 提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制,如服务器验证用户登录便是由会话层完成的
  4. 运输层(段): 实现网络不同主机上用户进程之间的数据通信,可靠与不可靠的传输,传输层的错误检测,流量控制等
  5. 网络层(包): 提供逻辑地址(IP)、选路,数据从源端到目的端的传输
  6. 数据链路层(帧): 将上层数据封装成帧,用MAC地址访问媒介,错误检测与修正
  7. 物理层(比特流):设备之间比特流的传输,物理接口,电气特性等

1.1.5. TCP/IP有哪几层,会画出来,知道所有层数的作用,会列举各层主要的协议名称?

点击显示
  1. 应用层(TELNET、FTP、SMTP)
  2. 运输层(TCP、UDP)
  3. 网际层(IP、ICMP)
  4. 网络接口层(PPP)

1.1.6. 知道各个层使用的是哪个数据交换设备。(交换机、路由器、网关)?

点击显示
  1. 网关:应用层、传输层(网关在传输层上以实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关的结构也和路由器类似,不同的是互连层。网关既可以用于广域网互连,也可以用于局域网互连)
  2. 路由器:网络层(路由选择、存储转发)
  3. 交换机:数据链路层、网络层(识别数据包中的MAC地址信息,根据MAC地址进行转发,并将这些MAC地址与对应的端口记录在自己内部的一个地址表中)
  4. 网桥:数据链路层(将两个LAN连起来,根据MAC地址来转发帧)
  5. 集线器(Hub):物理层(纯硬件设备,主要用来连接计算机等网络终端)
  6. 中继器:物理层(在比特级别对网络信号进行再生和重定时,从而使得它们能够在网络上传输更长的距离)

1.1.7. TCP通过哪些措施,保证传输可靠?

点击显示
  1. 流量控制
  2. 让发送方的发送速率不要太快,要让接收方来得及接收
  3. 窗口大小是一个可以改变的值,它由接收端主机控制,附加在 TCP 首部的“窗口大小”字段中
  4. 拥塞控制
  5. 防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载
  6. 拥塞控制方法:慢开始、拥塞避免、快重传和快恢复

1.1.8. 请求各个状态的意义如下

点击显示
  1. LISTEN - 侦听来自远方TCP端口的连接请求;
  2. SYN-SENT -在发送连接请求后等待匹配的连接请求;
  3. SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认;
  4. ESTABLISHED- 代表一个打开的连接,数据可以传送给用户;
  5. FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;
  6. FIN-WAIT-2 - 从远程TCP等待连接中断请求;
  7. CLOSE-WAIT - 等待从本地用户发来的连接中断请求;
  8. CLOSING -等待远程TCP对连接中断的确认;
  9. LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认;
  10. TIME-WAIT -等待足够的时间以确保远程TCP接收到连接中断请求的确认;
  11. CLOSED - 没有任何连接状态;

1.1.9. 为什么要3次握手,4次挥手

点击显示
  1. 握手:防止已过期的连接请求报文突然又传送到服务器,因而产生错误
  2. 挥手:确保数据能够完成传输,但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的

1.1.10. HTTP 、TCP、Socket区别

点击显示
  • TCP/IP代表传输控制协议/网际协议,指的是一系列协组
  • HTTP本身就是一个协议,是从Web服务器传输超文本到本地浏览器的传送协议
  • Socket是TCP/IP网络的API其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议
  • 综上所述:需要IP协议来连接网络;TCP是一种允许我们安全传输数据的机制,使用TCP协议来传输数据的HTTP是Web服务器和客户端使用的特殊协议。HTTP基于TCP协议,但是却可以使用socket去建立一个TCP连接

1.1.11. Cookies 和 Session的区别

点击显示
  • cookie 是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个WEB站点会话间持久的保持数据
  • session其实指的就是访问者从到达某个特定主页到离开为止的那段时间。 Session其实是利用Cookie进行信息处理的,当用户首先进行了请求后,服务端就在用户浏览器上创建了一个Cookie,当这个Session结束时,其实就是意味着这个Cookie就过期了
  • cookie数据保存在客户端,session数据保存在服务器端

1.1.12. HTTP /1.1 与 /2.0版本的常见差异和特性

点击显示

HTTP 1.1

  • 默认使用长连接(connection:keep-alive)。解决了复用TCP的问题,可以减少TCP的三次握手开销。
    • 指的是用同一个TCP连接来发送和接受多个http请求/应答,而不是为了每一个新的请求/应答打开新的TCP连接的方法。
      • 另一个定义:一定时间内,同一域名多次请求数据,只建立一次HTTP请求,其他请求可复用每一次建立的连接通道,以达到提高请求效率的问题。这里面所说的一定时间是可以配置的,不管你用的是Apache还是nginx
      • 但是还是存在效率问题(HTTP2.0通过多路复用解决)
        • 串行的文件传输,只能顺序传输:当请求a文件时,b文件只能等待,等待a连接到服务器、服务器处理文件、服务器返回文件,这三个步骤。我们假设这三步用时都是1秒,那么a文件用时为3秒,b文件传输完成用时为6秒,依此类推。(注:此项计算有一个前提条件,就是浏览器和服务器是单通道传输)
        • 连接数上限:我们假设Apache设置了最大并发数为300,因为浏览器限制,浏览器发起的最大请求数为6,也就是服务器能承载的最高并发为50,当第51个人访问时,就需要等待前面某个请求处理完成。
  • 支持只发送header信息而不带任何body信息,如果客户端有权限,则返回100(代表继续),否则返回401(无权限)客户端如果接收到100,才把请求的Body发送到服务器。
    • 这样当服务器返回401的时候,客户端就可以不用发送请求body了,节约了带宽
  • 1.1开始支持获取文件的部分内容,这支持了 并行下载 和 断点续传。通过在Header的两个参数实现
    • 客户端请求的时候发送Range参数, 指定第一个字节的位置和最后一个字节的位置
    • 服务端响应的参数是:Content-Range
    • 在实际场景中,会出现一种情况,即在终端发起续传请求时,URL 对应的文件内容在服务器端已经发生变化,此时续传的数据肯定是错误的。如何解决这个问题 ?
      • 用Last-modified / etag / if-range
      • If-Range 必须与 Range 配套使用。如果请求报文中没有 Range,那么 If-Range 就会被忽略。如果服务器不支持 If-Range,那么 Range 也会被忽略。
    • 工作原理:
      • 第一次请求,客户端发起一个get请求;服务器处理请求,返回文件内容以及相应的Header,包括Etag
      • 第二次请求(断点续传):客户端发起get请求,同时发送if-range,这个if-range的值就是第一次请求中服务器返回的etag;服务器判断etag是否匹配,是则返回206,否则返回200
  • HTTP/1.1 引入了更多的缓存控制策略,比如
    • if-unmodified-since,其实就是和if-modified-since差不多的,常用来做判断断点续传的文件是否被修改过了。如果没有被修改,返回200;否则返回412预处理错误。
    • if-match
    • if-none-match
  • 1.1开始有Host(域) 这个概念

HTTP 2.0

  • 最大的一个目标是在用户和网站间只用一个连接
  • 二进制分帧(Binary Framing)

    • 在 TCP 协议中,数据的传输单位是数据报。数据分成两大部分。头部(header) 和 实际数据部分(body)。
    • 在 HTTP 2.0 中,它把数据报的两大部分分成了 header frame 和 data frame。也就是头部帧和数据体帧。帧的传输最终在流中进行,流中的帧,头部(header)帧 和 data 帧可以分为多个片段帧,例如data帧即是可以 data = data_1 + data_2 + ... + data_n。
    • 此外地,如果基于二进制帧整体来划分,除了报文的帧分类。还有其它一些辅助帧类型,例如评论中提到的:SETTINGS、PING、GOWAY、WINDOW_UPDATE等控制帧。
  • http1.x诞生的时候是明文协议,其格式由三部分组成:start line(request line或者status line),header,body。要识别这3部分就要做协议解析,http1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑http2.0的协议解析决定采用二进制格式,实现方便且健壮

  • 几个概念:
    • frame 帧:http/2通信的最小单位,单个帧包含帧首部,其中标注了当前帧所属的stream
    • message 消息:由若干个frame组合而成,例如请求,响应
    • connection 连接:与http/1 相同,指的都是对应的tcp连接
    • stream 流,已建立的连接上的双向字节流。
    • 数据流以消息的形式发送,而消息由一个或多个帧组成,帧可以在数据流上乱序发送,然后再根据每个帧首部的流标识符重新组装。二进制分帧是HTTP/2的基石,其他优化都是在这一基础上来实现的。
  • 支持多路复用(Multiplexing),在数据链路层使用二进制分帧,可以允许同时通过单一的ht2连接发起多重的请求-响应消息,同个域名只需要占用一个 TCP 连接,解决了请求阻塞的问题。
    • 在HTTP1.1中,同一域名在同一时间的请求数量是有限制的,超过限制会阻塞请求。
    • Head-of-Line Blocking,在http1.x中,TCP的connection在同一时间只能允许一个请求经过,因为HTTP1.x需要每条请求都是可是识别,按顺序发送,否则server就无法判断该相应哪个具体的请求。
    • 多路复用指的是:在同一个域名下,开启一个TCP的connection,每个请求以stream的方式传输,每个stream有唯一标识,connection一旦建立,后续的请求都可以复用这个connection并且可以同时发送,server端可以根据stream的唯一标识来相应对应的请求。之所以可以复用,是因为每个stream高度独立,堵塞的stream不会影响其它stream的处理。一个连接上可以有多个stream,每个stream的frame可以随机的混杂在一起,接收方可以根据stream id将frame再归属到各自不同的request里面。
    • 而多路复用什么时候关闭呢?
      • 用户离开这个页面
      • server主动关闭connection
    • 那么在HTTP2.0下,我们就不需要做
      • JS文件的合并:在之前,我们会将上线若干个模块的代码进行压缩合并成一个文件,减少http请求数。但是这样就会导致缓存问题:如果有一个模块修改了,就会导致客户端重新下载整个大文件,难以缓存。现在用HTTP2.0就不需要做这件事情了
      • CDN资源放在不同域名下,绕开浏览器的通道上限。
    • 头部压缩:
      • http2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。高效的压缩算法可以很大的压缩header,减少发送包的数量从而降低延迟。
    • 服务端推送(server push):
      • 从HTTP/2开始,服务器除了相应客户端的请求之外,还可以向客户端额外推送资源,这些资源遵守同源协议,有自己独立的URL,可以被浏览器缓存,可以多页面共享;同时客户端还可以拒绝推送过来的资源
      • 有了server push,客户端可以通过额外的http头部,列出需要服务器push 哪些资源
      • 服务器可以提前向客户端推送需要的资源。
    • 流量控制(flow control):
      • 在TCP的流量控制中,是以单个tcp为单位的流量控制;可是在http2.0时代,传输已经以单个stream为单位,tcp的流量控制无法做到这么精细的粒度,因此就在应用层引入了flow control,从而对每一个stream都做了不同的限流
      • 而HTTP/2利用stream来实现flow-control,引入了stream对TCP连接的抢占,不加控制就会造成stream被阻塞。而http/2上的flow-control就是确保同一连接上的多个流之间不会造成破坏性的干扰
    • 流优先级(stream priority):
      • 在HTTP/2中,每个请求都可以带一个31bit的优先值,0表示最高优先级, 数值越大优先级越低。有了这个优先值,客户端和服务器就可以在处理不同的流时采取不同的策略,以最优的方式发送流、消息和帧。(其实我的理解还是为了解决TCP抢占的问题?)

从HTTP/1.x到HTTP/2的过程中,仍然适用的优化规则

  • 减少DNS查询。DNS查询需要时间,没有resolved的域名会阻塞请求。
  • 减少TCP连接。HTTP/2只使用一个TCP连接。
  • 使用CDN。使用CDN分发资源可以减少延迟。
  • 减少HTTP跳转。特别是非同一域名的跳转,需要DNS,TCP,HTTP三种开销。
  • 消除不必要的请求数据。HTTP/2压缩了Header。
  • 压缩传输的数据。gzip压缩很高效。
  • 客户端缓存资源。缓存是必要的。
  • 消除不必要的资源。激进的提前获取资源对客户端和服务端都开销巨大。

因为HTTP/2而不一样的优化规则

  • 域名分片:大概意思就是我们把资源放在不同域名下,绕过浏览器HTTP连接数的限制。HTTP2.0不用了
  • 文件合并:在HTTP2.0中,我们要使用更小的模块,优化缓存策略(因为大文件的某一部分更改了,整个大文件就无法缓存了)
  • 内联资源:在HTTP2.0中直接使用server push。

以上参考:

HTTP

HTTP

results matching ""

    No results matching ""