面试题14

162 阅读12分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1. 说说什么是TCP粘包和拆包?

定义

TCP是个“流”协议,所谓流,就是没有界限的一串数据。大家可以想想河里的流水,是连成一片的,其间并没有分界线。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包来发送,这就是所谓的粘包和拆包问题。

举个例子:

假设客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次读取到的字节数是不确定的,所以存在以下四种可能情况。 (1)服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和拆包;

(2)服务端一次接收到了两个数据包,D1和D2粘合在一起,被称为TCP粘包;

(3)服务端分两次读取到了两个数据包,第一次读取到了完整的D1包和D2包的部分内容,第二次读取到了D2包的剩余内容,这被称为TCP拆包;

(4)服务端分两次读取到了两个数据包,第一次读取到了D1的部分内容D1_1,第二次读取到了D1包的剩余内容D1_2和D2的整包。

如果此时服务端TCP接收滑窗特别小,而数据包D1和D2很大,很有可能会发生第五种可能,即服务端分多次才能将D1和D2包接收完全,期间发生多次拆包。

2. 说说TCP和UDP在网络协议中的哪一层,它们之间有什么区别?

TCP和UDP协议都是传输层协议。两者的区别主要有:

(1)基于连接和无连接:

TCP是面向连接的协议。而UDP是无连接的协议,UDP更加适合消息的多播发布,从单个点向多个点传输消息;

(2)可靠性:

TCP提供交付保证,若传输过程中丢失,将会重发。而UDP是不可靠的,不提供任何交付保证。(网游和视频的丢包情况)

(3)有序性:

TCP保证了消息的有序性,即使到达客户端顺序不同,TCP也会排序;而UDP不提供有序性保证。

(4)数据边界

TCP不保存数据边界。虽然TCP也将在收集所有字节之后生成一个完整的消息,但是这些信息在传输给接收端之前将储存在TCP缓冲区,以保证更好的使用网络带宽;而UDP保存数据边界。在UDP中数据包单独发送,只有当它们到达时,才会再次集成。包有明确的界限来确定哪些包已经收到,这意味着在消息发送后,在接收器接口将会有一个读操作,来生成一个完整的消息。

(5)速度

TCP速度慢,UDP速度快,用用在在线视频媒体,电视广播和多人在线游戏。

(6)发送消耗

TCP是重量级;UDP是轻量级。 因为UDP传输的信息中不承担任何间接创造连接,保证了交货或秩序的信息。 这也反映在用于报头大小。

(7)报头大小

TCP头大。一个TCP数据包报头的大小是20字节;TCP包头中包含序列号,ACK号,数据偏移量,保留控制位,窗口,紧急指针,可选项,填充项,校验位,源端口和目的端口。

UDP头小。UDP数据包报头是8个字节,而UDP报头只包含长度,源端口号,目的端口和校验和。

(8)拥塞或流控制

TCP有流量控制:在任何用户数据可以被发送之前,TCP需要三数据包来设置一个套接字连接。TCP处理可靠性和拥塞控制。UDP不能进行流量控制。

(9)应用

由于TCP提供可靠交付和有序性的保证,它是最适合需要高可靠并且对传输时间要求不高的应用。

UDP是更适合的应用程序需要快速,高效的传输的应用,如游戏。

UDP是无状态的性质,在服务器端需要对大量客户端产生的少量请求进行应答的应用中是非常有用的。

在实践中,TCP被用于金融领域,如FIX协议是一种基于TCP的协议,而UDP是大量使用在游戏和娱乐场所。

(10)上层使用的协议

基于TCP协议的:Telnet,FTP以及SMTP协议。 基于UDP协议的:DHCP,DNS,SNMP,TFTP,BOOTP。

3. 说说从系统层面上,UDP如何保证尽量可靠?

(1)UDP仅提供了最基本的数据传输功能,至于传输时连接的建立和断开、传输可靠性的保证,这些UDP通通不关心,而是把这些问题抛给了UDP上层的应用程序去处理,自己仅提供传输层协议的最基本功能。

(2)最简单的方式是在应用层模仿传输层TCP的可靠性传输。下面不考虑拥塞处理,可靠UDP的简单设计。 a、添加seq/ack机制,确保数据发送到对端; b、添加发送和接收缓冲区,主要是用户超时重传 c、添加超时重传机制。

4. 说一说TCP的keepalive,以及和HTTP的keep-alive的区别

HTTP的keep-alive

在http早期,每个http请求都要求打开一个tpc socket连接,并且使用一次之后就断开这个tcp连接。使用keep-alive可以改善这种状态,即在一次TCP连接中可以持续发送多份数据而不会断开连接。通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高httpd服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。但是,keep-alive并不是免费的午餐,长时间的tcp连接容易导致系统资源无效占用。配置不当的keep-alive,有时比重复利用连接带来的损失还更大。所以,正确地设置keep-alive timeout时间非常重要。

