计算机网络
网络模型
应用层
-
应用层有哪些协议?
- HTTP
- HTTPS
- DNS
- DHCP
-
HTTP
超文本传输协议,由请求和响应构成,是无状态的(两次连接通信之间没有任何关系)
HTTP请求报文:请求行、请求头、请求体
HTTP响应报文:状态行、响应头、响应体- Session
会话,会话id是客户端的身份标志,存储在客户端浏览器中。HTTP本身是无状态的,之所以有session这个概念,主要是为了处理用户的连续请求(避免冗余的登录验证操作)。传统的做法是服务端也会保存一份用户的session_id,这样当客户端请求过来的时候,就可以进行比对判断出该请求是否来自合法用户(如果是就不再需要登录)。采取这种方式的缺陷是:当并发访问的用户数很大时,服务端要保存所有的session_id将是一笔巨大的开销,此外,对于分布式系统,session_id在主机之间的迁移也是一个很大的问题。 - Token
解决的方式是服务端加密生成一个token并发送给客户端,之后,客户端的每一次请求都携带这个token,这个token包含了用户信息。采用这种方式,服务端不需要保存session_id,每当有请求到来时,服务端只需要验证请求头携带的token和请求头携带的用户信息。本质上是一个时间换空间的做法。
HMAC-SHA256(用户名, 私钥)--> Base64 = Token - Cookie
客户端浏览器存放的一些来自服务端的信息(类似于token),降低服务端的存储压力。
- Session
-
HTTP 与 HTTPS
- HTTP 与 HTTPS 之间的区别是什么?
HTTPS 比 HTTP安全。HTTP 协议被认为不安全是因为传输过程容易被监听者勾线监听、伪造服务器,而 HTTPS 协议主要解决的便是网络传输的安全性问题。HTTPS 分为两个阶段,证书验证阶段和数据传输阶段,数据验证阶段采用了非对称加密,而数据传输阶段则采用了对称加密。
-
HTTPS 为什么安全?
关键在于证书验证阶段。假设不存在证书认证机构,任何人都可以制作证书,就会有很大的安全风险,例如经典的“中间人攻击”:由于缺少对证书的验证,所以客户端虽然发起的是 HTTPS 请求,但客户端完全不知道自己的网络已被拦截,传输内容被中间人全部窃取。
-
浏览器如何保证证书的合法性?
证书包含的信息:颁发机构信息、公钥、公司信息、域名、有效期、指纹等等。证书由权威机构审核认证,浏览器在发起HTTPS请求后,服务器会返回网站的SSL证书,浏览器对证书包含的信息进行验证、判断证书的来源是否合法(根据验证链查到根证书,与本地存储的权威机构的根证书进行对比校验)、判断证书是否被篡改、判断证书是否已吊销。 -
如果合法授权的证书被盗用会产生什么结果?
不会产生安全风险。虽然证书是合法的,但证书中包含的公钥是合法服务器的公钥,无法更换成非法服务器的公钥(否则证书就会被浏览器鉴定为非法的)。这样非法服务器无法通过它的私钥来解密客户端产生的随机数。 -
数据传输阶段为什么要改用对称加密?
非对称加密的效率太低
- HTTP 与 HTTPS 之间的区别是什么?
传输层
-
TCP和UDP的区别?
TCP是面向连接的可靠传输协议,而UDP是无连接不可靠的传输协议 -
TCP的可靠性怎么保证?
- 序列号和确认应答,发送报文会携带一个序列号,接收方接收后累积确认,响应报文会携带ACK
- 流量控制,采用滑动窗口协议,调整发送方的发送速率以适应接收方的接收速率
- 拥塞控制,当网络发生拥塞导致数据报丢失时,发送方会降低发送速率以缓解网络的拥塞状况
- 提供校验和,TCP数据报的首部会携带校验和,接收方收到后会进行校验
- 连接管理,三次握手和四次挥手机制确保可靠连接
-
拥塞控制有哪些手段?
-
超时间隔加倍
最简单的措施,设置一个定时器,如果超过定时时间没有收到确认报文,就重置定时器并重新计时,如果重置次数达到设置上限,就断开连接 -
Reno
- 慢启动,拥塞窗口从零开始指数增长,当出现丢包时,设置阈值为此时窗口大小的一半,并重新从零开始慢启动,当达到阈值时,进入拥塞避免状态
- 拥塞避免,进入拥塞避免状态,拥塞窗口每一个往返时间增长一,直到出现丢包,将阈值设为当前值得一半,如果导致丢包的原因是超时,就重新进入慢启动状态,如果导致丢包的原因是冗余ACK,就进入快速恢复阶段
- 快速恢复,进入快速恢复阶段,拥塞窗口从阈值开始增长,此外,行为与拥塞避免阶段相同
-
CUBIC
对于高带宽、高延时的网络传输,Reno没办法充分利用网络带宽,这是因为在进入拥塞避免阶段之后,拥塞窗口每经过一个RTT才增加1,拥塞窗口的增长太慢,如果数据流很短,可能拥塞窗口还没增长到一个BDP(带宽延时积),数据流就结束了,这种情况下带宽的利用率就非常低。
BIC 采用二分搜索的方式到达之前丢包的满载窗,再采用对称的方案做最大容量的探测。这种方式加速了拥塞窗口的增长,却带来了公平性的问题,不同连接能探测并占用到的最大带宽与它们的 RTT 有很大关系。
CUBIC 解决了 BIC 的公平性问题,它设计了一条与 BIC 相近的三次曲线,该曲线是绝对时间到拥塞窗口大小的映射,所以探测过程不再与 RRT 相关。 -
BBR
-
-
Reno 的 ssthresh 是什么含义?为什么探测到丢包的时候,ssthresh会被设置为当前窗口的一半?
在慢启动阶段,传输是激进的,每收到一个ACK,cwnd就增加1;
在拥塞避免阶段,传输是保守的,每经过一个不丢包的RRT,cwnd才增加1。
ssthresh 其实是网络满载容量的一半。网络满载容量 = 网络链路上能容纳的数据包数量 = 链路带宽 × 往返延迟
Reno 认为在 N~2N 之间,网络是很有可能发生拥塞的,所以在窗口增加到 N 之后,开始加性增。
此外,为了保证公平,不同用户的降窗比例得是相同的,Reno 的设定是0.5也是非常合理的。
TCP核心概念-慢启动,ssthresh,拥塞避免,公平性的真实含义 -
流量控制与拥塞控制的不同之处?
流量控制的目的是调整发送方的发送速率以适应接收方的接收速率,而拥塞控制的目的则是在网络发生拥塞导致数据报丢失的情况下,发送方降低发送速率以缓解网络的拥塞状况
网络层
- 网络层有哪些协议?
-
IP
-
ICMP
传输控制信息或者说是通过差错报告来辅助网络层通信,主要功能是验证网络是否畅通以及辅助IP协议实现可靠传输ping
用来测试数据报能否到达特定主机,源主机发送 ICMP echo 请求,并等待接收回应数据报,程序会按相应时间和响应成功次数来估计往返时间和丢包率。traceroute
源主机发送一系列UDP报文,这些报文的TTL值分别为1, 2, 3...... 报文的目的端口是不可达的,这样从源主机到目的主机之间的每一个经过的路由器都会观察到一个过期的报文,然后发送一个对应的警告报文给源主机,而目的主机则会发送一个端口不可达的 ICMP 报文给源主机,源主机在收到这个报文后,就不再发送嗅探报文了。通过这样一个过程,源主机就能够知道它与目的主机之间路由器的数量和标识,以及两台主机之间的往返时间。 -
IGMP
互联网组管理协议,在接收者主机和与其直接相邻的组播路由器之间建立和维护组播组成员关系 -
OSPF
开放最短路优先。一台路由器构建了一幅关于整个自治系统的完整拓扑图,然后通过 Dijkstra 算法确定最低开销路径 -
BGP
边界网关协议。本地偏好(策略)-->最短路径(AS跳数)-->热土豆(选择最近的网关路由器)-->BGP标识符
-
- AS间和AS内部的路由选择协议为什么不同?
- AS间策略起到主导作用,而性能则是次要的,可能一个AS产生的流量不能穿过另一个特定的AS,而在同一个AS中则不必考虑这些
- 选择哪一个路由选择算法需要考虑可扩展性,也就是网络规模的问题,一个AS如果太大可以分成多个。所以AS内的路由选择算法不太需要考虑可扩展性,而AS间的路由选择算法则需要考虑
链路层
- 链路层的作用是什么?
链路层的主要功能是将数据报传递到相邻节点 - 链路层有哪些功能?
- 封装成帧和透明传输:根据不同的物理链路,封装不同的帧首和帧尾,并且接收方能够区别出帧首和帧尾
- 差错检测:通过一些编码方式来进行检错和纠错
- 流量控制和可靠传输:类似于TCP的端到端流量控制和可靠传输
- 链路接入:媒体访问控制协议规定帧在链路上的传输规则,协调多个节点的帧传输,解决多路访问问题
物理层
- 物理层的作用是什么?
将上层数据报通过物理媒介进行传输
综合问题
-
在浏览器地址栏输入网址开始到显示内容的过程中发生了什么?
- 如果输入的是一个域名,首先要进行DNS域名解析
- 得到域名对应的IP地址后,与服务器创建TCP连接
- 发送HTTP请求报文,服务器响应后发送网站内容,客户端接收HTTP响应报文,浏览器解析报文内容并渲染
- 结束数据传输后断开TCP连接
-
send 函数底层如何实现?
应用层->传输层->网络层->链路层->物理层
首先send函数是在应用层,待传输的数据会在传输层添加TCP报头后交付给网络层,TCP报头主要包含端口号、序列号、接收窗口、校验和、标志位等信息,在网络层添加IP报头后交付给链路层,IP报头主要包含源地址和目的地址,在链路层封装成帧后交付给物理层,一般常见的是以太网帧,物理层最后将数据报通过物理媒介进行传输。 -
多进程发送数据到网卡存在竞争?如何解决?
IP协议栈与网卡之间存在用于发送和接收的 ring buffer。需要发送时,各进程会异步地把待发送数据放入 ”发送 ring buffer“,并通过修改网卡的发送寄存器告知网卡用DMA的方式正确地依次读取帧;当网卡接收到数据报后会以DMA的方式将帧放入 ”接收 ring buffer“ ,并产生网卡中断,在中断程序中将 ”接收 ring buffer“ 中的帧传递给网络协议栈,同时更新网卡的接收寄存器。
QUEUEING IN THE LINUX NETWORK STACK