大家好,我是温大大

最近温大大又又又整理了:万字网络协议方面的总结

主要覆盖:网络基础、TCP/UDP 高频面试题、HTTP 协议、Cookis/session、滑动窗口机制等知识点。

这次「网络八股文」配合前两次

Linux 万字总结

Mysql 入门到入土

这样同学们的基础八股文算是覆盖全了:数据库、Linux、网络 就像凑齐七龙珠能召唤 1 个神龙许愿 1 个愿望一样,如果你好好的阅读下温大大这三篇文章, 保证你能实现「涨薪」愿望呀。

温大大的肝算是快到爆穿了,只求各位同学帮忙一键三连:点赞、在看、转发

目录

  1. 网络分层基础
  1. TCP 高频面试题
  1. HTTP 协议
  1. 传输 & 解析
  1. 缓存技术
  1. 网络异常处理

0. 网络分层基础

0.1 OSI 七层模型 与 TCP 五层模型

OSI 七层模型:


TCP 五层模型:

0.2 五层模型 vs 网络协议有哪些?

0.3 什么是面向有连接 vs 面向无连接

面向有连接

面向无连接型

0.4 UDP 和 TCP 的区别是什么?

相同:

区别:

0.5 TCP 对应的应用层协议有哪些?

FTP:文件传输协议; SSH:远程登录协议; HTTP:web 服务器传输超文本到本地浏览器的超文本传输协议。 UDP 对应的典型的应用层协议:

0.6 UDP 对应的应用层协议有哪些?

DNS:域名解析协议; TFTP:简单文件传输协议; SNMP:简单网络管理协议。

1. TCP 高频面试题

1.1 TCP 三次握手(快速理解)

三次握手大概就是这么个过程。

至此,完成了握手过程,A 知道 B 能收能发,B 知道 A 能收能发,通信连接至此建立。 三次连接是保证可靠的最小握手次数,再多次握手也不能提高通信成功的概率,反而浪费资源。

1.2 TCP 三次握手(深度理解)

备注:

第一次握手:

总结:A 发(SYN=1,seq=x)到 B


第二次握手:

总结:B 发(SYN=1, ACK=1, seq=y, ack=x+1)到 A


第三次握手:

1.3 TCP 两次握手可以吗?

不可以。

1.4 TCP 四次挥手(快速理解)

那为什么需要四次挥手呢?请看如下过程:

1.5 TCP 四次挥手(深度理解)

1.6 TCP 第四次挥手为什么要等待 2MSL?

保证 A 发送的最后一个 ACK 报文段能够到达 B。

防止已失效的连接请求报文段出现在本连接中。

2. HTTP 协议

2.1 HTTP 协议的特点?

2.2 HTTP 报文格式

2.3 HTTP 状态码有哪些?

2.4 HTTP POST 和 GET 的区别?

2.5 HTTP 长连接和短连接?

短连接

长连接


长链接使用场景


短链接使用场景

2.6 HTTP 1.1 和 HTTP2.0 的区别?

区别 1: 解析协议不同

区别 2: HTTP2.0 采用多路复用 (Mutiplexing)

区别 3: http2.0 header 压缩:

区别 4: http2.0 服务端推送 (server push):

2.7 HTTPS 与 HTTP 的区别?

2.8 HTTPS 原理(快速理解)

HTTPS 默认工作在 TCP 协议 443 端口,它的工作流程一般如以下方式:

2.9 HTTPS 原理(深入理解)

1、客户端发起 HTTPS 请求

2、服务端的配置

3、传送证书

4、客户端解析证书

5、传送加密信息

6、服务端解密信息

7、传输加密后的信息

8、客户端解密信息

3. 传输 & 解析

3.1 什么是数字证书?

简介

制作过程


浏览器验证过程

3.2 DNS 的解析过程?

3.3 浏览器中输入 URL 返回页面过程?

3.4 什么是对称加密和非对称加密?

4. 缓存技术

4.1 什么是 cookie 和 session?

什么是 Cookie(客户端技术)


什么是 Session(服务端技术)

4.2 Cookie 和 Session 的区别?

5. 网络异常处理

5.1 滑动窗口机制

在 TCP 协议当中窗口机制分为两种:

固定窗口存在的问题


因此,我们引入了滑动窗口

1.滑动窗口概述

2.工作原理


3.死锁状态

(1)概述:

(2)解决方法


4.TCP 报文段的发送时机(传输效率问题)