TCP的keepalive

链接建立之后,如果应用程序或者上层协议一直不发送数据,或者隔很长时间才发送一次数据,当链接很久没有数据报文传输时如何去确定对方还在线,到底是掉线了还是确实没有数据传输,链接还需不需要保持,这种情况在TCP协议设计中是需要考虑到的。TCP协议通过一种巧妙的方式去解决这个问题,当超过一段时间之后,TCP自动发送一个数据为空的报文给对方,如果对方回应了这个报文,说明对方还在线,链接可以继续保持,如果对方没有报文返回,并且重试了多次之后则认为链接丢失,没有必要保持链接。

区别

TCP的keepalive机制和HTTP的keep-alive机制是说的完全不同的两个东西,tcp的keepalive是在ESTABLISH状态的时候,双方如何检测连接的可用行。而http的keep-alive说的是如何避免进行重复的TCP三次握手和四次挥手的环节。

5. 简述TCP协议的延迟应答和累计应答

(1)延迟应答

TCP在接收到对端的报文后,并不会立即发送ack,而是等待一段时间发送ack,以便将ack和要发送的数据一块发送。当然ack不能无限延长,否则对端会认为包超时而造成报文重传。linux采用动态调节算法来确定延时的时间。

(2)累计应答

为了保证顺序性,每一个包都有一个ID(序号),在建立连接的时候,会商定起始的ID是多少,然后按照ID一个个发送。而为了保证不丢包,对应发送的包都要进行应答,但不是一个个应答,而是会应答某个之前的ID,该模式称为累计应答

6. 说说TCP如何加速一个大文件的传输

(1)建立连接优化:TCP在建立连接时,如果丢包,会进入重试,重试时间是1s、2s、4s、8s的指数递增间隔,缩短定时器可以让TCP在丢包环境下建立连接的时间更快,非常适用于高并发短链接的业务场景。

(2)平滑发包:在RTT内均匀发包,规避微分时间内的流量冲突,尽量避免瞬间拥塞。

(3)丢包预判:有些网络的丢包是有规律性的,例如每隔一段时间出现一次丢包,例如每次丢包都连续丢几个等,如果程序能自动发现这个规律(有些不明显),就可以针对性提前多发数据,减少重传时间、提高有效发包率。

(4)RTO探测:若始终收不到 ACK 报文,则需要触发 RTO 定时器。RTO 定时器一般都时间非常长,会浪费很多等待时间,而且一旦 RTO,CWND 就会骤降(标准 TCP),因此利用 Probe 提前与 RTO 去试探,可以规避由于 ACK 报文丢失而导致的速度下降问题。

(5)带宽评估:通过单位时间内收到的 ACK 或 SACK 信息可以得知客户端有效接收速率,通过这个速率可以更合理的控制发包速度。

(6)带宽争抢:有些场景(例如合租)是大家互相挤占带宽的,假如你和室友各 1Mbps 的速度看电影,会把 2Mbps 出口占满,而如果一共有 3 个人看,则每人只能分到 1/3。若此时你的流量流量达到 2Mbps,而他俩还都是 1Mbps,则你至少仍可以分到 2/(2+1+1) * 2Mbps = 1Mbps 的 50% 的带宽,甚至更多,代价就是服务器侧的出口流量加大,增加成本。(TCP 优化的本质就是用带宽换用户体验感)

7. 服务器怎么判断客户端断开了连接

检测连接是否丢失的方法大致有两种:keepalive和heart-beat (1)(TCP内部机制)采用keepalive,它会先要求此连接一定时间没有活动(一般是几个小时),然后发出数据段,经过多次尝试后(每次尝试之间也有时间间隔),如果仍没有响应,则判断连接中断。可想而知,整个周期需要很长的时间。

(2)(应用层实现)一个简单的heart-beat实现一般测试连接是否中断采用的时间间隔都比较短,可以很快的决定连接是否中断。并且,由于是在应用层实现,因为可以自行决定当判断连接中断后应该采取的行为,而keepalive在判断连接失败后只会将连接丢弃。

8. 说说浏览器从输入URL到展现页面的全过程

1、输入地址

2、浏览器查找域名的 IP 地址

3、浏览器向 web 服务器发送一个 HTTP 请求

4、服务器的永久重定向响应

6、服务器处理请求

7、服务器返回一个 HTTP 响应

8、浏览器显示 HTML

9、浏览器发送请求获取嵌入在 HTML 中的资源(如图片、音频、视频、CSS、JS等等)

9. 简述 HTTP 和 HTTPS 的区别?

概念

HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。

HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

区别

https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

10. 说说HTTP的方法都有哪些?

GET: 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器

POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式。

PUT: 传输文件,报文主体中包含文件内容,保存到对应URI位置。

HEAD: 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。

DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件。

OPTIONS:查询相应URI支持的HTTP方法。