计算机网络八股汇总

计算机网络八股。有错误请指出!

  • 1.TCP/IP五层网络模型
  • 2. 数据传输过程
  • 3. DNS域名解析过程
  • 4. url输入浏览器发生了什么
  • 5. HTTP常见字段
  • 6. HTTP状态码
  • 7. HTTP缓存技术
  • 8. HTTP请求类型及区别,为什么要有多种请求类型
  • 9. HTTP 1.0 1.1 2.0 3.0的区别
  • 10. 请求转发和请求重定向的区别
  • 11. HTTP三个风险
  • 12. HTTPS如何规避这三个风险
  • 13. HTTPS和HTTP的区别
  • 14. 有了HTTP协议,为什么还要WebSocket协议
  • 15. TCP 和 UDP
  • 16. 三次握手过程,为什么不能二次握手,为什么要求每次连接初始序列号不一样
  • 17. 四次挥手过程,为什么四次挥手
  • 18. 为什么需要TIME_WAIT,为什么是2MSL
  • 19. TIME_WAIT过多的原因、危害、解决、Linux查看命令
  • 20. 粘包和半包,粘包原因、解决方法及缺点
  • 21. DDos攻击的四种方式和防止方法
  • 22. DNS污染和DNS劫持,怎么防止
  • 23. TCP重传机制,SACK,D-SACK及其好处
  • 24. 滑动窗口协议:窗口、累计确认、流量控制、窗口关闭、死锁、窗口探测报文、糊涂窗口综合征、Nagel算法 、拥塞控制、拥塞窗口
  • 25. 拥塞控制四种算法

1.TCP/IP五层网络模型

  • 分别是应用层,传输层,网络层,数据链路层,物理层。
  • 应用层由应用层,表示层,会话层三层合并,负责应用程序之间的数据交互。不同的应用需要不同的应用层协议,常见的有HTTP协议,HTTPS协议,DNS域名解析协议。
  • 传输层提供端到端的通讯,传输层数据包需加上源端口号和目的端口号,常见协议有TCP和UDP。
  • 网络层负责处理数据包的路由和转发,网络层数据包需加上源IP和目的IP,常见的协议有IP协议。
  • 数据链路层负责传输数据帧,数据包会加上帧头和帧尾,是网卡实现的功能。
  • 物理层则在数据封装和分用的过程中负责二进制数据和光电信号的转换

2. 数据传输过程

  • 一个数据从应用层发送,经过传输层封装成TCP/UDP包(根据协议),包头有源端口号和目标端口号;经过网络层分装成IP报文(加上了源IP和目的IP),若超过数据链路层最大传输单元(MTU),则IP报文会被分片;数据链路层组装成数据帧,通过物理层发送给目标机器。
  • 目标机器接收到后进行一个逆向拆包过程,首先网络层先确定这个IP就是自己,否则直接抛弃;并且,网络层还会识别IP报文是否进行了分片,待集齐所有分片后,按正确顺序组装,并发给传输层,传输层检测包头的目标端口字段,发送给相应的程序。

3. DNS域名解析过程

  • 比如说,首先一个网址由主机名www,mail,member,space,加权威域名bilibili,baidu,加顶级域名com,cn,net,加根域名.组成。
  • 在浏览器输入一个网址www.bilibili.com,浏览器首先会查看自己的缓存有没有对应的IP地址记录,同时还要查询一下主机本地文件里有没有对应的IP地址记录。
  • 如果没有,浏览器则会调用解析器向本地DNS服务器发送请求(DNS一般用UDP传输)。本地DNS服务器先查看自己的缓存,如果有则直接返回IP地址,且会标注非权威(non-authoritative)。
  • 如果没有,则会访问根域名服务器,根域名服务器是最高层次的域名服务器,不直接用于域名解析;本地DNS服务器会向根域名服务器询问顶级域名服务器.com的地址;
  • 在收到顶级域名服务器.com的地址后,向顶级域名服务器.com询问权威域名服务器bilibili.com的地址;
  • 在收到权威域名服务器bilibili.com的地址后,向权威域名服务器询问www.bilibili.com的地址。
  • 权威域名服务器会返回一个内容分发网络CDN的地址,访问CDN最终得到了IP地址。
  • 本地DNS服务器会将IP地址返回给主机的解析器,再递归返回给浏览器与目标建立连接。