可以用以下三种不同的机制控制 TCP 报文段的发送时机:

(1)TCP 维持一个变量 MSS,等于最大报文段的长度。只要缓冲区存放的数据达到 MSS 字节时,就组装成了一个 TCP 报文段发送出去

(2)由发送方的应用进程指明要发送的报文段,即:TCP 支持推送操作

(3)发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不能超过 MSS)发送出去。

5.2 详细讲一下拥塞控制?

一、为何要进行拥塞控制?


二、如何知道网络的拥塞情况?

1、先发送一个数据包试探下,如果该数据包没有发生超时事件 (也就是没有丢包)。那么下次发送时就发送 2 个,如果还是没有发生超时事件,下次就发送 3 个,以此类推,即 N = 1, 2, 3, 4, 5.....

2、一个一个增加实在是太慢了,所以可以刚开始发送 1 个,如果没有发生超时时间,就发送 2 个,如果还是没有发送超时事件就发送 4 个,接着 8 个...,用翻倍的速度类推,即 N = 1, 2, 4, 8, 16...

无论是第一种方法还是第二种方法,最后都会出现瓶颈值。不过这里值得注意的是,第一种情况的增长速率确实有点慢,但是第二种情况以指数增长,增长速度有点太快了,可能一下子就到瓶颈值了。

为了解决这个过慢或过快的问题,我们可以把第一种方法和第二种方法结合起来。也就是说,我们刚开始可以以指数的速度增长,增长到某一个值,我们把这个值称之为阈值吧,用变量 ssthresh 代替。当增长到阈值时,我们就不在以指数增长了,而是一个一个线性增长。

所以最终的策略是:前期指数增长,到达阈值之后,就以一个一个线性的速度来增长。

(注:8 之后其实是直线的,那里只是弯曲了一下)

我们也把指数增长阶段称之为慢启动,线性增长阶段称之为拥塞避免

三、到了瓶颈值之后怎么办? 无论是指数增长还是一个一个增长,最终肯定会出现超时事件,总不可能无限增长吧。当出现超时事件时,我们就认为此时网络出现了拥塞了,不能再继续增长了。我们就把这个时候的 N 的值称之为瓶颈值吧,用 MAX 这个字母来代替吧,即最大值。

注:这里再次提醒阈值过后是一个一个线性增长,图中之所以弯曲是因为我画图原因导致的

当达到最大值 MAX 之后,我们该怎么办呢?

当到达最大值之后我们采取的策略是这样的:

我们就回到最初的最初的状态,也就是说从 1,2,4,8.....开始,不过这个时候我们还会把 ssthresh 调小,调为 MAX 值的一半,即 ssthresh = MAX / 2。

图中阈值为 8,瓶颈值是 14;超时事件发生后,阈值为 14 / 2 = 7。

四、超时事件就一定是网络拥塞? 超时事件发送就一定是网络出现了拥堵吗?其实也有可能不是出现了网络拥堵,有可能是因为某个数据包出现了丢失或者损害了,导致了这个数据包超时事件发生了

为了防止这种情况,我们是通过冗余 ACK 来处理的。我们都知道,数据包是有序号的,如果 A 给 B 发送 M1, M2, M3, M4, M5...N 个数据包,如果 B 收到了 M1, M2, M4....却始终没有收到 M3,这个时候就会重复确认 M2,意在告诉 A,M3 还没收到,可能是丢失

当 A 连续收到了三个确认 M2 的 ACK,且 M3 超时事件还没发生。A 就知道 M3 可能丢失了,这个时候 A 就不必等待 M3 设置的计时器到期了,而是快速重传 M3。并且把 ssthresh 设置为 MAX 的一半,即 ssthresh = MAX/2,但是这个时候并非把控制窗口 N 设置为 1,而是让 N = ssthresh,N 在一个一个增长。

我们也把这种情况称之为快速恢复。而这种具有快速恢复的 TCP 版本称之为 TCP Reno。

还有另外一种 TCP 版本,无论是收到三个相同的 ACK 还是发生超时事件,都把拥塞窗口的大小设为 1,从最初状态开始,这种版本的 TCP 我们称之为 TCP Tahoe。

5.3 拥塞避免

5.4 快重传

5.5 快恢复

关注我,加我好友拉你进面试群,一起讨论面试干货 / 套路, 大家一起升职加薪,关注公众号:测试猿温大大


↙↙↙阅读原文可查看相关链接,并与作者交流