计算机网络八股文(二)

目录

21.HTTP/1.1的缺点?

22.HTTP/2做了什么优化?

23.HTTP/2有什么缺陷?

24.HTTP/3做了哪些优化?

25.HTTP/1如何优化?

26.HTTPS如何优化?

27.HTTP/2的牛逼在哪?

28.既然有了HTTP协议,为什么要有RPC?

29.既然有了HTTP协议,为什么要有WebSocket?

30.TCP报文头格式?

31.TCP工作在哪一层?为什么需要TCP?

32.什么是TCP?

33.如何确定一个TCP连接?

34.一个ip的服务器监听了一个端口,它的TCP最大连接数是多少?

35.UDP和TCP的区别?

36.TCP和UDP的应用场景?

37.TCP和UDP可以共用同一个端口吗?

38.TCP三次握手?

39.如何在Linux系统中查看TCP状态?

40.TCP为什么是三次握手?不是两次、四次?


21.HTTP/1.1的缺点?

  • 请求 / 响应头部(Header)未经压缩就发送,首部信息越多延迟越大。只能压缩 Body 的部分;
  • 发送冗长的首部。每次互相发送相同的首部造成的浪费较多;
  • 服务器是按请求的顺序响应的。如果服务器响应慢,客户端一直请求不到数据,造成队头阻塞;
  • 没有请求优先级控制;
  • 请求只能从客户端开始,服务器只能被动响应。

22.HTTP/2做了什么优化?

        1)头部压缩:客户端和服务端同时维护一张头信息表,所有的字段存入该表中,生成一个索引号,发送数据时只用带上索引号就可以,提高了发送速度,这就是HPack算法

        2)二进制格式:头信息和数据体都采用二进制形式发送,分为头信息帧数据帧,提高了传输速率。

        3)并发传输:HTTP/2引出Stream概念,多个Stream可以复用同一条TCP连接。

上图可以看出,每个TCP连接可以有多个Stream,每个Stream可以有多个Message,Message对应HTTP/1中的请求或响应,每个Message可以有多个frame,frame是HTTP/2的最小单位,frame里存放的是对HTTP/1中的头和数据体进行二进制压缩后的数据。

        不同的HTTP请求对应不同ID的Stream,接收端可以根据Stream ID有序的组成HTTP消息,所以不同的Stream可以乱序并发,HTTP/2可以并行交错的请求和回复数据。

        4)服务器主动推送资源:客户端和服务端双方都可以建立Stream,客户端建立的Stream的ID必须是奇数,服务端必须是偶数。

        比如,在HTTP/1中,客户端向服务端请求一个html页面时,html中可能需要css来渲染页面,此时客户端需要再发一次请求给服务端请求来获取css资源,需要两次的消息往返。

而在HTTP/2中,客户端访问html时,服务器可以主动向客户端推送css资源,减少了消息传递次数。

23.HTTP/2有什么缺陷?

        发生“队头阻塞”问题,这不是HTTP/2的问题,本质是TCP的问题。由于HTTP是基于TCP协议的,TCP是字节流协议,TCP层必须保证收到的数据是完整且连续的,当“前一个字节”没有收到或者丢失时,即使收到了后面的所有数据,内核也不会将缓冲区中的数据返回给HTTP应用,这就导致HTTP/2的队头阻塞问题。

24.HTTP/3做了哪些优化?

        HTTP/3为了解决HTTP/2的队头阻塞问题,将HTTP协议下的TCP更改为了UDP,基于UDP的QUIC协议可以实现类似TCP的可靠传输。

        QUIC协议的特点如下:

        1)无队头阻塞:

        QUIC协议也有类似HTTP/2的Stream和多路复用,所以也可以在同一条连接上传输多个Stream。QUIC有自己的机制保证传输的可靠性。当某个Stream发生丢包后,只会影响这个流,不会影响其他的Stream流,因此不存在队头阻塞。

        2)建立连接更快:

        HTTP/1和HTTP/2中,TCP和TLS是分层的,TCP属于传输层,TLS属于openssl库实现的表示层,所以建立连接需要先TCP握手,再TLS握手。

        HTTP/3中,传输数据需要先进行QUIC握手,握手是为了确认双方的连接ID,但是在QUIC握手的过程中,包含了TLS里的记录,并且QUIC使用的是TLS/1.3,所以仅需1个RTT(往返时间,网络请求从起点到目的地然后再回到起点所花费的时长)就可以同时完成连接建立和密钥协商。

        3)连接迁移更丝滑

        HTTP/1和HTTP/2是基于TCP的协议,一条TCP连接由四元组(源ip,源端口,目的ip,目的端口)确定的,当移动设备从4G切换到WIFI的时候,ip地址发生变化,四元组就发生了变化,导致这条TCP就断开了连接,所以需要重新进行TCP握手、TLS握手以及TCP慢启动的减速过程,给用户带来网络卡顿的体验,因此连接迁移成本很高。

        QUIC是通过连接ID来标记客户端和服务端的通信连接,因此当ip地址发生变化时,只要仍保留上下文信息(如连接ID、TLS密钥等),就可以“无缝”的复用原来的连接,使得连接迁移更加丝滑。

