# 计算机网络
# 1.TCP/IP,OSI 网络模型有哪几层
答案
TCP/IP包括4层,应用层,传输层,网络层,网络接口层。OSI网络模型包括7层物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
应用层负责通过网络接口直接为用户提供服务
应用层包括HTTP,DNS,FTP,SMTP,DHCP
HTTP常用于web浏览器和服务端传输数据,基于TCP实现
DNS常用于域名解析IP地址,当数据大小超过512字节时采用TCP协议,否则采用UDP协议
FTP通常用于主机之间传输文件,基于TCP实现
SMTP通常用于邮件发送,SMTP没有权限验证并且是明文传输,而ESMTP支持权限验证和加密传输,基于TCP实现
DHCP协议通常用于动态分配ip地址,基于UDP实现
表示层负责数据处理(编码解码,加密解密,压缩解压缩)
会话层负责管理应用程序之间的会话
传输层负责进程之间的通信服务,即实现复用连接(虚电路)和分用(分发给不同的进程),差错控制,流量控制,连接建立和释放,可靠传输管理(以报文段为单位)
网络层负责把分组从源节点转发到目的节点,即实现路由选择,分组转发,拥塞控制,网际互联,差错控制,流量控制(以分组为单位),连接建立和释放(虚电路),可靠传输管理(接收方收到分组需要返回确认消息)
网络接口层是数据链路层和物理层的合并
数据链路层负责确保相邻节点之间的链路逻辑上无差错,即实现差错控制和流量控制(以帧为单位)
物理层负责在相邻节点传输透明比特流
# 2.网络分层的原因
答案
1.各层之间相互独立:各层之间相互独立,各层之间不需要关心其他层是如何实现的,只需要知道自己如何调用下层提供好的功能就可以了
2.提高了整体灵活性:每一层都可以使用最适合的技术来实现,你只需要保证你提供的功能以及暴露的接口的规则没有改变就行了。
3.分层可以将复杂的网络问题分解为许多比较小的、界线比较清晰简单的小问题来处理和解决。这样使得复杂的计算机网络系统变得易于设计,实现和标准化。
# 3.从输入 URL 到页面展示到底发生了什么?
答案
首先会先解析URL,然后根据域名通过DNS解析协议解析出IP地址,DNS解析会先发送给本地域名服务器,本地域名服务器会查看本地的缓存列表,如果没有就向根域名服务器发起DNS解析请求,根域名服务器不负责解析,根域名服务器会告诉本地域名服务器负责该域名的顶级域名服务器的IP地址,然后本地域名服务器向该顶级域名服务器发起DNS解析请求,顶级域名服务器会告诉本地域名服务器负责该域名的权威域名服务器的地址,然后本地域名服务器会向该权威域名服务器发起DNS解析请求,权威域名服务器会告诉本地域名服务器该域名的IP地址。拿到该IP地址后,封装成HTTP请求报文,交付给传输层,到了传输层后,要先三次握手建立连接,建立好连接后,会加上TCP首部然后交付给网络层,网络层根据分组转发和确定分组从源到目的经过的路径,然后添加上IP首部,交付给网络接口层,网络接口层要确定数据报要发给谁,需要通过ARP协议获取目标服务器的MAC地址,ARP协议会在以太网中广播,请求获取下一步要发给的MAC地址,获取到后,将对应的MAC地址缓存下来,然后给数据报添加帧头和帧尾,然后通过网卡,交换机,路由器最终到达目标服务器
# 4.HTTP是什么?
答案
超文本传输协议
# 5.HTTP常见状态码
答案
200请求成功一切正常,响应头包含body数据,204也是请求成功,但响应头没有body数据,206用于HTTP分块下载或断点续传,表示响应返回的body数据并不是资源的全部,而是其中的一部分
301表示永久重定向,表明请求的资源已经不存在了,302表示临时重定向,请求的资源还在,但暂时需要使用另外的url来访问,304表示资源未修改,用于告诉客户端可以继续使用缓存资源
400表示客户端请求的报文有误,401表示服务器鉴权失败,403表示权限不足,禁止访问,404表示请求的资源在服务器不存在或未找到
500表示服务器内部错误,501表示客户端请求的功能还不支持,502表示网关错误,503表示服务器正忙,无法响应客户端
# 6.GET 和 POST 有什么区别?
答案
1.用途不同:Get是用来从服务器上获得数据,而 Post是用来向服务器上传递数据。
2.Get是不安全的,因为Get会将请求参数放在URL中,而Post则不会
3.Get能够传输的数据量,因为Get会受到url长度的限制,而Post则不会
4.Get能被缓存而Post则不能被缓存
5.Post首部字段更多,所以Post会更慢
# 7.HTTP 和 HTTPS 有什么区别?
答案
1.HTTP是明文传输,HTTPS则在TCP和HTTP网络层之间加入了SSL/TLS安全协议,使得报文能够加密传输
2.默认端口不同,HTTP默认端口是80,HTTPS默认端口是443
3.HTTP连接建立更加简单,HTTPS还需要进行SSL/TLS握手,才能进行加密传输
# 8.HTTP1.0和HTTP1.1的区别
答案
1.HTTP1.0为短连接,HTTP1.1支持长连接
2.HTTP1.1增加了大量的状态响应码
3.HTTP1.1引入了更多的缓存控制策略,提供了更多可选择的缓存头
4.HTTP1.1支持管道网络传输,只要第一个请求发送出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间
# 9.HTTP1.1的缺陷
答案
1.发送冗长的首部。每次互相发送相同的首部造成的浪费较多
2.服务器是按请求的顺序发送响应的,如果服务器响应慢,会导致客户端一直请求不到数据,即可后面的请求已经处理好了,也无法发出响应,也就是队头阻塞
3.请求只能从客户端开始,服务器只能被动响应
# 10.HTTP2.0和HTTP1.1的区别
答案
1.HTTP2.0采用了头部压缩,对于头部中相同的部分使用一个索引号代替,使用HPACK算法维护了一张头信息表
2.HTTP2.0不再采用纯文本的形式,而是采用二进制的形式,增加了传输效率
3.HTTP2.0引入了stream的概念,一个TCP连接包含多个stream,一个stream包含一个或多个Message,一个Message包含一个或多个Frame,Fream是HTTP2.0的最小单位,不同stream可以乱序发送
4.HTTP2.0改善了请求-响应模式,客户端和服务器都可以建立stream,服务器可以给客户端推送数据
# 11.HTTP2.0的缺陷
答案
1.HTTP2.0虽然采用了stream模式,但是还是存在队头阻塞,因为stream是基于TCP的,后面的stream即使到达了,应用层也无法读取,需要按序读取stream
# 12.HTTP3.0和HTTP2.0的区别
答案
1.HTTP3.0实现了无队头阻塞,当某个流发生丢包时,只会阻塞这个流,其他流不会受影响
2.HTTP3.0采用了QUIC协议,能够更快的建立连接,握手过程只需要1个RTT
3.HTTP3.0实现了连接迁移,因为QUIC采用的并不是四元组来确定一条连接,而是通过连接ID来标记通信的两个端点,即使网络连接发生变化,上下文信息不变,可以无缝的复用原连接
# 13.什么是强制缓存和协商缓存
答案
强制缓存是指只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,通过cache-control和expires实现,cache-control表示过期的相对时间,expires表示过期的绝对时间
协商缓存是指与服务端协商之后,通过协商结果来判断是否使用本地缓存。
协商缓存有两种模式,last-modified模式,每次返回一个上一次修改的时间,然后请求的时候附带过去,服务器验证该时间是否是最新时间,如果不是则返回新的数据
last-modified的问题:1.文件重新保存,内容没变,时间戳会重置。2.文件保存较快,1s内完成,时间戳是以秒为单位,因此更新时间没变
etag模式:根据数据计算出一个哈希值,然后请求的时候附带过去,服务器验证该数据是否是最新的
etag的问题:1.服务器计算etag需要额外的时间,如果文件较大或改动频繁会影响服务器的性能。2.etag分为强验证和弱验证,弱验证根据数据的部分属性值生成,生成速度快,但可能没那么准确
# 14.TCP是什么?
答案
TCP是面向连接,可靠的,基于字节流的传输层通信协议
面向连接是指在进行数据传输之前必须建立连接
可靠的是指TCP能保证数据能够完整,准确的从发送方传输到接收方
基于字节流是指TCP传输的数据是一连串的无结构的字节流
# 15.有一个 IP 的服务端监听了一个端口,它的 TCP 的最大连接数是多少?
答案
客户端IP数 * 客户端端口号=2^32*2^16.这是理论最大限制,但是会受到服务器内存限制,文件描述符限制
# 16.UDP 和 TCP 有什么区别呢?
答案
1.连接:TCP是面向连接的,传输数据之前要建立连接。UDP是不需要连接的,即立刻传输数据
2.服务对象:TCP是一对一的两点服务,UDP支持一对一,一对多,多对多的交互通信
3.可靠性:TCP是可靠交付数据的,数据可以无差错,不丢失,不重复,按序到达。而UDP是尽最大努力交付的,不保证可靠交付数据
4.拥塞控制、流量控制:TCP有拥塞控制和流量控制机制,保证数据传输的安全性。UDP则没有,即可网络非常拥挤了也不会影响UDP的发送速率
5.首部开销:TCP首部较长,会有一定的开销UDP首部只有8个字节,开销较小
6.传输方式:TCP是流式传输,没有边界,但保证顺序和可靠。UDP是一个包一个包的传输,是有边界的,但可能丢包和失序
# 17.TCP和UDP的应用场景
答案
TCP通常用于HTTPS/HTTP,FTP,SSH等场景
UDP通常用于DNS,广播通信,视频,音频等多媒体通信
# 18.TCP 和 UDP 可以使用同一个端口吗?
答案
可以,在内核中TCP和UDP是两个完全独立的模块
# 19.TCP 三次握手过程
答案
首先客户端和服务端都处于close状态,服务端会主动监听某个端口,处于listen状态,客户端会初始化一个随机序列号,将该序列号置于TCP首部的序号字段中,同时将SYN标志位设置为1,表示SYN报文,然后发送给服务端,之后客户端进入syn-sent状态。
服务端收到SYN报文后,也初始化一个随机序列号,将该序列号置于TCP首部的序号字段中,将TCP首部的确认号字段的值设置为SYN报文TCP首部中序号的值+1,同时将SYN和ACK标志位设置为1,发送给客户端,之后服务端进入syn-rcvd
客户端收到服务端的报文后,还需要发送一个确认报文,该确认报文TCP首部确认号字段的值设置为服务端报文TCP首部的序列号+1,同时将ACK标志位设置为1,发送给服务端,之后客户端进入ESTABLISHED状态,服务端收到客户端的应答报文后,也进入ESTABLISHED状态
# 20.TCP为什么要三次握手?
答案
1.阻止重复历史连接的初始化
2.同步双方的初始序列号
3.能够减少资源开销(因为如果采用两次握手时,如果SYN报文阻塞,然后客户端重发SYN报文会导致建立多个无用的连接,浪费资源)
# 21.TCP为什么要随机生成初始序列号
答案
1.为了防止历史报文被下一个相同的四元组接收
2.防止黑客伪造相同序列号的TCP报文被对方接收
# 22.在IP层会分片,为什么TCP层还需要MSS呢?
答案
因为如果在IP层进行分片的话,由于IP层没有超时重传机制,所以会导致一个分片丢失,全部分片重传
# 23.什么是SYN攻击?如何避免SYN攻击
答案
通过短时间内伪造不同ip地址的syn报文,从而使得服务端的半连接队列被占满,使得客户端不能为正常用户提供服务
1.增大半连接队列
2.减少SYN-ACK重传次数
3.启用syncookies
4.调大netdev_max_backlog参数
# 24.TCP四报文挥手
答案
首先客户端打算关闭连接,会发送一个FIN报文,发送给服务端,之后客户端进入time_wait_1状态。
服务端收到该报文后向客户端发送ACK应答报文,之后服务端进入close_wait状态。
客户端收到服务端的ACK应答报文后,进入time_wait_2状态
等待服务端处理完数据后,向客户端发送FIN报文,之后进入last_ack状态。
客户端收到服务端的FIN报文后,发送一个ACK应答报文给服务端,然后进入time_wait状态。服务端接收到客户端的ACK应答报文后,进入close状态,自此服务端的连接已经关闭。等待2MSL后,客户端也自动进入close状态,自此客户端的连接已经关闭
# 25.为什么要四报文挥手,而不是三报文
答案
因为服务端在收到FIN报文时,可能还有需要发送和处理的数据,需要等待服务端处理和发送完数据后才会发送FIN报文给客户端表示同意关闭连接
# 26.为什么TIME_WAIT是2MSL
答案
MSL是最大报文生存时间,等待2MSL可以保证第四次挥手报文被服务端接收,如果没有接收,在2MSL之前也会收到服务端重传的FIN报文,然后重新等待2MSL
# 27.为什么需要 TIME_WAIT 状态?
答案
1.防止历史连接的数据,被后面相同四元组的连接错误的接收
2.保证被动关闭的一方,能被正确的关闭
# 28.TIME_WAIT过多有什么危害?
答案
1.占用系统资源
2.占用端口资源
# 29.大量TIME_WAIT的原因
答案
1.HTTP没有启用长连接
2.HTTP长连接超时(长连接尝试导致连接被关闭)
3.HTTP长连接的请求数量达到上限(因为达到上限后,会主动关闭连接)
# 30.大量CLOSE_WAIT的原因
答案
1.没有将服务端socket注册到epoll(因为没有注册到epoll中,所以也无法close)
2.新连接到来时,没有调用accept获取该连接的socket(因为没有将其取出,所以也无法close)
3.accept获取已连接的socket后,没有将其注册到epoll(因为没有注册到epoll,所以也无法close)
4.客户端关闭连接后,服务端没有调用close函数
# 31.如果已经建立了连接,但是客户端突然出现故障了怎么办?
答案
TCP通过保活机制会每隔一段时间发送探测报文,如果连续几个探测报文都没有得到相应,则会认为该TCP连接已经死亡。如果对端主机正常,将会重置保活时间,如果对端主机宕机,发送几次探测报文后,会报告该TCP连接已经死亡。如果对端主机宕机并重启,对端会产生一个RST报文,重置该连接
# 32.如果已经建立了连接,但是进程崩溃了怎么办?
答案
当进程崩溃后,操作系统内核会自己完成四次挥手
# 33.socket和TCP的关系
答案
在三次握手中,服务端和客户端首先初始化socket,然后服务端调用bind,listen,然后调用accept阻塞。然后客户端调用connect,此时会进行三次握手,客户端收到第二次握手后,connect会返回。服务端收到第三次握手后会将连接的socket放入accept队列,然后此时accept函数返回一个已连接的socket。然后调用read读数据阻塞,客户端调用write写数据,当读到EOF时,调用close
在四报文挥手时,首先客户端调用close,然后第一次挥手会将EOF写入接收缓冲区,然后当read读到EOF调用close进行第三次挥手
# 34.没有 listen,能建立 TCP 连接吗
答案
可以,只要两个客户端同时调用connect即可
# 35.没有 accept,能建立TCP连接吗
答案
可以,accept只是从accept队列中取出一个socket,并不参与三次握手
# 36.TCP的重传机制
答案
1.超时重传:发送数据时会设置一个定时器,当超过指定时间后,没有收到对方的ACK确认应答报文,就会重发该数据。
2.快速重传:当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。
3.SACK:通过在TCP首部的选项字段添加SACK,将已收到的数据的信息发送给发送方,使得发送方可以只重传丢失的数据
4.D-SACK:通过使用SACK告诉发送方那些数据被重复接收了。可以让发送方知道是发送出去的数据包丢了,还是接收方回应的ACK丢了
# 37.TCP的滑动窗口
答案
滑动窗口分为发送窗口和接收窗口,发送窗口通过记录已发送但未收到ACK应答的第一个字节的位置,待发送但还接收方还可以处理的第一个字节的位置,未发送并且接收方不可以处理的第一个字节的位置
接收窗口通过记录未接收但还可以接收的第一个字节的位置,未接收并且不可以接收的第一个字节的位置
发送窗口的大小约等于接收窗口的大小,因为大小同步是有时延的
# 38.TCP流量控制的原理
答案
TCP流量控制通过滑动窗口和调整TCP报文的大小来实现。 通过滑动窗口协调发送窗口和接收窗口的大小来使得发送方的发送速率不要太快,要让接收方来得及接收 因为TCP首部就有20个字节,所以需要避免发送太小的报文。所以通过控制TCP报文的大小,达到一定大小才能发送
# 39.TCP的拥塞控制
答案
通过维护一个拥塞窗口的大小来避免发送方填满整个网络
慢启动算法,刚建立TCP连接的时候,每收到一个ACK,拥塞窗口的大小就翻倍,当到达慢启动门限时,就会启用拥塞避免算法
拥塞避免算法: 当拥塞窗口超过慢启动门限时,每收到一个ACK,拥塞窗口就增加1/cwnd(拥塞窗口大小)
拥塞发生算法:当遇到超时重传的时候 ,拥塞窗口大小会设置为1,慢启动门限会设置为原来的一半,当遇到快速重传(即三个重复的ACK),拥塞窗口会设置为原来的一半,慢启动门限设置为原来拥塞窗口的一半(ssthresh = cwnd = 1/2 cwnd)
快速恢复算法: 当遇到快速重传时,会将拥塞窗口设置为原来的一半再加3,慢启动门限设置为原来拥塞窗口的一半,3表示已经确认接收到3个重复的ACK,如果再收到重复的ACK,拥塞窗口+1,如果收到新的数据则将拥塞窗口的大小设置为慢启动门限
# 40.为什么有了流量控制,还要拥塞控制?
答案
流量控制是为了避免发送方的数据填满接收方的缓存
拥塞控制是为了避免发送方的数据填满整个网络
# 41.TCP的全连接队列和半连接队列
答案
服务端收到客户端的SYN请求后,内核会将该连接存储到半连接队列中,并响应SYN+ACK,客户端会返回ACK,当服务器收到第三次握手的ACK时,内核会将该连接从半连接队列中移除,然后创建新的完全的连接,将其添加到全连接队列,等待调用accept时将其取出
# 42.当全连接队列和半连接队列满了会怎么样?
答案
当全连接队列满了后,会将后续的请求丢弃,或者回复RST报文
当半连接队列满了后,如果没有开启syncookies,将会丢弃,如果全连接队列满了并且需要重传SYN+ACK的包多余一个,也会将其丢弃,如果没有开启syncookies并且当前半连接队列的长度超过max_syn_backlog的3/4
# 43.半连接队列和全连接队列的最大长度?
答案
全连接队列的最大长度为min(somaxconn,max_syn_backlog)
半连接队列的理论最大长度为全连接队列最大长度和max_syn_backlog最小值的两倍
实际的最大长度还会受到一个条件的限制,还要与max_syn_backlog的3/4取min
# 44.什么情况下SYN包会被丢弃
答案
1.NAT网络下,开启tcp_tw_recycle参数(因为NAT下不同的主机,会被看作相同的IP地址,因为开启了recycle+timestamp他并不会对四元组做检查,而是对IP地址做检查,就会使得该SYN包被丢弃)
2.半连接队列满了并且没有开启syncookies,全连接队列满了
# 45.已经建立连接的TCP,收到一个SYN包会怎么办?
答案
1.如果这个SYN包的端口号和历史连接的端口号不同,则会被认为是建立一个新的连接,然后旧的连接,服务端会启用tcp保活机制,最后会将其释放掉
2.如果这个SYN包的端口号和历史连接的端口号相同,因为这个序列号是随机的,所以服务端会回复一个正确的序列号和ACK,客户端收到发现不是自己期望的ACK,会回一个RST报文,从而释放该连接
# 46.TCP如何处理乱序的数据?
答案
当收到乱序的数据时,会将其加入到乱序队列中,然后当延迟的数据到达后,会检查乱序队列中是否有能够接上的数据,如果有,判断是否带有FIN标志,如果有,则将其进行处理
# 47.处于TIME_WAIT状态时,收到SYN会发生什么
答案
首先会判断是否为合法的SYN,如果是,则会跳过TIME_WAIT状态,直接进入sync_recv状态,如果是不合法的SYN,则会回一个之前的ACK,对方收到后,收到的不是自己期望的ACK,则会发送RST报文
# 48.处于TIME_WAIT状态时,收到RST报文会直接关闭吗?
答案
取决于net.ipv4.tcp_rfc1337参数,如果设置为0,则提前结束TIME_WAIT状态,释放连接,如果设置为1,则会丢弃该RST报文
# 49.TCP连接中遇到主机崩溃和进程崩溃会怎么样?
答案
如果进程崩溃,最终内核会完成四次挥手
如果主机崩溃,如果没有数据交换,如果没有开启keepalive,那么服务端将会一直等待,如果开启了keepalive,再探测到对方已经崩溃后将会关闭该连接。如果有数据交换,如果主机崩溃后迅速重启,将会回复RST报文,关闭该连接。如果主机崩溃后没有重启,服务端重传超过一定次数后,最终也会关闭该连接
# 50.为什么tcp_tw_reuse是默认关闭的?
答案
开启tcp_tw_reuse就必须开启timestamp,然而这样会导致收到历史报文时,如果是RST报文,不会被丢弃
被动关闭连接的一方被不正常的关闭
# 51.TCP握手和TLS握手能同时进行吗?
答案
可以,但是必须保证客户端和服务端双方启用tcp fast open并且tls版本为1.3,并且之前已经建立连接
# 52.HTTP的keep-alive和TCP的keepalive是同一个东西嘛
答案
HTTP的keep-alive是应用层实现的,是HTTP的长连接
TCP的keepalive是传输层实现的,是TCP的保活机制
# 53.TCP有什么缺陷?
答案
1.TCP是在内核实现的,应用程序只能使用而不能修改,因为如果想要升级TCP协议,就只能升级内核,所以使得TCP的升级工作很困难
2.TCP连接建立的延迟,基于应用层的协议,都需要先进行三次握手才能传输数据,大多数使用HTTPS的,在建立TCP连接后,还需要进行TLS握手,增大了数据传输的延迟
3.TCP存在队头阻塞的问题,因为TCP是字节流协议,TCP层必须保证收到的字节数据是有序的,后面的字节数据即使收到了也无法从内核中读取数据
4.网络迁移需要重新建立连接:因为TCP是根据四元组来确定一条TCP连接的,所以一旦网络发生变化,IP地址就会发生变化,就需要重新建立连接
# 54.如何基于UDP实现可靠传输
答案
基于UDP实现的可靠传输已经有了-QUIC协议
1.通过Package Number 和Stream ID,Offset,可以支持乱序确认而不影响数据包的正确组装
2.Stream级别的流量控制,每个stream有独立的接收窗口,即使一个窗口无法移动,也不会影响其他的Stream
3.Connection级别的流量控制:他的接收窗口是所有stream之和
4.QUIC对TCP的拥塞控制进行了改进,因为QUIC是处于应用层的,所以不同应用程序可以设置不同的拥塞控制算法
5.QUIC支持更快的连接建立,通过连接ID来标识一个连接,即使网络发生变化,只要上下文信息还在,就可以复用原来的连接
6.QUIC还解决了TCP队头阻塞的问题。QUIC为每个stream都分配了一个滑动窗口,使得多个stream之间没有依赖关系,相互独立
7.QUIC建立连接的速度更快,QUIC内部包含了TLS,并且使用的是TLS1.3,QUIC自己的帧中就包含了TLS的记录,从而使得建立连接只需要1RTT,第二次连接只需要0RTT
# 55.QUIC是如何解决TCP队头阻塞问题的?
答案
QUIC对每个不同的stream都有一个滑动窗口,各个stream之间没有依赖关系,相互独立
# 56.QUIC是如何迁移连接的?
答案
使用连接ID来标记通信的两个端点,从而使得网络发生变化时,只需要仍保有上下文信息,就可以复用原来的连接
# 57.客户端的端口可以重复使用吗?
答案
只要不是相同的目的ip+目的端口就可以重复使用
# 58.如何解决客户端 TCP 连接 TIME_WAIT 过多,导致无法与同一个服务器建立连接的问题?
答案
开启net.ipv4.tcp_tw_reuse参数,对于相同的四元组,处于TIME_WAIT状态并且超过1秒,可以直接复用该连接
# 59.如果服务端没有listen,客户端建立连接会怎么样?
答案
因为服务端没有listen,所以无法找到对应的socket,所以会回复一个RST报文
# 60.用了TCP,数据一定不会丢失吗?
答案
1.半连接,全连接队列满了,导致连接建立失败
2.流量控制丢包,为了控制进入网卡的流量,在网络层有个队列,队列满了会导致丢包
3.网卡丢包:网线质量差
4.RingBuffer过小导致丢包:因为发送数据速度过快,数据还没有被内核读取就被覆盖,从而导致丢包
# 61.TCP四次挥手可以变成三次挥手吗?
答案
可以,但是得满足没有数据要发送并且开启了TCP延迟确认机制,这样第二次握手的ACK不会立马发送,而是等FIN一起发送
# 62.TLS/SSL原理
答案
以RSA密钥交换算法为例
1.客户端发送客户端tls版本号,密码套件列表,客户端随机数。
2.服务端收到后,发送确认使用的tls版本号,选择的密码套件,服务端随机数,服务端证书
3.客户端收到后验证服务端证书,获取到服务端公钥,然后生成一个随机数pre-master,根据pre-master,客户端随机数,服务端随机数计算出会话密钥,然后使用服务端公钥对pre-master进行加密,发送给服务端
4.服务端收到后,使用服务端私钥进行解密,获取到pre-master,然后计算出会话密钥
# 63.CA证书原理
答案
服务端向CA机构申请证书,服务端提供公钥,CA机构将服务端的公钥和信息打包成一个证书,然后使用签名算法计算一个签名,然后使用CA私钥将该签名加密。客户端收到该证书后,使用同样的签名算法计算签名,然后使用CA公钥对证书上的签名进行解密,判断和自己计算的签名是否一致。
# 64.TLS1.2和TLS1.3
答案
# 65.为什么tls握手需要三个随机数
答案
客户端随机数为了防止客户端的重放攻击
服务端随机数是为了防止服务端的重放攻击
pre-master是为了保证会话密钥是随机的
# 66.TCP如何保证顺序传输?
答案
1.序列号:通过序列号保证数据按照发送时的顺序进行处理
2.确认应答:通过发送下一个期望的数据序列号来确认之前的数据已经被接收
3.重传机制:如果发送端在一定时间内没收到ACK报文,则会重传之前的报文
# 67.Cookie和Session的区别及其应用
答案
cookie保存在客户端,session保存在服务端,保存的都是用户的信息
cookie不安全,容易发生CSRF攻击。session比较安全
cookie一般用于存储用户的登陆信息,个性化设置。而session一般用于存储用户的购物车,访问权限等
# 68.websocket原理
答案
websocket是基于http的,先通过http建立连接,然后在http请求中带上特殊的header头升级为websocket协议,然后进行websocket握手,客户端发送一个随机的base64编码的字符串,放在Sec-WebSocket-Key,服务端收到后用某个公开算法将该字符串变成另一个字符串,然后填在Sec-WebSocket-Accept中放回给客户端。客户端收到后也通过同样的公开算法将base64码变成另一个字符串,与服务端放回的进行比较,相同则验证通过
# 69.子网掩码的作用
答案
1.划分子网
2.确定网络地址
3.优化网络的流量,如果没有子网的话,一个广播会发送到同一网络的所有设备,通过子网,可以只在相应的子网内传输,减少了不必要的网络流量的干扰
4.通过将网络划分成子网,对于不同的子网使用不同的安全策略,从而提高网络的整体安全性
5.使用子网掩码可以更加灵活的分配ip地址,根据子网大小调整子网掩码,优化ip地址的使用
# 70.正向代理和反向代理
答案
正向代理是指客户端向代理服务器发送请求,由代理服务器代替客户端向目标服务器发送请求。为了隐藏客户端的IP地址,突破访问限制
反向代理是指客户端向代理服务器发送请求,由代理服务器决定向哪个服务器发送请求。为了隐藏服务端的IP地址,负载均衡,提高访问速度
# 71.http的method方法
答案
GET:请求资源
HEAD:类似于GET请求,但是返回的响应中没有具体的内容,用于获取报头
POST:向指定资源上传数据
DELETE:删除指定资源
OPTIONS:获取服务器支持的方法
PATCH:更新资源
PUT:将请求的内容放到指定位置
# 72.https单向认证和双向认证
答案
单向认证:只需要验证服务器的身份
双向认证:服务器和客户端的身份都要验证,一般用于企业内部,安全性较高的企业
# 73.HTTP长连接如何识别服务器响应是哪次请求的回复
答案
HTTP1.1及之前通过响应的顺序来表示,第一个收到的响应就是对应第一次请求的回复
HTTP2.0及之后引入了stream,通过stream id 可以表示是哪个请求
# 74.从应用层到网络层各层的header都有什么不同的功能
答案
应用层的header包括协议类型,操作类型,请求信息等
传输层的header包括序列号,控制标志,确认号,端口号
网络层的header包括源ip地址,目标ip地址,生存时间等
# 75.TCP粘包问题
答案
一次传输的数据可能包含多个包的数据,导致无法区分两个包的数据,所以需要解决
1.固定包的长度,不足就补特殊字符进行填充
2.在每个包的末尾补充结束字符,例如\r\n,用于区分不同包的数据
3.将消息分成头部和消息体,头部中保存整个消息的长度,每个包的消息体前都会包含其长度
# 76.ping的底层原理
答案
基于ICMP协议,发送一个ICMP的回送请求报文,对方收到后会回复一个ICMP的回送响应报文
# 77.traceroute的底层原理
答案
基于ICMP,通过设置TTL字段的长度,从1开始,然后获取沿途经过的路由器。因为当TTL为0后,对方会返回一个ICMP的超时报文,从而得到该路由器
# 78.IP层实现可靠传输
答案
1.序列号和确认机制
2.超时和重传
3.流量控制和拥塞控制
4.数据包重排和重组
5.错误检测
# 79.http和rpc
答案
1.功能层面:http是超文本传输协议,用于浏览器和服务端之间的通信,rpc是远程过程调用协议,用于服务和服务之间通信
2.实现层面:http是已经实现并成熟的应用层协议,定义好了通信报文的格式。而rpc是通信协议的一种规范,并没有具体实现,只要按rpc的规范实现的框架都可以称之为rpc协议,不同的框架可以自定义通信报文格式,序列化方式,通信协议的类型