Java-计算机网络-5

1.22 HTTP2.0中TCP阻塞了怎么办?

参考回答

​ HTTP2.0中TCP阻塞了有如下两种方法可以解决:

(1)并发TCP连接(浏览器一个域名采用6-8个TCP连接,并发HTTP请求)
(2)域名分片(多个域名,可以建立更多的TCP连接,从而提高HTTP请求的并发)

答案解析

1. TCP队头阻塞

​ TCP数据包是有序传输,中间一个数据包丢失,会等待该数据包重传,造成后面的数据包的阻塞。

2. HTTP队头阻塞

​ http队头阻塞和TCP队头阻塞完全不是一回事。

​ http1.x采用长连接(Connection:keep-alive),可以在一个TCP请求上,发送多个http请求。

​ 有非管道化和管道化,两种方式。

非管道化,完全串行执行,请求->响应->请求->响应...,后一个请求必须在前一个响应之后发送。

管道化,请求可以并行发出,但是响应必须串行返回。后一个响应必须在前一个响应之后。原因是,没有序号标明顺序,只能串行接收。

管道化请求的致命弱点:

​ (1)会造成队头阻塞,前一个响应未及时返回,后面的响应被阻塞
​ (2)请求必须是幂等请求,不能修改资源。因为,意外中断时候,客户端需要把未收到响应的请求重发,非幂等请求,会造成资源破坏。

​ 由于这个原因,目前大部分浏览器和Web服务器,都关闭了管道化,采用非管道化模式。

​ 无论是非管道化还是管道化,都会造成队头阻塞(请求阻塞)。

解决http队头阻塞的方法:

(1)并发TCP连接(浏览器一个域名采用6-8个TCP连接,并发HTTP请求)
(2)域名分片(多个域名,可以建立更多的TCP连接,从而提高HTTP请求的并发)

2. HTTP2方式

​ http2使用一个域名单一TCP连接发送请求,请求包被二进制分帧,不同请求可以互相穿插,避免了http层面的请求队头阻塞。
​ 但是不能避免TCP层面的队头阻塞。

1.23 TCP如何保证可靠性?

参考回答

​ TCP协议保证数据传输可靠性的方式主要有:校验和、序列号、确认应答、超时重传、连接管理、流量控制、拥塞控制

  1. 校验和

    计算方式:在数据传输的过程中,将发送的数据段都当做一个16位的整数。将这些整数加起来。并且前面的进位不能丢弃,补在后面,最后取反,得到校验和。
    发送方:在发送数据之前计算检验和,并进行校验和的填充。
    接收方:收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方的进行比对。

    **校验和

    注意:如果接收方比对校验和与发送方不一致,那么数据一定传输有误。但是如果接收方比对校验和与发送方一致,数据不一定传输成功。

  2. 序列号和确认应答

    序列号:TCP传输时将每个字节的数据都进行了编号,这就是序列号。
    确认应答:TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送ACK报文。这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发。

    确认

    ​ 序列号的作用不仅仅是应答的作用,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据。这也是TCP传输可靠性的保证之一。

  3. 超时重传

    ​ 在进行TCP传输时,由于确认应答与序列号机制,也就是说发送方发送一部分数据后,都会等待接收方发送的ACK报文,并解析ACK报文,判断数据是否传输成功。如果发送方发送完数据后,迟迟没有等到接收方的ACK报文,这该怎么办呢?而没有收到ACK报文的原因可能是什么呢?

    ​ 首先,发送方没有接收到响应的ACK报文原因可能有两点:

    ​ (1)数据在传输过程中由于网络原因等直接全体丢包,接收方根本没有接收到。

    ​ (2)接收方接收到了响应的数据,但是发送的ACK报文响应却由于网络原因丢包了。

    ​ TCP在解决这个问题的时候引入了一个新的机制,叫做超时重传机制。简单理解就是发送方在发送完数据后等待一个时间,时间到达没有接收到ACK报文,那么对刚才发送的数据进行重新发送。如果是刚才第一个原因,接收方收到二次重发的数据后,便进行ACK应答。如果是第二个原因,接收方发现接收的数据已存在(判断存在的根据就是序列号,所以上面说序列号还有去除重复数据的作用),那么直接丢弃,仍旧发送ACK应答。

  4. 连接管理

    ​ 连接管理就是三次握手与四次挥手的过程,保证可靠的连接,是保证可靠性的前提。

  5. 流量控制

    ​ 收端在接收到数据后,对其进行处理。如果发送端的发送速度太快,导致接收端的结束缓冲区很快的填充满了。此时如果发送端仍旧发送数据,那么接下来发送的数据都会丢包,继而导致丢包的一系列连锁反应,超时重传呀什么的。而TCP根据接收端对数据的处理能力,决定发送端的发送速度,这个机制就是流量控制。

    在TCP协议的报

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java岗位面试真题宝典 文章被收录于专栏

本面试宝典均来自校招面试题目大数据进行的整理

全部评论
第一个问题应该是 如何解决HTTP1.x 的队头阻塞问题吧,Http2是没有解决 tcp 阻塞问题的
点赞 回复 分享
发布于 2021-08-19 09:31

相关推荐

点赞 评论 收藏
分享
程序员花海:实习和校招简历正确格式应该是教育背景+实习+项目经历+个人评价 其中项目经历注意要体现业务 实习经历里面的业务更是要自圆其说 简历模板尽可能保持干净整洁 不要太花哨的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务