4. url输入浏览器发生了什么

  • 在浏览器中输入指定网页的URL,浏览器根据DNS协议获取域名对应的IP地址;
  • 通过IP地址和端口号,向服务器发起一个TCP连接请求;
  • 浏览器在TCP连接上向服务器发送一个HTTP请求报文,请求获取网页的内容;
  • 服务器收到HTTP请求之后,处理请求,返回HTTP响应报文给浏览器;
  • 浏览器收到HTTP响应报文以后,解析响应体中的HTML代码,渲染网页结构;
  • 同时根据HTML中的其他资源的URL(图片,CSS,JS等),再次发起HTTP请求,获取这些资源的内容,直到网页完全加载显示;
  • 浏览器在不需要和服务器通讯时,可主动关闭TCP连接,或等待服务器的关闭请求.

5. HTTP常见字段

  • Host :请求资源时指定服务器的域名;
  • Connection:建立长连接,方便其他请求复用;
  • Content-Length:返回数据的长度
  • Content-Type:返回数据类型
  • Content-Encoding:返回数据的压缩格式

6. HTTP状态码

  • 1xx是提示信息,表示处于协议处理的中间状态;
  • 2xx表示成功;
    • 200OK:最常见的成功状态码 ;
  • 3xx表示重定向(资源位置发生变动);
    • 301Moved Permanently :资源永久重定向,需要新的URL去访问,客户端需更新书签或链接,URL搜索排名改变;
    • 302Found:资源临时重定向,需要临时的新的URL去访问,客户端无需更新书签或链接,URL搜索排名不变;
    • 304Not Modified:缓存重定向,表示资源未作修改,缓存资源仍然有效;
  • 4xx表示客户端出现错误;
    • 400Not Found:客户端请求的资源在服务器不存在或未找到,无法返回给客户端;
  • 5xx表示服务端出现错误。
    • 500Internal Server Error:表示服务器出错;

7. HTTP缓存技术

  • 强制缓存:浏览器第一次访问服务器资源,会在本地缓存下,再次访问相同资源时从本次缓存获取。
  • 协商缓存
    • 浏览器返回资源,会在头部加上cache-control设置过期时间和e-tag设置资源唯一标识。
    • 若本地缓存资源过期,浏览器会再次发起请求,并将请求头里的if-none-match值设置为e-tag值。
    • 服务器收到请求后会将if-none-match值与资源唯一标识值对比,若相同表示资源未作改变,则返回304Not Modified状态码,浏览器接收到304Not Modified后会读取本地缓存资源并重新设置过期时间。若不相同,则返回新的资源和200状态码。

8. HTTP请求类型及区别,为什么要有多种请求类型

  • get:获取数据(url,ajax);
  • post:提交数据(form表单,ajax);
  • put:更新数据;
  • delete:删除数据;
  • getpost区别:
    • get是获取数据;post是提交数据;
    • post不是幂等(无论操作多少次结果都相同)的,每次提交的数据不一样;getput是幂等的,所以get获取的数据可以缓存的;
    • get的参数一般放在url中,url长度受到浏览器和服务器的显示;post的参数放在请求体body中,大小不受限制。

