计算机网络复习自用

370 阅读11分钟

题干参考自: www.nowcoder.com/discuss/573…
然后自己填充了答案以及有价值的好文链接

1 OSI七层协议、TCP/IP四层协议

www.runoob.com/w3cnote/sum…
7层模型是最细化的模型。4层模型是TCP/IP实际使用的模型。5层模型常用于教学。

2 各层对应的网络设备和协议

应用层协议
  • FTP(21端口(控制)):文件传输协议
  • SSH(22端口):远程登陆
  • TELNET(23端口):远程登录
  • SMTP(25端口):发送邮件
  • POP3(110端口):接收邮件
  • HTTP(80端口):超文本传输协议
  • DNS(53端口):运行在UDP上,域名解析服务
传输层(TCP/UDP)
  • TCP
    • 建立连接。三次握手四次挥手。
    • 端到端可靠字节流。
    • 保证正确,有序,不丢包。有拥塞控制等机制。
  • UDP
    • 无连接。UDP支持多播广播。
    • 端到端不可靠数据报。
    • 头部短。系统资源占用少。
网络层
数据链路层
  • 以太网协议(交换式以太网 / 传统同轴电缆以太网)
  • 交换机、网桥:根据MAC地址将帧转运到正确的端口(交换机就是多端口网桥)(划分冲突域
物理层
  • 集线器(hub)、中继器(repeater):类似导线互通,在同一冲突域

3 数据链路层的CSMA/CD协议

802.11协议精读3:CSMA/CD与CSMA/CA - 徐方鑫的文章 - 知乎

  • CSMA/CA
    • 未必信道空闲就传输(0/1/p-坚持)
    • 避免冲突,不能检测到冲突的发生
    • 使用ACK判断传输成功
  • CSMA/CD
    • 只要信道空闲就传输
    • 检测到冲突立即止损
    • 没有检测到冲突或JAM信号判断传输成功

5 TCP三次握手和四次挥手

三次握手

三次握手

为什么不能两次握手?

两次握手 = 就是只要 server 发出确认,新的连接就建立了。

  • 这不能验证client接收到了server第二次握手的报文,不能保证双方成功交换了序列号。
  • 网络中可能流窜着已失效的“第一次握手”报文段。如果两次握手,server会傻傻地建立连接,等待 client 发来数据,浪费计算资源。而在三次握手协议下,server在重发五次之后自动关闭连接进入CLOSED状态。
四次挥手

四次挥手

不辞而别?

服务器若2小时还没有收到客户端的任何数据,就会发送最多10个探测报文,若客户端仍没反应,服务器就认为客户端出了故障,接着就关闭连接。

6 TCP首部

zhuanlan.zhihu.com/p/108822858

  • 序号seq:用于对字节流进行编号,例如序号为 301,表示第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401。
  • 确认号:期望收到的下一个报文段的序号。例如 B 正确收到 A 发送来的一个报文段,序号为 501,携带的数据长度为 200 字节,因此 B 期望下一个报文段的序号为 701,B 发送给 A 的确认报文段中确认号就为 701。
  • 窗口:接受窗口(通告窗口)的大小是根据自己的资源情况动态调整的,在返回ACK时将接受窗口大小放在TCP报文中的窗口字段告知发送方。
  • 控制位:八位从左到右分别是 CWR,ECE,URG,ACK,PSH,RST,SYNFIN
  • ACK:该位设为 1,确认应答的字段有效,TCP规定 除了最初建立连接时的 SYN 包 之外该位必须设为 1
  • SYN:用于建立连接,该位设为 1,表示希望建立连接,并在其序列号的字段进行序列号初值设定
  • FIN:该位设为 1,表示今后不再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位置为 1 的 TCP 段。

7 差错控制

主要使用校验和、确认、超时重传这三个工具进行差错控制

  • 数据正确:校验和
  • 顺序正确:用序列号对失序数据包重新排序
  • 发包重复:丢弃重复数据
  • 发包缺失:确认号(ACK) + 超时重发

7.1停止等待协议、连续ARQ协议

  • 停等ARQ协议(stop-and-wait)
  • 连续ARQ协议(Continuous ARQ)
    • 回退N帧ARQ协议(Go-Back-N
    • 选择性重传ARQ协议(Selective Repeat
回退N帧ARQ协议

如果前一个帧在超时时间内未得到确认,就认为丢失或被破坏,需要重发出错帧及其后面的所有数据帧。这样有可能有把正确的数据帧重传一遍,降低了传送效率。

发送窗口为n,接收窗口为1. In Go-Back-N ARQ, the maximum size of the send window is 2^n -1, the size of the receiver window is always 1. (n:序号位数)

选择性重传ARQ协议

接收端只把出错的的帧丢弃,其后面的数据帧保存在缓存中,并向发送端回复NAK(非确认帧)。发送端接收到NAK时,只发送出错的帧。选择重传协议可以避免重复传送那些正确到达接收端的数据帧。但是接收端要设置具有相当容量的缓存空间,这在许多情况下是不够经济的。

In Selective Repeat ARQ, the maximum size of the send window is 2^(n-1)!!! 同样大小的window,SR要使用Go-Back-N两倍的序号空间!

8 流量控制

处理拥塞

  • cwnd: 拥塞窗口。发送方能发的余量。不能超过rwnd.
  • ssthresh: 慢启动门限
  • 最终数据发送的字节数,将根据通告窗口和拥塞窗口的较小值作为上限
  • 很多时候,丢包是出现网络波动的意外情况,此时网络并没有拥塞。因此不必重新回到慢启动状态。这就是快恢复
  • 快恢复是配合快重传使用的。收到三个连续的ack后,设置ssthresh为当前的一半。然后设置cwnd = ssthresh. (有的快重传是把开始时的拥塞窗口cwnd值再增大一点,即等于 ssthresh + 3 * MSS,因为之前已经接收到了3个ACK)
  • 快重传是相对于超时重传来说的。因为超时确认引起的数据包丢失,那网络怕是真的拥塞了。那么cwnd将会被初始化为1个报文段,开始慢启动。

相关窗口

  • 发送窗口
    • 发送端的发送窗口swnd不能超过拥塞窗口 cwnd接收端窗口 rwnd 中的最小值
    • 包括待确认待发送的报文段

  • 接收窗口
    • 大小为rwnd
    • 有时被简称滑动窗口

9 从浏览器输入url到加载出页面发生了什么

当你在浏览器输入 baidu.com 并按下回车后发生了什么? - Aceyclee的文章 - 知乎

  • DNS 得到 IP (本地,递归查询,迭代查询)
  • 浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立TCP连接;
  • 客户端对服务器发出HTTP请求(HTTPS的话还需提前商议密匙)
  • 服务器接收到这个请求,并根据路径参数,映射到特定的请求处理器,将处理结果及相应的视图返回给浏览器;
  • 浏览器解析HTML,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤向服务器请求这些资源;
  • 浏览器完成渲染页面

10 HTTP的版本

10.1 HTTP1.0和1.1

  • HTTP1.1支持长连接HTTP Multiplexing):在一个TCP链接上可以传送多个http请求和响应.这样就不用多次建立和关闭TCP连接了
  • http协议http1.0_http1.1_http2.0的区别 - 我要鹿鹿鹿的文章 - 知乎
  • 在HTTP 1.0中,客户端的每一个HTTP请求都必须通过独立的TCP连接进行处理,而在HTTP 1.1中,对这种方式进行了改进。
  • 客户端可以在一个TCP连接中发送多个HTTP请求,这种技术叫做HTTP复用HTTP Multiplexing)。
  • 它与TCP连接复用最根本的区别在于
    • TCP连接复用是将多个客户端的HTTP请求复用到一个服务器端TCP连接上,
    • 而HTTP复用则是一个客户端的多个HTTP请求通过一个TCP连接进行处理。
    • 前者是负载均衡设备的独特功能;
    • 而后者是HTTP 1.1协议所支持的新功能,目前被大多数浏览器所支持。

10.2 从HTTP1到HTTP2

  • HTTP1的解析是基于文本协议的各式解析,而HTTP2.0的协议解析是二进制格式.
  • HTTP2支持多路复用(Mutiplexing) : 一个连接上可以有多个request,使用每个request不同的request_id来辨别.
  • 多路复用的优势:在HTTP/2中,客户端向服务器请求页面的过程中,只会创建一条TCP连接,即使这页面可能包含上百个资源。而之前的HTTP/1.x一般会创建6-8条TCP连接来请求这上百个资源。单一的连接应该是HTTP2的主要优势。
  • HTTP 2 的新特性你 get 了吗? - 贺嘉的文章 - 知乎

11 GET和POST区别

GET 和 POST 到底有什么区别? - 大宽宽的回答 - 知乎

  1. GET是幂等的,即读取同一个资源总是得到相同的数据,POST不是幂等的;
  2. GET一般用于从服务器获取资源,而POST有可能改变服务器上的资源;
  3. GET请求(包括参数)可被保存到收藏夹,POST则不可以
  4. GET请求的数据明文附在URL之后;POST请求的数据在HTTP body中
  5. GET只允许ASCII字符,POST对数据类型没有要求,也允许二进制数据;
  6. GET的长度有限制(操作系统或者浏览器),而POST数据大小无限制

12 DNS解析的过程

递归 迭代

13 HTTPS

  • http协议运行在TCP协议之上,传输的内容都是明文传送,安全性较差
  • HTTPS实际上就是HTTP穿上了SSL/TLS的外套.
  • SSL(安全套接字)与TLS(运输层安全)是运行在TCP层之上的。可以认为是在应用层的下方插了一个“安全层”
  • 一般情况下,我们只单向SSL(client验证server身份),server之间的交流会使用 two-way ssl.

一文带你了解HTTPS - 杨素的文章 - 知乎
让面试官膜拜你的HTTPS运行流程(超详细) - 噜噜呀的文章 - 知乎
SSL Handshake explained

  • 明文传输问题:非对称算法传播对称密匙
  • 中间人攻击:使用CA证书验证身份
    • 比如说Google需要向用户证明自己是Google,就找一家靠谱的CA为Google签发一张数字证书(Certificate)。在证书上,记载着Google的所有身份信息,和一个CA签下的数字签名(Signature)。CA的私钥(Private Key)就是CA手里的那根签字笔。(Gh0u1L5: CA 机构是如何保护自己私钥的?
  • 数据篡改问题:使用数字签名验证Hash值
连接过程
  1. 客户端向服务器发送请求,同时发送客户端支持的一套加密规则(包括对称加密、非对称加密、摘要算法);
  2. 服务器从中选出一组加密算法与Hash算法,并将自己的证书和加密公钥发送给客户端;
  3. 客户端验证服务器的证书,包括:证书是否过期,CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配;
  4. 客户端生成一个随机密钥(用于对称算法),使用Hash算法对握手消息进行摘要计算,并将随机密钥和摘要一起用服务器提供的公钥加密发送给服务器;
  5. 服务器使用自己的私钥解密,得到对称加密的密钥,用这个密钥解密出Hash摘要值,并验证握手消息是否一致;如果一致,服务器使用对称加密的密钥加密握手消息发给客户端;
  6. 客户端解密并验证摘要,若一致,则握手结束。之后的数据传送都使用对称加密的密钥进行加密
从HTTP自动切换到HTTPS
  1. 原始的302跳转:服务器把所有的HTTP流量跳转到HTTPS。但中间人可能在第一次访问站点的时候就劫持。
  2. 引入HSTS机制:在服务器返回给浏览器的响应头中,增加Strict-Transport-Security这个HTTP Header,告诉浏览器,在接下来1年内,对于当前域名及其子域名的后续通信应该强制性的只使用HTTPS。