您当前的位置:首页 > 计算机 > 网络通信

面试必备:程序员必知的网络知识要点

时间:09-24来源:作者:点击数:

在网络的世界里,无论是前端开发还是后端架构,网络知识都是程序员不可或缺的一环。今天我们就来梳理一下那些面试中常常被问及的网络相关知识点。

目录

什么是SYN Flood攻击?如何防御?

SYN Flood攻击是一种拒绝服务攻击,攻击者通过发送大量的SYN请求,使服务器处于半开放连接状态,消耗服务器资源。防御方法包括使用SYN Cache、SYN Cookie以及部署代理防火墙等策略。

### SYN Cache
为半连接请求维护一个较小的缓存表,减少资源占用。

### SYN Cookie
利用算法生成SYN信息,无需额外存储空间。

### 代理防火墙
在防火墙外完成握手后再与内部服务器建立连接。

常见HTTP状态码

  • 100 继续传送
  • 101 转换协议(HTTP -> HTTPS)
  • 102 继续处理
  • 200 正常返回
  • 201 请求完成,已分配资源
  • 202 请求被接受,还未完成
  • 204 请求已完成,但没有更新的内容
  • 300 存在多个可用的被请求的资源
  • 301 重定向永久URL
  • 302 重定向临时URL
  • 304 请求资源未更新
  • 400 非法请求
  • 401 未授权
  • 403 禁止
  • 404 未找到
  • 500 服务器内部错误
  • 501 服务器无法识别
  • 502 错误网关
  • 503 服务出错,临时的

为什么TCP不用两次握手?

两次握手可能会导致客户端处于等待确认的状态,而服务器已经开始传输数据,造成数据丢失。第三次握手确认了客户端的SYN+ACK信息,确保了服务器已准备好接收数据。

为什么TCP建立连接需要三次握手,而断开连接需要四次挥手?

建立连接的三次握手中,客户端和服务器都需要确认对方的接收能力;而断开连接的四次挥手过程中,双方需要确保所有数据都已发送完毕,因此需要额外的步骤来确认双方都准备好关闭连接。

为什么四次挥手之后,客户端需要等待2MSL,再进入CLOSED状态?

为了确保最后一个ACK被接收,防止旧的报文段出现在新连接中。MSL(Maximum Segment Lifetime)是指一个数据包在网络中存在的最长时间。

如果客户端挂掉,服务器如何发现并主动终止连接?

服务器通过保活计时器(Keep-Alive Timer)定期发送探测报文(如TCP的Keep-Alive探测包),如果多次未能得到响应,则终止连接。这种方法帮助检测失效的连接。

RIP的特点

  • 基于距离向量算法(记录到所有目标网络的最短距离[跳数])
  • 只与邻居交换信息
  • 交换全部自己知道的信息(整个路由表)
  • 30秒交换一次
  • “好消息传得快,坏消息传得慢”(缺点)

OSPF的特点

  • 基于分布式的链路状态
  • 泛洪式通知所有网络中路由器信息
  • 只告诉与自己相连的邻居路由器的链路状态
  • 只有链路发生变化时,才进行信息交换
  • 每个路由器都知道全网的拓扑结构

在浏览器中输入网址后执行的全部过程

  1. 解析DNS,首先查找浏览器缓存,再查询系统文件(如Windows的hosts),再查找路由器缓存,再查找ISP缓存,实在没有只能问递归服务器,进行DNS查询;如果网站使用了CDN,DNS解析时会返回一个CNAME,指向分配给你的CDN服务器URL,在对其进行DNS解析得到其IP地址。
  2. 浏览器作为客户端向解析出的IP发出HTTP请求(GET, POST, HEAD等)。
  3. 如果收到301、302、303状态码,浏览器根据Location字段进行重定向;如果收到101或302状态码,则进行HTTP -> HTTPS的转换;cookie保持会话身份,connection: keep-alive保持HTTP会话。
  4. 服务器解析请求,返回HTML。
  5. 浏览器解析HTML,渲染界面。
  6. 浏览器请求其他资源,如图片、JS、CSS、AJAX等。

TCP协议如何保证传输的可靠性

  • 数据包校验:确保数据在传输过程中未被篡改或损坏。
  • 乱序重排:接收方根据序列号将乱序的数据包重新排序。
  • 应答机制:接收方发送确认应答(ACK)告知发送方数据包已收到。
  • 超时重发:如果发送方未收到确认应答,则重发数据包。
  • 流量控制和拥塞控制:通过窗口机制控制数据流量和网络拥塞,避免网络拥堵。

GET和POST的区别

  • GET 请求资源,POST 更新资源。
  • GET 每次请求都返回相同资源结果,POST 每次请求返回的结果可能不同(资源可能被POST更新)。
  • GET 数据写在URL中,POST 数据写在请求体中(如application/x-www-form-urlencoded,multipart/form-data,application/json,text/xml)。
  • POST 相对安全,且参数不受URL长度限制的约束。