9. HTTP 1.0 1.1 2.0 3.0的区别

  • HTTP1.0 :短连接,一次请求一次连接;
  • HTTP1.1
    • 长连接(+HTTP缓存技术,性能提升明显);
    • 管道技术(连续发送请求,不用等上一个响应回来);
    • 头字段加入host字段,支持虚拟主机功能(单一物理服务器上托管多个网站域名);
    • 缺点
      • 串行方式传输,造成应用层的对头阻塞
      • 管道传输丢包,将第三个包当成第二个包;
      • 请求和响应的首部重复、明文、不压缩(增加开销);
  • HTTP2.0 :
    • 多路复用技术,首部和数据封装成首部帧数据帧,加上了流标识符(无需按序到达);
    • HPACK压缩首部,首部不再重复;
    • 服务器推送功能,提前发送所需资源到缓存,但点错链接的话会造成资源浪费;
    • 缺点
      • 传输层基于TCP协议传输,TCP是字节流协议,传输层必须保证收到的数据是完整且连续的才会发送给应用层,这又造成了传输层的对头阻塞
  • HTTP3.0
    • 改用QUIC协议:TCP2.0,整合了TCP3次握手和SSL/TLS4次握手,初次连接1RTT,再次连接0RTT,更快建立连接;
    • 基于UDP传输:
      • 某个流丢失数据,只会阻塞这个流,不会影响其他流的传输;
      • 传输的QUIC帧也有流标识符,解决了传输层队头阻塞的问题。
    • 连接迁移功能:QUIC包加上了连接ID标记两个端点。比如:WIFI切换到流量,IP地址发生改变也无重连成本。

10. 请求转发和请求重定向的区别

  • 请求转发:服务器会将浏览器的请求转发给其他服务器,并返回资源。
  • 请求重定向:服务器会返回一个临时响应头,浏览器根据临时响应头的url再次进行访问。
  • 区别
    • 请求转发是一次请求一次响应,请求重定向是两次请求两次响应;
    • 接口代码不同:请求转发是forward接口,请求重定向是sendRedirect接口;

11. HTTP三个风险

  • 窃听:数据明文传输,容易被第三方截取。
  • 劫持:攻击者可篡改数据,导致通信被恶意修改。
  • 冒充:客户端与服务器无法相互验证身份,容易遭遇中间人攻击 (MITM)。
  • 根本原因:HTTP 明文传输无身份验证机制

12. HTTPS如何规避这三个风险

  • 混合加密对称加密传输内容,提高效率; 非对称加密传输加密密钥,保证安全。
  • 数据校验:防止数据篡改,确保完整性。
  • 数字证书:服务器提供 SSL/TLS 证书 供客户端验证。

13. HTTPS和HTTP的区别

  • HTTPS更安全;HTTP超文本传输协议,明文传输;HTTPS对称加密传输内容, 非对称加密传输加密密钥;
  • HTTP端口80、HTTPS端口443
  • HTTPS优先级和排名更高。

14. 有了HTTP协议,为什么还要WebSocket协议

  • 原因: HTTP1.1虽然基于TCP传输,但还是半双工,只要客户端不问,服务器不答,对需要服务器主动推送到客户端的场景不友好(如网页游戏),因此考虑使用WebSocket协议。
  • 方法:三次握手建立连接后,使用HTTP协议进行一次通信,在HTTP请求中带上特定(Upgrade: websocket )的头部,将HTTP协议升级为WebSocket协议。

15. TCP 和 UDP

  • TCP:有连接,可靠传输,字节流,全双工,发送和接收都有缓冲区;
  • UDP:无连接,不可靠,数据报,全双工,发送无缓冲,接收有缓冲区;
  • UDP广播形式,无法确认对方是否收到了数据(TCP有应答机制和超时重传)。

16. 三次握手过程,为什么不能二次握手,为什么要求每次连接初始序列号不一样

  • 三次握手过程:
    • 客户端向服务器发出连接请求SYN ;
    • 服务器收到请求后向客户端发送,ACK+SYN;
    • 客户端收到后回复ACK,连接建立。
  • 为什么不能二次握手:
    • 避免历史连接;
    • 避免资源浪费;
    • 确保同步双发初始序列号;
  • 为什么不能两次握手具体解释
    • 避免历史连接:比如客户端SYN(序列号seq=100)被网络阻塞,客户端发起新的SYN(seq=200),但旧的SYN比新的SYN先到达,服务器在第一次握手建立连接回复SYN+ACK=101;但客户端期待收到的应答号是ACK = 201,这样就会发起RST终止连接。
    • 避免资源浪费:比如客户端SYN被网络阻塞,没有收到服务器发来的ACK应答,重新发起SYN请求,网络恢复后造成多个重复SYN到达服务器,因为在第二次握手就要建立连接,所以服务器建立多个连接,并发送数据,造成资源浪费。
    • 确保同步双发初始序列号:是因为双发的初始序列号是可靠传输的关键因素,第二次握手客户端知道自己的初始序列号被成功同步,因此需要第三次握手让服务器知道自己的初始序列号也被正确同步。
  • 为什么要求每次连接初始序列号不一样: 减少历史报文被下一个相同四元组接收的概率。

