计算机网络面经问答

目录

1.浏览器输入url到打开网页的过程中发生了什么?

2.TCP连接三次握手的详细过程,以及最后等待2ms的原因

3.TCP和UDP的区别是什么?

4.TCP如何保证可靠传输

5.服务器的半链接队列和全链接队列是什么?

6.半链接到全链接是socket编程的哪一步?

7.半连接满了怎么操作?全连接满了怎么操作?

8.在自己开发的App中通过http协议向某网站发送“hello”,整个过程经过了那些协议,走了哪些协议?(与后文的输入一个url发生了什么事答案相同)拿到了网站的ip地址之后在自己的路由器上如何进行转发?

9.在应用程序中分别于内网和外网进行网络通信,两种通信的调用层次有什么差别

10.如何区分内网外网?

11.子网掩码在哪一层做抉择?

13.tcp,udp,ip协议的头部都有什么?它们的头部占几个字节?

14.如何修改socket中接收缓冲区大小?

15.ip数据报分片

16.说明一下慢启动机制和拥塞机制是什么?

17.网络重传过程、快速重传是谁发起的?如何判断是否要重传?

19.为什么http1.0不可以保持长连接

20.http1.0和http2.0的主要区别

21.网络传输大小端

22.发送一个http请求,服务器生成响应,怎么判断这个响应是否完整然后浏览器进行渲染?

24.怎么实现断点续传?

25.http的状态码有哪些?

27.定时检测非活跃连接的功能是怎么实现的?

29.SSL、TLS协议是什么?

30.解释一下HTTP和HTTPS协议是什么,以及HTTPS中的对称加密和非对称加密是什么?

31.三次握手过程中可以携带数据吗?

32.为什么建立连接需要三次,而释放连接需要四次?

33.解决大量TIME_WAIT问题的核心方法

34.TCP是如何保证通信的可靠呢?

35.TCP协议的长连接和短连接

36.长/短连接的应用场景

37.TCP连接数量的限制:

38.谈一谈长连接的保活机制:

       如何进行保活:

              1.TCP协议的KeepAlive机制:

2.应用层的HeartBeat机制:

39.SYN泛洪攻击:

       SYN缓解方法:

40.拥塞控制

41.滑动窗口的原理

42.什么是粘包以及粘包的原因

43.TCP和UDP使用场景


前述:本文初衷是总结本人在各大平台上看到的面经,我会在本文持续更新我所遇到的一些计算机网络问题,如有错误请一定指正我!

1.浏览器输入url到打开网页的过程中发生了什么?

①输入 URL 之后,浏览器做的第一件事情就是 DNS 域名解析。

②在经过 DNS 解析之后,浏览器已经获取了对应网站的 IP 地址,通过三次握手连接到网站服务器。

③TCP 三次握手之后,客户端和服务器端成功建立了连接,之后浏览器会向服务器特定端口发送HTTP请求。

④当一个 HTTP 请求打进服务器之后,一般的流程是:网关层(例如Ngnix)最先获取请求,然后路由转发到具体的Web服务,经过一段业务逻辑之后,可能还会查询数据库,最后将处理的结果返回给浏览器客户端。

⑤服务器端处理业务结果之后,也要返回 HTTP 响应,HTTP 响应由状态行(Status Line)、响应头部(Response Headers)、空行(Blank Line)以及响应体(Response Body)构成,关于每个部分的细节也不再赘述。

⑥当浏览器获取了域名对应的页面信息,为了避免服务器和客户端双方的资源损耗,客户端会请求断开 TCP 连接,和三次握手的过程相似,TCP 四次挥手的过程可以总结为:

⑥浏览器解析 HTML

2.TCP连接三次握手的详细过程,以及最后等待2ms的原因

       第一次握手:客户端给服务器发送一个SYN报文。

       第二次握手:服务器收到SYN报文后,会应答一个SYN+ACK报文。

       第三次握手:客户端收到SYN+ACK报文之后,会回应一个ACK报文。

       服务器收到ACK报文之后,三次握手建立完成。作用是为了确认双方的接收与发送能力是否正常。

3.TCP和UDP的区别是什么?

       TCP:传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。

       UDP:Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议。UDP为应用程序提供了一种无需连接就可以发送封装的IP数据包的方法。

区别:

TCP面向连接,通过三次握手建立连接,四次挥手解除连接;UDP是无连接的,即发送数据之前不需要建立连接,这种方式为UDP带来了高效的传输效率,但也导致无法确保数据的发送成功。

       TCP是可靠的通信方式。通过TCP连接传送的数据,TCP通过超时重传、数据校验等方式来确保数据无差错,不丢失,不重复,且按序到达;而UDP由于无需连接的原因,将会以最大速度进行传输,但不保证可靠交付,也就是会出现丢失、重复等等问题。

       TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流,由于连接的问题,当网络出现波动时,连接可能出现响应问题;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低。