25.HTTP/1如何优化?

        1)通过缓存技术避免发生HTTP请求。当客户端收到第一个请求的响应后,将其缓存在本地磁盘,下次请求时,如果缓存没有过期,就直接访问缓存里的响应。如果缓存过期,客户端发送请求的时候带上响应数据的摘要,服务器对比摘要后发现资源没有变化,就发出不带包体的304响应,告诉客户端可以继续使用缓存里的响应。

        2)将多个小资源合并成一个大资源一起传输。可以减少HTTP请求次数以及头部的重复传输,同时也减少了TCP连接数量,降低了网络功耗。

        3)延迟请求,按需访问资源。只返回用户当前看得到或者用得到的资源,当需要别的资源时,再发起请求,减少了同一时间HTTP的请求数量。

26.HTTPS如何优化?

        1)TLS从1.2升级为1.3,TLS/1.3仅需一个RTT就可以完成握手。

        2)密钥交换算法应该选择 ECDHE 算法,而不用 RSA 算法,因为 ECDHE 算法具备前向安全性,而且客户端可以在第三次握手之后,就发送加密应用数据,节省了 1 RTT。

        3)会话重用,缓存TLS密钥。第一次进行TLS握手协议后,将对称加密密钥缓存起来,下次进行HTTPS请求时,直接复用该密钥就行了,减少了TLS握手的次数,但是需要将该密钥设置合理的过期时间,降低安全风险。

27.HTTP/2的牛逼在哪?

        1)HTTP头部进行压缩,节约了带宽资源,增大了网络传输速率。

        2)实现了Stream并发传输。多个Stream可以发共用同一个TCP连接,节约了TCP握手和TLS握手的时延,不同的Stream ID可以并发,可以乱序发送帧。

        3)服务器主动推送资源。提升了消息传输的性能。

28.既然有了HTTP协议,为什么要有RPC?

        1)纯裸 TCP 是能收发数据,但它是个无边界的数据流,上层需要定义消息格式用于定义消息边界。于是就有了各种协议,HTTP 和各类 RPC 协议就是在 TCP 之上定义的应用层协议。

        2)RPC 本质上不算是协议,而是一种调用方式,而像 gRPC 和 Thrift 这样的具体实现,才是协议,它们是实现了 RPC 调用的协议。目的是希望程序员能像调用本地方法那样去调用远端的服务方法。同时 RPC 有很多种实现方式,不一定非得基于 TCP 协议

        3)从发展历史来说,HTTP 主要用于 B/S 架构(浏览器和服务器架构模式),而 RPC 更多用于 C/S 架构(客户端和服务器架构模式)。但现在其实已经没分那么清了,B/S 和 C/S 在慢慢融合。很多软件同时支持多端,所以对外一般用 HTTP 协议,而内部集群的微服务之间则采用 RPC 协议进行通讯。

29.既然有了HTTP协议,为什么要有WebSocket?

        1)TCP 协议本身是全双工的,但我们最常用的 HTTP/1.1,虽然是基于 TCP 的协议,但它是半双工的,对于大部分需要服务器主动推送数据到客户端的场景,都不太友好,因此我们需要使用支持全双工的 WebSocket 协议。

        2)在 HTTP/1.1 里,只要客户端不问,服务端就不答。基于这样的特点,对于登录页面这样的简单场景,可以使用定时轮询或者长轮询的方式实现服务器推送(comet)的效果。

        3)对于客户端和服务端之间需要频繁交互的复杂场景,比如网页游戏,都可以考虑使用 WebSocket 协议。

        4)正因为各个浏览器都支持 HTTP协议,所以 WebSocket 会先利用HTTP协议加上一些特殊的 header 头进行握手升级操作,升级成功后就跟 HTTP 没有任何关系了,之后就用 WebSocket 的数据格式进行收发数据。

30.TCP报文头格式?

序列号:建立连接时随机生成的随机数作为初始值,每发送一次数据就累加一次该数据字节数的大小,用来解决网络包乱序的问题

确认应答号:指下一次期望收到的序列号,表示在这个序列号之前的数据全都接收到了,用来解决丢包问题。

ACK=1时,确认应答号变成有效字段,TCP规定除了连接建立时的第一次握手外,其他时刻ACK都置为1。