17. 四次挥手过程,为什么四次挥手

  • 四次挥手过程
    • 首先客户端发起FIN =1,进入FIN_WAIT_1状态;
    • 服务器收到后发送ACK应答报文,进入CLOSE_WAIT状态;
    • 客户端收到后进入FIN_WAIT_2状态;
    • 等服务器处理完请求后,发送FIN报文,服务器进入LAST_ACK状态;
    • 客户端收到后发送ACK回应报文,进入TIME_WAIT状态;
    • 服务器收到后进入CLOSE状态;
    • 客户端2MSL后自动进入CLOSE状态。
  • 为什么四次挥手:为了保证客户端和服务端都可以被正确关闭。因为客户端发送完FIN后,仅仅说明客户端不再发送数据,但依然可以接收数据;服务器收到FIN回复一个ACK后可能还有数据要处理并返回给客户端,因此需等到服务器不在发送数据时才发送FIN给客户端,表示同意关闭连接。客户端也要应答一个ACK告知服务端消息被接收。

18. 为什么需要TIME_WAIT,为什么是2MSL

  • 防止历史连接中的数据被后面相同四元组的连接错误接收,2MSL的时间足以让两个方向上的数据包都被丢弃;
  • 保被动关闭连接的一方可以被正确关闭,因为如果最后一个ACK丢失了,会触发TCP重传机制,服务器会从新发送一个FIN,一去一来时间正好2MSL。

19. TIME_WAIT过多的原因、危害、解决、Linux查看命令

  • 过多的原因
    • 没有使用长连接;
    • 太多长连接超时;
    • 太多长连接达到最大请求数量(超过最大请求数量,连接会被关闭);
    • 高并发连接(同一时间内大量建立和关闭连接);
  • 危害
    • 占用系统资源(文件描述符、CPU资源、线程资源等)
    • 耗尽端口资源(系统会为每个TCP连接分配一个临时端口)
  • 解决:复用TIME_WAIT的Socket连接。
  • Linux查看命令netstat nt | grep TIME_WAIT

20. 粘包和半包,粘包原因、解决方法及缺点

  • 粘包:一条消息中读取到了另一条消息中的部分数据,接收端无法区分出独立消息;
  • 半包:一条消息被拆分成多个部分,接收端只能接收到部分消息;
  • 粘包原因:粘包问题发生在TCP/IP协议中,因为TCP协议是面向字节流传输的协议,而流数据没有明确的开始和结束边界;
  • 解决方法
    • 固定大小,长度不够用空字符补充;
      • 缺点:万一传输数据都很小,会造成网络资源浪费;
    • 自定义协议,在TCP的基础上封装一层自定义的协议,将数据长度写入数据头 ;
      • 缺点:实现复杂;
    • 以特殊字符结尾,如\n(推荐);
      • 缺点:万一数据中间出现结束夫,会造成半包问题;
      • 解决方法:对复杂字符串进行编码解码处理。

21. DDos攻击的四种方式和防止方法

  • DDos攻击:分布式拒绝服务,控制多个设备同时向目标设备发起大量请求,消耗网络带宽系统资源,从而导致目标瘫痪。
  • DDos四种攻击方式
    • UDP数据包 ;
    • TCP的SYN请求,但不建立连接;
    • HTTP请求;
    • ping请求;
  • 防止措施
    • DDos清洗,实时监控异常流量;
    • CDN加速:CDN服务将访问流量分散到各个节点中,好处是可以隐藏真实IP,且遭到DDos攻击,可以将流量分散到各个节点,防止源站崩溃;
    • 限制连接:在网络层显示每个IP地址的请求数量;
    • 配置防火墙和入侵检测系统;