每一条TCP连接只能是点到点的;而UDP不建立连接,所以可以支持一对一,一对多,多对一和多对多的交互通信,也就是可以同时接受多个人的包。

TCP需要建立连接,首部开销20字节相比8个字节的UDP显得比较大。

TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。

4.TCP如何保证可靠传输

       校验和:在数据传输的过程中,将发送的数据段当作一个16位的整数。将这些数加起来。并且前面的进位不能丢,补在后面继续相加,最后取反,得到校验和。发送方:在发送数据之前计算校验和,并进行校验和的填充。接收方:收到数据值之后,对数据以同样的方式进行计算,求出校验和,与发送方的进行比对。如果接受方比对校验和与发送方不一致,那么数据一定传输有误。但是如果接收方比对校验和与发送方一致,数据不一定传输成功。

       序列号:确认序号和序号:TCP传输时将每个字节的数据都进行了编号,这就是序列号。

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

       超时重传:发送方再发送完数据之后等待一个时间,时间到达没有接收到ACK报文,那么对刚才发送的数据进行重新发送,这个等待时间是动态计算的,一般500ms为一个单位进行控制。重发一次之后,仍未响应,那么等待2*500ms的时间后,再次重传。等待4*500ms的时间继续重传。以一个指数级的形式增长。累积到一定的重传次数,TCP就认为网络或者对端出现异常,强制关闭连接。

       连接管理:三次握手,四次挥手。

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

       滑动窗口:实际上是接送端接收数据的缓冲区的还剩多少。接收端会在确认应答发送ACK报文时,将自己的及时窗口大小填入,并跟随ACK报文一起发送过去。而发送方根据ACK报文里的窗口大小的值的改变进而改变自己的发送速度。如果接收到的窗口大小为0,那么发送方将会停止发送数据。并定期的向接收端发送数据窗口探测数据段,让接收端把窗口大小反馈发送端。

       拥塞控制:TCP引入了慢启动的机制,在开始发送数据时,先发送少量的数据探路。探清当前的网络状态如何,再决定多大的速度进行传输。这时候就引入一个叫做拥塞窗口的概念。

       延迟应答:如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小。可以再稍微等一会儿再进行应答(规定等待时间之内),因为处理端口对缓存区的处理速度可能很快,10ms之内就把刚收到的数据从缓冲区消费掉了,这样的延迟应答返回的窗口可能会很大。

5.服务器的半链接队列和全链接队列是什么?

       半链接队列:服务器第一次收到客户端的SYN之后,就会处于SYN_RCVD状态,此时双方还没有完全建立连接,服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称之为半链接队列。

       全链接队列:就是已经完成三次握手,建立起连接的就会放在全链接队列中,如果队列满了就有可能会出现丢包现象。

       补充:关于SYN-ACK重传次数的问题:服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同,一般会是指数增长,例如间隔时间为1s、2s、3s….

6.半链接到全链接是socket编程的哪一步?

       在进行到服务器调用listen函数监听端口的时候,内核会为每个监听的socket创建两个队列:半连接队列(syn queue,当客户端发送SYN包,服务端收到后回复SYN+ACK后,服务端进入SYN_RECV状态,这个时候的socket会放到半连接队列),然后当服务端收到客户端的ACK后,此时socket会从半连接队列移出到全连接队列。

7.半连接满了怎么操作?全连接满了怎么操作?

       半连接:根据不同情况,对连接可能有不同的处理方式,可能是丢弃,也可能是发送reset包。

       分为以下情况:

              1.如果半连接队列满了,并且没有开启tcp_syncookies,则会丢弃

              2.若全连接队列也满了,且没有重传SYN+ACK包的连接请求多余1个,则会丢弃

              3.如果没有开启tcp_syncookies,并且max_syn_backlog减去当前半连接队列长度小于(max_syn_backlog/4),则会丢弃

       全连接:当全连接满了,Linux默认是丢弃连接,还可以通过/proc/sys/net/ipv4/tcp_abort_on_overflow值来控制。

       分为以下情况:

              1.若为0,则丢弃连接(默认)

              2.若为1,则server发送一个reset包给client

8.在自己开发的App中通过http协议向某网站发送“hello”,整个过程经过了那些协议,走了哪些协议?(与后文的输入一个url发生了什么事答案相同)拿到了网站的ip地址之后在自己的路由器上如何进行转发?

       以PC1发送到PC2的流程为例

       1.PC1将报文发往网关设备R1

       2.R1查找路由表项,确定转发的下一跳、出接口,之后将报文转发给R2(网关设备)

       3.R2通过查找路由表项转发给R3

       4.R3收到后查找路由表项,发现IP报文的目的地址属于本地接口所在网段,则直接本地转发,最终该报文被发往目的主机PC2