RST=1时,TCP连接有异常,必须断开连接。

SYN=1时,表示希望建立连接,序列号字段进行初始化。

FIN=1时,表示数据传输完成,希望断开连接。 

31.TCP工作在哪一层?为什么需要TCP?

        TCP是工作在传输层的可靠的数据传输服务,它可以确保接收端收到的数据包是无损坏无间隔、非冗余按序的。

32.什么是TCP?

        TCP是面向连接、可靠的、基于字节流并且有序传输层协议。

       

33.如何确定一个TCP连接?

        四元组:源地址、源端口、目的地址、目的端口

34.一个ip的服务器监听了一个端口,它的TCP最大连接数是多少?

        最大TCP连接数 = 客户端ip数 x 客户端端口数

        服务端最大的并发数远不能达到理论值,因为它会受到最大文件描述符数量的限制内存限制

35.UDP和TCP的区别?

        1)连接:UDP不需要建立连接;TCP需要。

        2)服务对象:UDP支持一对一、一对多、多对多的交互通信;TCP的只支持一对一的通信。

        3)可靠性:UDP最大努力交付,不保证数据一定到达对端;TCP保证数据无差错、不丢失、不重复、按序到达对端。

        4)拥塞控制:UDP没有拥塞控制和流量控制,即使网络拥挤,也不影响传输速率;TCP则相反。

        5)首部开销:UDP首部只有8字节;TCP的首部最少20字节(在没有使用“选项”字段的情况下)。

        6)传输方式:UDP是一个包一个包的发送,数据有边界,可能会丢包和乱序;TCP是流式传输,数据没有边界,但保证数据可靠和有序。

        7)分片不同:UDP的数据大小大于MTU(Maximum Transmission Unit,最大传输单元)时,会在ip层进行分片,到达目的主机后,在ip层组合数据后发送给传输层;TCP的数据大于MSS(Maximum Segment Size最大报文段大小)时,会在传输层进行分片,到达目的主机后在传输层进行分片,如果丢失某一分片,则会重传该分片。

36.TCP和UDP的应用场景?

        TCP:FTP文件传输、HTTP/HTTPS等

        UDP:视频、音频等多媒体通信,DNS、广播通信等

37.TCP和UDP可以共用同一个端口吗?

        可以。

        TCP和UDP在内核中是两个完全独立的软件模块,当主机收到数据包后,可以根据协议号判断是哪个协议,然后传递给对应协议的模块进行处理,最后根据端口号确定发送给哪个进程处理。

38.TCP三次握手?

第一次握手:客户端将TCP首部的SYN置1,并随机初始化序列号=client_isn发送给服务端。该报文不包含应用层数据。随后状态由CLOSE变成SYN_SENT状态。

第二次握手:服务端收到客户端的数据后,服务端将TCP首部的SYN置1ACK置1,初始化序列号=server_isn, 确认应答号字段填入client_isn+1,最后发送给客户端。该报文不包含应用层数据。服务端由LISTEN变成SYN_RCVD状态。

第三次握手:客户端收到数据后,将TCP首部的ACK置1,确认应答号填入server_isn+1,最后发送给服务端。该报文可以携带应用层数据客户端变成ESTABLISHED状态

三次握手完成后,双方都处于ESTABLISHED状态,双方可以发送数据了。

39.如何在Linux系统中查看TCP状态?

 终端输入以下命令:

netstat -napt

可以查看到协议、源地址+端口、目的地址+端口、连接状态、进程pid。

40.TCP为什么是三次握手?不是两次、四次?

        1)三次握手可以阻止重复历史连接的初始化(主要原因):

        两次握手情况下,服务端没有中间状态SYN_RCVD就进入ESTABLISHED状态,没有办法阻止历史连接,导致服务端会建立一个历史连接,造成资源浪费

        2)三次握手可以同步双方的初始化序列号:

        序列号的作用是:接收方去除重复数据、接收方根据序列号按序接收、标识哪些发出去的数据包哪些被已经接收了(通过ACK报文可知)。

        只有双方的初始化序列号能够可靠的同步,才可以完全发挥序列号的作用。

        而四次握手也可以实现双方的序列号同步,但是三次握手就已经可以实现序列号同步,降低了握手的次数。

        3)三次握手可以避免资源浪费:

                两次握手的情况下,客户端发送SYN请求建立连接,如果该SYN报文在网络中阻塞了,那么客户端会超时重传重新发送SYN报文,而服务端每收到一个SYN就会建立一个连接,造成多个冗余连接,产生资源浪费。

        总结:三次握手能防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号。序列号能够保证数据包不重复、不丢弃和按序传输。

    不使用两次握手和四次握手的原因:

    两次握手:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号。

    四次握手:三次握手就已经可以建立可靠连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值