在网络的世界里,无论是前端开发还是后端架构,网络知识都是程序员不可或缺的一环。今天我们就来梳理一下那些面试中常常被问及的网络相关知识点。
目录
什么是SYN Flood攻击?如何防御?
SYN Flood攻击是一种拒绝服务攻击,攻击者通过发送大量的SYN请求,使服务器处于半开放连接状态,消耗服务器资源。防御方法包括使用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的特点
- 基于分布式的链路状态
- 泛洪式通知所有网络中路由器信息
- 只告诉与自己相连的邻居路由器的链路状态
- 只有链路发生变化时,才进行信息交换
- 每个路由器都知道全网的拓扑结构
在浏览器中输入网址后执行的全部过程
- 解析DNS,首先查找浏览器缓存,再查询系统文件(如Windows的hosts),再查找路由器缓存,再查找ISP缓存,实在没有只能问递归服务器,进行DNS查询;如果网站使用了CDN,DNS解析时会返回一个CNAME,指向分配给你的CDN服务器URL,在对其进行DNS解析得到其IP地址。
- 浏览器作为客户端向解析出的IP发出HTTP请求(GET, POST, HEAD等)。
- 如果收到301、302、303状态码,浏览器根据Location字段进行重定向;如果收到101或302状态码,则进行HTTP -> HTTPS的转换;cookie保持会话身份,connection: keep-alive保持HTTP会话。
- 服务器解析请求,返回HTML。
- 浏览器解析HTML,渲染界面。
- 浏览器请求其他资源,如图片、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握手过程
- 客户端生成随机数 sec_c,将自己支持的加密套件列表、压缩算法列表等明文发送给服务器。
- 服务器选择加密套件和算法,生成随机数 sec_s,将其与自己的证书(包含公钥)明文发送给客户端。
- 客户端验证证书合法性后,生成随机数 pre_c,使用服务器公钥加密 pre_c 并发送给服务器;客户端计算对称密钥 key = Func(sec_c, sec_s, pre_c)。
- 客户端发送 change_cipher_spec,告知服务器以后通信使用该加密算法和 key。
- 客户端用 key 加密之前所有通讯参数的 hash,并发送给服务器。
- 服务器用私钥解密得到 pre_c,根据协商好的算法计算 key,使用 key 解密并验证 hash。
- 验证通过后,服务器发送 change_cipher_spec,并用 key 加密服务器之前所有通讯参数的 hash。
- 客户端进行验证,通过后,即可安全传送数据。
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 允许设置更多的网络控制选项,如数据包的发送和接收的优先级,是否为阻塞模式等。