9.在应用程序中分别于内网和外网进行网络通信,两种通信的调用层次有什么差别

       内网间通信:是指在一个局域网内的设备之间进行的通信。局域网是一个受限的网络,通常由路由器或交换机连接起来。在内网通信中,设备可以直接通过局域网上的IP地址相互通信,而无需经过互联网。因此,内网通信的调用层次较低,涉及的网络协议较少。
通常,在内网通信中,设备可以使用局域网内的IP地址(例如,192.168.x.x或10.x.x.x)进行通信。这样的通信属于本地网络,数据传输更快,并且不需要经过特殊的网络设备或互联网上的路由器。在内网通信中,常见的通信协议包括以太网协议(Ethernet)、局域网协议(LAN)、本地区域网协议(LAN protocols)、ARP(Address Resolution Protocol)等。
       外网间通信:是指在互联网上不同的网络之间进行的通信。互联网是由各种网络和网络设备组成的全球广域网。与内网不同,外网通信需要经过互联网连接的设备,例如路由器、防火墙和互联网服务提供商(ISP)。在外网通信中,数据需要使用全球唯一的公共IP地址进行传输,以便在不同网络之间进行识别和路由。因此,在外网通信中,涉及的网络协议较多,包括传输层协议(如TCP或UDP)、网络层协议(如IP)、路由协议(如BGP或OSPF)等。
外网通信涉及的调用层次较高,需要遵循严格的规范和协议,以确保数据在不同网络之间的正确传输和交换。此外,由于外网通信涉及到互联网上的多个设备和网络,数据传输速度可能会受到延迟和拥塞等因素的影响。在外网通信中,常见的通信协议包括互联网协议(IP)、传输控制协议(TCP)、用户数据报协议(UDP)、超文本传输协议(HTTP)等。

10.如何区分内网外网?

       内网和外网之间的区分主要通过网络地址和网络地址和网络连接方式来实现的。

       区分方法:

              1.IP地址范围:内网和外网使用不同的IP地址范围。常见的内网IP地址范围(例如,192.168.x.x至172.31.x.x)。这些IP地址在公共互联网上是唯一的,而外网通信使用公网IP地址范围,由互联网寻址和分配机构分配。

              2.网络拓扑和连接方式:内网通常是指在一个局域网范围内的设备互联,通过交换机或路由器相连。这种局域网内的设备可以互相通信,而无需经过互联网。与此相对,外网是指的是设备在互联网上的连接。设备需要通过路由器或防火墙等设备,通过互联网服务商(ISP,网络服务提供商)连接到公共联网。

              3.访问权限和安全设置:在一般情况下,访问内网资源需要在局域网内部或通过虚拟专用网络(VPN)等机制进行身份验证和授权。而外网资源通常是公开可访问的,并可以通过公共互联网直接访问的。

              4.网络配置和管理:内网和外网的网络配置和管理方式也有所区别。内网通常由组织或个人进行管理和配置,可以根据自身需求设置网络规则和安全策略。外网则需要与互联网服务提供商合作,获取公共IP地址和网络连接,并遵守互联网规范和安全标准。

11.子网掩码在哪一层做抉择?

       在网络层中进行决策。

//12.TCP和UDP的优缺点是什么?

13.tcp,udp,ip协议的头部都有什么?它们的头部占几个字节?

       TCP:固定首部占20字节。其内部含有:源端口号(16位),目的端口号(16位),TCP序列号(32位),TCP确认号(32位),首部长度(4位),保留位(6位),URG(1位),ACK(1位),PSH(1位),PST(1位),SYN(1位),FIN(1位),窗口指针(16位),校验和(16位),紧急指针(16位)。

       UDP:每个UDP报文分为UDP报头和UDP数据区两部分组成。报头由4个16位长(2字节)字段组成,分别说明该报文的源端口、目的端口、报文长度和校验值。源端口(16位),目的端口(16位),长度(16位),校验值(16位)

       IP:由20字节构成。版本(4位),首部长度(4位),区分服务(8位),总长度(16位),标识(16位),标志(3位),片位移(13位),生存时间(8位),协议(8位),首部校验和(16位),源地址(32位),目的地址(32位)

