题干参考自: 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支持多播广播。
- 端到端不可靠数据报。
- 头部短。系统资源占用少。
网络层
- 协议:IP,ICMP,ARP,RARP
- 设备:路由器(突破局域网,实现全网段互联,划分广播域)
- ARP和RARP工作原理 两个不同网段的IP地址,能ping通,但是为什么不能在ARP上找到另一个的MAC地址? - 车小胖的回答 - 知乎
数据链路层
- 以太网协议(交换式以太网 / 传统同轴电缆以太网)
- 交换机、网桥:根据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,SYN,FIN。
- 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 到底有什么区别? - 大宽宽的回答 - 知乎
- GET是幂等的,即读取同一个资源总是得到相同的数据,POST不是幂等的;
- GET一般用于从服务器获取资源,而POST有可能改变服务器上的资源;
- GET请求(包括参数)可被保存到收藏夹,POST则不可以
- GET请求的数据明文附在URL之后;POST请求的数据在HTTP body中;
- GET只允许ASCII字符,POST对数据类型没有要求,也允许二进制数据;
- 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值
连接过程
- 客户端向服务器发送请求,同时发送客户端支持的一套加密规则(包括对称加密、非对称加密、摘要算法);
- 服务器从中选出一组加密算法与Hash算法,并将自己的证书和加密公钥发送给客户端;
- 客户端验证服务器的证书,包括:证书是否过期,CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配;
- 客户端生成一个随机密钥(用于对称算法),使用Hash算法对握手消息进行摘要计算,并将随机密钥和摘要一起用服务器提供的公钥加密发送给服务器;
- 服务器使用自己的私钥解密,得到对称加密的密钥,用这个密钥解密出Hash摘要值,并验证握手消息是否一致;如果一致,服务器使用对称加密的密钥加密握手消息发给客户端;
- 客户端解密并验证摘要,若一致,则握手结束。之后的数据传送都使用对称加密的密钥进行加密
从HTTP自动切换到HTTPS
- 原始的302跳转:服务器把所有的HTTP流量跳转到HTTPS。但中间人可能在第一次访问站点的时候就劫持。
- 引入HSTS机制:在服务器返回给浏览器的响应头中,增加Strict-Transport-Security这个HTTP Header,告诉浏览器,在接下来1年内,对于当前域名及其子域名的后续通信应该强制性的只使用HTTPS。