22. DNS污染和DNS劫持,怎么防止

  • DNS污染:将错误信息注入DNS缓存中,查询域名时返回错误IP;
  • DNS劫持:修改了本地DNS配置,篡改了域名解析结果,将域名解析结果重定向到指定的DNS服务器,例如重定向到广告网站。
  • 防止措施
    • 使用可信赖的DNS服务器;
    • 启用DNSSEC(DNS安全扩展);
    • 定期检查DNS设置;
    • VPN(可加密网络连接);
    • 防火墙和网络安全工具

23. TCP重传机制,SACK,D-SACK及其好处

  • TCP重传机制

    • 超时重传(时间略大1RTT)
    • 快速重传(收到三个相同的ACK报文)
  • TCP确认

    • SACK:那么重传是一个还是全部?引出选择性确认SACK(TCP头部告诉发送方,已经接收了哪些包)
    • D-SACK(Duplicate SACK,告诉发送方,重复接收了哪些包)
  • D-SACK好处

    • 可以知道是包丢了还是ACK丢了,如果发送方重发包后,收到D-SACK说明ACK丢了;
    • 发送方的数据包是否被网络延迟;
    • 发送方数据包是否被网络复制;

24. 滑动窗口协议:窗口、累计确认、流量控制、窗口关闭、死锁、窗口探测报文、糊涂窗口综合征、Nagel算法 、拥塞控制、拥塞窗口

  • 窗口:指窗口大小,无需等待确认应答,发送方可以发送的数据大小。
  • 累计确认:接收方回复给发送方一个ACK确认号,表示小于改确认号的包都被成功接收,该确认号表示期待接收的包;
  • 流量控制:让发送方根据接收方的实际接受能力控制发送的数据量;
  • 窗口关闭:接收方告诉发送方自己的窗口大小来进行流量控制,当接收窗口大小为0时,停止发送,直到接收窗口大小不为0;
  • 死锁:接收窗口大小为0,发送方停止发送,等待窗口非0的ACK报文,但ACK报文丢失了。
  • 窗口探测报文:发送方收到零窗口通知后,启动持续计时器,超时发送一个窗口探测报文,接收方收到探测报文,给出当前接收窗口大小。若仍为0,则重新启动持续计时器。
  • 糊涂窗口综合征:接收窗口的数据来不及取走,导致发送窗口也越来越小,当接收窗口就腾出几个字节告诉发送方,发送方也义无反顾的发送几个字节的数据。但TCP+IP数据头就有40个字节,只传输几个字节数据,开销太大。
  • 解决:接收方不通告小窗口给发送方(若无,万一发送ACK过快容易达到Nagel条件2)+ Nagel算法(避免发送方发送小数据)。
  • Nagel算法(满足两条件之一):1. 窗口大小>=MSS(缓存空间/2 )且数据大小>=MSS; 2. 收到之前已发送数据的ACK包。
  • 拥塞控制:避免发送方数据填满整个网络;
  • 拥塞窗口cwnd:根据网络情况调节放送方发送数据的量(发送窗口swnd=min(拥塞窗口,接收窗口rwnd));
  • 如何判断网络拥塞了:规定时间内未收到ACK报文,也就是发生了超时重传。

25. 拥塞控制四种算法

  • 慢启动;
  • 避免拥塞;
  • 快重传;
  • 快恢复;

具体流程
计算机网络八股汇总_第1张图片

  • 首先设置慢启门限ssthresh;

  • 使用慢启动算法,每收到一个ACK,拥塞窗口cwnd按指数级增长;

  • 当cwnd>=ssthresh,改为拥塞避免算法,每收到一个ACK,cwnd加1;

  • 发生超时重传cwnd变为1,ssthresh变为cwnd/2,重新开始慢启动;

  • 但可能网络实际并未发生拥塞,开启慢启动就降低了传输效率,因此这里用快重传,在未超时时间内连续返回3个相同的ACK,让发送发快速重传丢失的包;
    计算机网络八股汇总_第2张图片

  • 进去快恢复算法,ssthresh和cwnd变为cwnd/2,也有说cwnd变为ssthresh+3的,因为收到3个ACK,实际就是有三个数据包离开了网络。
    拥塞控制视频讲解

你可能感兴趣的:(计算机网络,java)