14.如何修改socket中接收缓冲区大小?

       每个socket在Linux中都映射为一个文件,并于内核中的两个缓冲区(读、写缓冲区)相关联。

       1.系统设置:cat /proc/sys/net/core/xxxxxx 修改相关的数据rmem_max一个缓冲区可由程序设置的最大值,wmem_max一个socket的写缓冲区可由程序设置的最大值,rmem_default一个socket的创建出来时,默认的读缓冲区大小,wmem_default一个socket被创建出来时默认的写缓冲区大小。

       2.应用程序级修改缓冲区大小:在程序中动态的修改(通过调用setsockopt系统调用)持有的有效socket的读写缓冲区大小。但是代码级的修改缓冲区大小不是万能的,其受限于系统配置,我们可以通过修改系统运行时的配置(/proc),来动态地“释放权限”,让应用程序可以设置更大的内核读写缓冲区。

       3.系统配置级修改程序大小:/proc/sys/net/core/rmem_default或/rmem_max,因为setsocketopt系统调用级设置受限于系统运行时配置,可以通过修改系统配置,使得程序设置更大的读写缓冲区。注意:1.当系统关机重启时,对/proc的修改是否依然存在?是存在的,如果服务器由于异常宕机,重启后失去了原有的设置,就有可能导致接收区缓冲区较小,出现丢包的可能。为什么我通过setsocketopt设置读缓冲区值为RcvBufSize,但实际getsocketopt获取的缓冲区大小是2*rcvBufSize?这是和实现源码有关的(可能是和UDP解包和封包需要额外空间)

15.ip数据报分片

       需要根据首部的标识,标志,片位移进行相应的处理。

       标识:同一个IP数据报的分片,使用相同的标识,当IP数据报大小超过MTU时,将数据报分片,分片完成时的IP数据报分片,其标识都是相同的

       标志:由三位组成[48 , 50]只有2位有意义,最高位是保留位没有意义,中间位:DF位当其为1时禁止分片,为0允许分片。最低位:MF位,MF=1时,表示后面还有分片,为0时表示本分片是分组的最后一个分片,后面没有分片只有DF=0时,MF才有意义。

       片位移:较长的分组的分片,中间的某个分片,在原来的IP分组中的相对位置,单位是8字节,也就说除了最后一个分片,每个分片的长度是8字节的整数倍。

16.说明一下慢启动机制和拥塞机制是什么?

       慢启动算法是通过观察新分组进入网络的速率应该要与另一端返回确认的速率相同而进行工作。慢启动为发送方的TCP增加了另一个窗口:拥塞窗口。

       拥塞避免算法是假定由于分组受到损坏引起的丢失时非常少的(远小于1%),因此分组丢失意味着在源主机和目的主机之间的某处网络上发生了拥塞。拥塞表现为两种形式:发送报文后定时器发生超时没有收到ACK,另一个收到了重复的ACK确认。

17.网络重传过程、快速重传是谁发起的?如何判断是否要重传?

       超时重传:重传机制会设定一个定时器,当超过指定的时间后,没有收到对方的ACK确认应答报文,就会重发该数据,这就是超时重传。

       超时重传时间RTO:在超时重传的过程中,超时时间RTO过长或过短时,会发生什么?当它过大时,重发就会慢,没有效率性能差。如果过短,会导致可能并没有丢就重发,于是重发的就快,会增加网络拥塞,导致更多的超时,更多的超时导致更多的重发。

       快速重传:接收者如果接收到一个乱序的分组的话,就返回对前一个正确分组的确认应答,当发送方连续收到三个冗余ACK,就会马上快速重传丢失数据,不会等待到超时时间再重传。所以快速重传是由发送方发起的。与超时重传对比:超时重传缺点是太慢了,RTO的值不好把握,快速重传虽然解决了超时重传慢的缺点,但是多发了好几个ACK会导致网络更加拥塞。

//18.http如何保持长链接?

19.为什么http1.0不可以保持长连接

       在http1.0中每个请求和响应都需要建立一个完整的TCP连接。一旦服务器发送完响应并关闭连接,客户端和服务器之间的连接就会中断,而在这种模式下,额外的建立和关闭连接会带来额外的开销,每次建立和关闭TCP连接都需要进行TCP的三次握手和四次挥手,这会带来网络延迟和资源消耗。服务器负担重,在处理大量并发请求时,需要消耗更多系统资源。http是无状态协议,服务器不会记录之前的请求信息,每个请求都需要重新传输访问认证消息、Cookie等。所以

20.http1.0和http2.0的主要区别

       http1.0:浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接。

       http2.0:采用二进制格式而非文本格式,完全采用多路复用,而非有序并阻塞的,只需一个连接即可实现并行,使用了报头压缩,降低开销,引入了服务器推送。

21.网络传输大小端

       大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,地址由小向大增加,而数据从高位往低位放。

       小端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,高地址部分权值高,低地址部分权值低,和我们日常逻辑一致。

       在我们的网络字节传输上,TCP/IP协议规定了必须使用网络字节顺序(大端模式),而在大多数的PC机上采用的是小端模式。所以我们先要进行大小端转换后再使用。