TLS握手过程

  1. 客户端生成随机数 sec_c,将自己支持的加密套件列表、压缩算法列表等明文发送给服务器。
  2. 服务器选择加密套件和算法,生成随机数 sec_s,将其与自己的证书(包含公钥)明文发送给客户端。
  3. 客户端验证证书合法性后,生成随机数 pre_c,使用服务器公钥加密 pre_c 并发送给服务器;客户端计算对称密钥 key = Func(sec_c, sec_s, pre_c)
  4. 客户端发送 change_cipher_spec,告知服务器以后通信使用该加密算法和 key
  5. 客户端用 key 加密之前所有通讯参数的 hash,并发送给服务器。
  6. 服务器用私钥解密得到 pre_c,根据协商好的算法计算 key,使用 key 解密并验证 hash。
  7. 验证通过后,服务器发送 change_cipher_spec,并用 key 加密服务器之前所有通讯参数的 hash。
  8. 客户端进行验证,通过后,即可安全传送数据。

TCP与UDP的区别

  • TCP 面向连接,UDP 无连接。
  • TCP 可靠传输,UDP 不可靠传输。
  • TCP 一对一,UDP 一对多、多对多、一对一。
  • TCP 有拥塞控制,UDP 不需要。
  • TCP 头部长度至少20字节,UDP 头部8字节。
  • TCP 面向字节流,UDP 面向数据报。

TCP拥塞控制

  • 慢开始(Slow Start):从小的拥塞窗口(cwnd)开始,指数增长,快速增加数据传输速率。
  • 拥塞避免(Congestion Avoidance):当cwnd达到一个阈值(ssthresh)时,开始线性增长,避免过度拥塞。
  • 快重传(Fast Retransmit):在接收到三个重复的ACK时,立即重传丢失的数据包,无需等待超时。
  • 快恢复(Fast Recovery):在快重传后,将ssthresh设置为cwnd的一半,并进入拥塞避免阶段,继续线性增长。

HTTP 1.0, HTTP 1.1, HTTP/2的区别

  • HTTP 1.0 与 HTTP 1.1
    • HTTP 1.1 引入了长连接(Keep-Alive),允许在一个TCP连接上进行多个HTTP请求和响应,减少了连接建立的开销。
    • 增加了更丰富的缓存处理机制,如 If-Unmodified-Since 和 If-Match
    • 增加了错误码,例如 410 Gone 表示资源已被永久删除。
    • 引入了 Host 头部字段,用于支持虚拟主机。
    • 引入了 Range 头部字段,可以请求资源的部分内容,支持断点续传。
  • HTTP 1.1 与 HTTP/2
    • HTTP/2 基于二进制协议,而 HTTP 1.1 基于文本,二进制协议更高效,更易于解析。
    • HTTP/2 支持多路复用,在一个连接中并行处理多个请求和响应,避免了 HTTP 1.1 的队头阻塞问题。
    • HTTP/2 支持服务器推送,服务器可以主动向客户端推送资源,而不仅仅是响应请求。
    • HTTP/2 通过头部压缩减少了重复头部信息的传输,提升了效率。

Content-Length与Transfer-Encoding: chunked

  • Content-Length:指定请求或响应体的长度。对于静态内容和已知长度的内容,使用 Content-Length 是有效的。
  • Transfer-Encoding: chunked:用于动态生成内容的情况下,服务器在响应头中指定 Transfer-Encoding: chunked,内容以块的形式传输。格式为 {chunk size}{\r\n}{chunk data}{\r\n},最后以 0 作为结束标志。这种方式允许服务器在不知道最终内容长度的情况下进行传输。

为什么Socket服务端需要bind?

在网络编程中,bind 操作用于将一个 socket 绑定到一个特定的协议、IP 地址和端口上。对于服务端,必须通过 bind 将 socket 绑定到指定的端口,以监听并接受来自客户端的连接请求。客户端则可以不进行绑定,操作系统会自动为客户端分配一个临时端口。

Socket的read/write与send/recv有何区别?

  • read/write 和 send/recv 是进行数据读写的操作,但它们有些许差别:
    • read/write 是标准I/O操作,不涉及网络协议细节,适用于文件、管道等。
    • send/recv 是用于网络通信的操作,适用于 socket,并且可以使用附加的 flag 参数来控制行为。
    • send/recv 的 flag 参数包括 MSG_OOB(处理带外数据),MSG_PEEK(窥视数据,但不移除),MSG_DONTROUTE(绕过路由),等。read/write 没有这些网络特定的选项。
    • send 和 recv 允许设置更多的网络控制选项,如数据包的发送和接收的优先级,是否为阻塞模式等。
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