22.发送一个http请求,服务器生成响应,怎么判断这个响应是否完整然后浏览器进行渲染?

       浏览器在接收到响应数据流,并根据content-length表示响应数据的响应大小,浏览器会使用缓冲区接收响应数据,并开始持续检查数据流的大小,并于content-length进行比较,如果接收到的数据大小等于content-length,浏览器则认为响应已完整接收。

23.七层网络参考模型

OSI七层模型及TCP/IP四层模型_txinyu的博客的博客-CSDN博客

24.怎么实现断点续传?

       断点续传是指在进行上传或下载的时候,如果遇到网络故障,可以从已经上传或下载的部分开始继续上传下载未完成的部分,而没有必要从头开始上传下载,可以节省时间,提高速度。它是由服务器给客户端一个已经上传的位置标记position,然后客户端再将文件指针移动到相应的postion,通过输入流将文件剩余部分读出来传输给服务器,直到传输完毕来实现的。

25.http的状态码有哪些?

       1xx:信息性状态码

       2xx:成功状态码

       3xx:重定向状态码

       4xx:客户端错误状态码

       5xx:服务器端错误状态码

       2开头:(请求成功)表示成功处理了请求的状态代码。

200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。

201 (已创建) 请求成功并且服务器创建了新的资源。

202 (已接受) 服务器已接受请求,但尚未处理。

203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。

204 (无内容) 服务器成功处理了请求,但没有返回任何内容。

205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。

206 (部分内容) 服务器成功处理了部分 GET 请求。

       3开头:(请求被重定向)表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。

300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。

301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。

302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。

304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。

305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。

307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

       4开头:(请求错误)这些状态代码表示请求可能出错,妨碍了服务器的处理。

400 (错误请求) 服务器不理解请求的语法。

401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。

403 (禁止) 服务器拒绝请求。

404 (未找到) 服务器找不到请求的网页。

405 (方法禁用) 禁用请求中指定的方法。

406 (不接受) 无法使用请求的内容特性响应请求的网页。

407 (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。

408 (请求超时) 服务器等候请求时发生超时。

409 (冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。

410 (已删除) 如果请求的资源已永久删除,服务器就会返回此响应。

411 (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。

412 (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。

413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。

414 (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。

415 (不支持的媒体类型) 请求的格式不受请求页面的支持。

416 (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。

417 (未满足期望值) 服务器未满足"期望"请求标头字段的要求。

       5开头:(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。

500 (服务器内部错误) 服务器遇到错误,无法完成请求。

501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。

502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。

503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。

504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。

505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。

//26.UDP的适用场景有哪些?

27.定时检测非活跃连接的功能是怎么实现的?

       心跳机制:是指周期性的发送小型数据包,用于确认连接的活跃性。服务器和客户端可以相互发送心跳包,以表示其仍处于活跃状态。如果一段时间内没有收到心跳活跃包就可以判断连接是否已经非活跃。

       超时机制:服务器可以记录每个连接的建立时间,并设置一个超时阈值。定时器可以周期性的检查连接的建立时间和当前时间的差值,如果超过预定的超时时间,就可以判断连接是否为非活跃连接。

       快速检测机制:服务器可以定期发送小型数据包或探测请求到客户端,以确认连接是否活跃。客户端接收到这些请求后,可以立即回复,表示连接仍然活跃。

       操作系统提供的机制:操作系统提供了一些套接字的选项或API,用于检测和管理非活跃连接(例如:TCP协议中的TCP-keep-alive)

29.SSL、TLS协议是什么?

SSL(secure socket layer,安全套接字层):位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。通过互相认证、使用数字签名确保完整性、使用加密确保私密性以实现客户端和服务器之间的安全通信。它分为两层:SSL记录协议:它建立在可靠的传输协议之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议:它建立在SSL记录协议之上,用于在实际的数据传输开始前,通信双方进行安全验证。

TLS(安全层传输协议):用于在两个通信应用程序之间提供保密性和数据完整性。也由两层协议组成:TLS记录协议和TLS握手协议

它们之间的关系:TLS是SSL3.0的后续版本,在TLS与SSL3.0之间存在着显著的差别,主要是支持的加密算法不同,所以SSL与TLS不能互操作

功能:在互联网上传输加密过的资料以达到防窥取的目的。保持传送路途中资料的完整性。

30.解释一下HTTP和HTTPS协议是什么,以及HTTPS中的对称加密和非对称加密是什么?

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

HTTPS:是以安全为目标的HTTP通道,简单来说就是HTTP的安全版,加入了SSL层,主要用于建立一个安全的信息通道来保证数据传输的安全或者是确认网站的真实性。

对称加密:双方使用同一个密钥对数据进行加密和解密。

非对称加密:有两个密钥,一个是公钥一格私钥,用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据只有对应的私钥才能解密。

区别:https协议需要申请到ca证书,一般免费证书较少,因此需要一定费用。http是明文传输,https则是具有安全性的ssl加密传输协议。连接方式不同,用的端口也不同,http(80),https(443)。http的连接很简单是无状态的4

31.三次握手过程中可以携带数据吗?

       可以携带数据的。也就是说第1,2次握手不可以携带数据,而第三次握手是可以携带数据的。假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都要在第一次握手中的SYN报文中放入大量的数据,因为攻击者根本不管服务器的接收、发送能力是否正常,然后疯狂重复发SYN报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。也就是说,第一次握手可以放数据的话,其中一个简单的原因就是会让服务器更加容易受到攻击了。而对于第三次的话,此时客户端已经处于established状态,也就是说,对于客户端来说,它已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据页也没有什么问题。

32.为什么建立连接需要三次,而释放连接需要四次?

       TCP建立连接要进行三次握手,而断开连接要进行四次,这是由于TCP的半关闭造成的,因为TCP连接是全双工的(即数据可以在两个方向上同时传递)所以进行关闭时每个方向上都要单独进行关闭,这个单方向的关闭就叫半关闭。关闭的方法是一方完成它的数据传输后,就发送一个FIN来向另一方通告要终止这个方向的连接,当一端收到一个FIN,它必须通知应用层TCP连接已终止了这个方向的数据传送,发送FIN通常是应用层进行关闭的结果。

       这是因为服务器端的LISTEN状态下的SOCKET当收到SYN报文的连接请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅代表对方没有数据发送给你了,但未必你所有的数据都全部发送给对方了,所以你可以未必会马上关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

33.解决大量TIME_WAIT问题的核心方法

       在Linux系统中,通过开启TCP时间戳功能,可以避免TIME_WAIT状态的累积。可以通过修改/etc/sysctl.conf文件,并添加如下配置来开启TCP时间戳:net.ipv4.tcp_timestamps=1。然后执行sysctl -p命令使配置生效。

       开启TCP连接复用:TCP连接复用是指在TIME_WAIT状态下的连接被关闭后,将其端口重新分配给新的连接,而不必等待TIME_WAIT状态结束。这样就可以有效减少TIME_WAIT状态的数量。可以通过修改/etc/sysctl.conf文件,并添加如下配置来开启TCP连接复用:net.ipv4.tcp_tw_reuse=1,并执行sysctl -p使命令生效。

       调整本地端口范围:本地端口范围是指用于分配本地端口的范围。如果本地端口范围设置的太小,可能会导致端口耗尽和TIME_WAIT状态的增加。可以通过修改/etc/sysctl/conf文件,并添加如下配置来扩大本地端口配置:net.ipv4.ip_local_port_range=1024 65535,然后执行sysctl -p命令来使配置生效。

       注意:以上方法仅适用于解决普通的TIME_WAIT问题。在某些特殊情况下,开启net.ipv4.tcp_tw_recycle选项会导致问题,因此,不建议开启net.ipv4.tcp_tw_recycle选项。

34.TCP是如何保证通信的可靠呢?

       1.数据分片:在发送端对用户数据进行分片,在接收端进行重组,由TCP确定分片的大小并控制分片和重组。

       2.到达确认:接收端接收到分片数据时,根据分片数据序号向发送端发送一个确认包。

       3.超时重发:发送方在发送分片后计时,若超时却没有收到相应的确认包,将会重发对应的分片。

       4.滑动窗口:TCP连接双方的接收缓冲空间的大小都固定,接收端只能接受缓冲区能接纳的数据。

       5.失序处理:TCP的接收端需要重新排序接收到的数据。

       6.重复处理:如果传输的TCP分片出现重复,TCP的接收端需要丢弃重复的数据。

       7.数据校验:TCP通过保持它首部和数据的校验和来检测数据在传输过程中任何变化。

35.TCP协议的长连接和短连接

       短连接的操作过程:建立连接-》传输数据-》关闭连接

       长连接的操作过程:建立连接-》传输数据-》….(保持连接)…-》传输数据-》关闭连接

       优缺点:

              短连接: 优点:管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段。缺点:由于TCP的建立和关闭操作需要一定的系统开销,如果客户端连接请求频繁,会降低服务器的处理速度、浪费系统资源和带宽。

              长连接:优点:长连接可以省去较少的TCP连接的建立和关闭的操作,减少浪费,节约时间。缺点:client与server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端的连接越来越多,服务器的负载压力会增大,降低服务器的整体性能,更严重者,可能会导致服务器崩溃;其次,如果大量处于连接状态的TCP通信双方长时间没有进行数据传输,这也会导致浪费系统和网络资源。

36.长/短连接的应用场景

       长连接:一般用于需要频繁进行读写操作,点对点通讯,而且连接数不太多的情况。例如,数据库的连接通常使用长连接,如果用短连接的话,频繁的TCP socket创建和关闭,会造成socket错误,也是对资源的一种浪费。

       短连接:一般用于不需要频繁进行读写操作,并且连接数很大的情况下。例如,web网站的http服务一般都用于短连接。因为长连接对于服务器来说是要耗费一定的系统资源的,像web网站服务,通常会有大量的客户端连接请求,并发连接量大,使用短连接会更节省系统资源,能够及时响应客户请求。

37.TCP连接数量的限制:

       1.本地操作系统的连接数量限制:每个操作系统都有一个默认的最大连接数量限制,这个限制可以通过修改系统的内核参数来提高。

       2.网络设备的连接数量限制:每个网络设备(如路由器、交换机)都有一个最大连接数量的限制,这个限制受到设备的硬件能力和软件限制的影响。

       3.网络带宽的限制:如果网络宽带不够,就会导致连接数量受限。

       4.应用程序自身的连接数量限制:有些应用程序会设置一个最大连接数量的限制,这个限制可以通过修改应用程序的配置文件来提高。

38.谈一谈长连接的保活机制:

       对于TCP长连接,当通信双方在没有数据传输的时候,如何保持TCP连接一直处于“保活(KeepAlive)状态” ,这是一个必须要解决的问题。在Linux系统中,我们可以使用netstat、lost等命令可以查看TCP连接是否处于“ESTABLISHED”状态。

       必要性:1.很多防火墙会主动关闭空闲的socket。2.可能出现的非正常断连,服务器并不能检测到,为了回收已断连的socket资源,必须提供一种检测机制。

       导致TCP非正常断连的可能原因:1.网络故障。2.客户端/服务端一侧突然断电或者进程崩溃。

       如何进行保活:

              1.应用层的心跳机制:在应用层中使用心跳机制来主动检测。具体做法是:当TCP连接建立成功后,客户端开启一个定时任务,定时对已经建立连接的对端发送一个心跳请求信息,服务器收到该心跳消息后,返回一个心跳应答消息。如果在超时时间内没有收到服务器的应答消息,则重发心跳请求消息,如果客户端持续多次没有响应,客户端则认为该TCP连接不可用,主动断开连接。当然,也可以是服务器端主动发送心跳请求消息给客户端。

              2.TCP协议自带的保活机制:Linux内核自带的保活机制keep-alive。使用的时候只需要打开keep-alive功能即可。

       两种保活机制的优缺点:

              1.TCP协议的KeepAlive机制:

                     优点:TCP协议的KeepAlive机制由系统内核实现,上层应用程序只需要处理数据的收发,连接异常通知即可,这就减少了应用层代码的复杂度,内核层面的计时器相比应用层,更为高效。

                     缺点:1.位于传输层,由操作系统负责,只能检测到连接是否存活,但不能检测连接是否可用。例如,服务器因为某种原因导致负载超高,CPU使用率达到了100%,无法继续响应任何业务请求,但是TCP探针却仍能缺点连接状态,这就是典型的连接或者但是服务已死的状态。对于客户端而言,这时是最好的选择就是断开连接重新连接到其他服务器上,而不是认为当前服务器处于可用状态,一直向当前服务器发送那些必然会失败的请求。

2.此机制对于连接异常断开的情况下不能及时有效地检测到。如果TCP连接的某一方突然异常断开连接,这个时候发送方并不知道对端已经掉线。而此时,如果有数据发送失败,TCP会自动进行超时重传,而重传报文段的优先级是要高于KeepAlive的探测报文段的,导致探测报文段总是不能发送过去,直到经过较长时间的重传之后,我们才之后。

             

2.应用层的HeartBeat机制:

优点:1.具有更好的灵活可控性。可以探测心跳的检测时机、间隔和流程,甚至可以在心跳包上附带额外信息,最重要的是不光可以检测连接是否存在,还可以检测到连接是否可用,而TCP的KeepAlive机制只能提供简单的检活功能。2.具有通用性。应用层的心跳不依赖于传输层协议,如果有一天不用TCP要改用UDP了。,传输层不提供心跳极致了,但是你应用层的心跳机制依然可以使用,只需做少量改动就可以继续使用。

缺点:1.需要开发人员自己实现, 增加软件开发的工作量,由于应用特定的网络框架,还可能增加代码结构的复杂度。2.应用层心跳的流量消耗会更大,毕竟这本质上还是一个普通的数据包。

39.SYN泛洪攻击:

       SYN泛洪攻击是指攻击者向目标服务器上的每个端口重复发送SYN数据包,通常使用伪造的IP地址。服务器不知道受到攻击,收到多个看似合法的请求以建立通信。它使用来自每个开放端口的SYN-ACK数据包响应每次尝试。恶意客户端要么不发送预期的ACK,要么(如果IP地址被欺骗)从一开始就不会受到SYN-ACK。无论哪种方式,受到攻击的服务器都会等待一段时间来等待对其SYN-ACK数据包的确认。在此期间,服务器无法通过发送RST数据包关闭连接,连接保持打开状态。在连接超时之前,另一个SYN数据包将到达。这导致越来越多的连接处于半开状态—事实上,SYN泛洪攻击也被称为“半开攻击”。最终,当服务器的连接溢出表时,对合法客户端的服务将会被拒绝,服务器甚至可能出现故障或崩溃。

       SYN缓解方法:

              微块:管理员可以在服务器内存中为每个传入的SYN请求分配一个微记录(少至16字节),而不是一个完整的对象。

              SYN cookies:使用加密哈希,服务器发送其SYN-ACK响应,其中包含一个序列号(seqno),该序列号由客户端生成一个RST数据包,告诉服务器出了什么问题。如果收到,服务器知道是合法的,记录客户端,并接受来自它的后续传入连接。

              RST cookies:对于给定客户端的第一个请求,服务器故意发送无效的SYN-ACK。这应该会导致客户端生成一个RST数据包,告诉服务器出了什么问题。如果收到,服务器知道请求是合法的,记录客户端,并接受来自它的后续传入连接。

              栈堆调整:管理员可以调整TCP堆栈以减轻TCP堆栈以减轻SYN泛洪的影响。这可能涉及减少超时,直到堆栈释放分配给连接的内存,或者有选择地丢弃传入连接。

             

40.拥塞控制

       拥塞现象:当网络的吞吐量达到一定的限制后,会发生拥塞现象,那么此时发送的数据包会因为延迟无法到达接收端,因为超时重传机制所以发送端会重新发送数据包,那么网络带宽中本来就很拥塞,再发数据包就会更加拥塞,由此会形成恶性循环,如果不加控制的话,那么最终网络的有效吞吐量将接近为0.

       拥塞控制的代价:需要获得网络内部流量分布的消息。在实施拥塞控制之前,还需要在节点之间交换信息和各种命令,以便选择控制的策略和实施控制。这样就产生了额外开销。拥塞控制还需要将一些资源分配给各个用户单独使用,使得网络资源不能更好地实现共享。有四种算法分别是:慢开始,拥塞避免,快重传,快恢复。

41.滑动窗口的原理

       TCP是全双工通信方式,因此每一方的滑动窗口都包括了接收窗口+发送窗口,接收窗口负责处理自己接收到的数据,发送窗口负责处理自己要发出去的数据。滑动窗口的本质其实是维护几个变量,通过这些变量将TCP处理的数据分为几类,同时再发送出一个报文,接收一个报文对这些变量做一定的处理维护。

42.什么是粘包以及粘包的原因

       粘包:多个数据包被连续存储在连续的缓存中,在对数据包进行读取时由于无法确定发送方的发送边界,而采用某一估测值大小来进行数据读出,若双方的大小不一致时就会使发送方发送的若干数据到接收方接收时沾成一个包,从接收缓冲区看,后一包数据的头紧接着前一包的数据的尾。例如:发送方发送了两个数据,接收方一次收了一个半数据(接收方可能不清楚一个包有多大),出现粘包的问题是多方面的,它既可能由发送方造成,也能由接收方造成。

       造成原因:发送方引起的粘包是由TCP协议本身造成的。

              1.TCP为了提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。

              2.TCP规定有MSS,如果数据包过长就会被分开传输。这样接收方就收到了粘包数据。

       接收方引起的粘包问题:是由于接受用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据。

在代码中体现:要发送的数据大于TCP缓冲区剩余空间大小,将会发生拆包。要发送的数据大于MSS,TCP在传输前将进行拆包。要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送过去,将会发生粘包。接收数据端的应用层没有即使读取接收缓冲区中的数据,将发生粘包。

       处理方式:

              1.发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。

              2.发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收段每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。

              3.可以在数据包之间设置边界,如添加特殊符号。这样接收端通过这个边界就可以将不同的数据包拆分开来。

43.TCP和UDP使用场景

       UDP使用场景:UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务,随时都可以发送数据,处理简单且高效。因此主要使用在以下场景:包总量较小的通信(DNS,SNMP协议),视频、音频等多媒体通信(即时通信),QQ就是使用的UDP协议,广播通信…等一系列追求速度的场景。

       TCP使用场景:相对于UDP,TCP实现了数据传输过程中的各种控制,可以进行丢包时的重发机制,还可以对次序乱掉的分包进行顺序控制。在对可靠性要求较高的情况下,可以使用TCP,即不考虑UDP时,都可以选择TCP。尤其是需要可靠连接,比如付费、加密数据等等方向都需要依靠TCP。

猜你喜欢

转载自blog.csdn.net/songbijian/article/details/132634919