1. OSI 七层模型
- 物理层:光电信号的传递
- 数据链路层:数据帧的传送和识别
- 网络层:路由管理和地址管理
- 传输层:数据传输
- 会话层:通信管理
- 表示层:固有数据格式和标准数据格式的转换
- 应用层:与应用程序的沟通
2. TCP/IP 四/五层模型
- 物理层:集线器
- 数据链路层:交换机、无线LAN
- 网络层:IP、ICMP、ARP
- 传输层:TCP、UDP、SCTP、DCCP
- 应用层:DNS、HTTP、FTP、SMTP
3. 封装和分用
封装类似发送快递包裹,从内到外打包
分用类似拆快递包裹,从外到内拆
- 应用层:使用FTP包装
- 传输层:使用TCP包装
- 网络层:使用IP包装
- 数据链路层:使用数据帧包装
4. 三次握手、四次挥手
- 三次握手示意图
三次握手的目地是建立可靠的通信信道,让双方确认自己与对方的发送和接受是正常的
第二次握手传回了ACK,为什么还要传回SYN?
接收端发送ACK ,是为了告诉发送端,我接收到的消息确实就是你所发送的信号了,表明了发送端- > 接收端的通信是正常的,而回传SYN是为了建立并确认 接收端- >发送端的通信
- 四次挥手示意图
- 客户端发送FIN,用来关闭客户端到服务端的数据传送
- 服务端发回一个ACK,确认序列号为收到的序号+1
- 服务器发送FIN,用来关闭服务端到客户端的连接
- 客户端发回一个ACK,确认序列号为收到的序号+1
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后,进入半关闭状态,当另一方发出连接释放的通知,对方确认后就可以完全的关闭TCP连接
举个栗子:
A和B打电话,A说“我没啥要说的了”,B说“好的,我知道了”,但是B可能还有要说的话,A不能要求B跟着自己的节奏挂电话,于是B又说了一通,最后B说“我说完了”,A说“我知道了”,这样通话才算结束
5. TCP和UDP的区别
- TCP是面向连接,可靠性的传输,UDP是无连接,不可靠传输
- TCP用字节流传输,UDP使用数据报文传输
- TCP传输慢,UDP传输快
- TCP应用于需要通信数据可靠,比如文件传输,邮件传输
- UDP应用于需要通信速度高,比如视频,语音,广播,直播
6. TCP 协议如何保证可靠传输
- 应用数据被分割成TCP认为最适合发送的数据块
- TCP给每一个数据包都进行编号,接收方将数据包排序,把有序数据传给应用层
- 校验和:TCP将保持它首部和数据的校验和
- TCP的接收端会丢弃重复的数据
- 流量控制:TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端的缓冲区能接纳的数据,当接收方来不及处理时,就提示发送方减缓发送的速率,防止包丢失。TCP使用的流量控制的协议是可变大小的滑动窗口协议
- 拥塞控制:当网络拥塞时,减少数据的发送
- 超时重传:当TCP发送一个段后,它启动一个定时器,等待目地端确认收到这个报文段,如果不能及时收到一个确认,将重新发送
- ARQ协议:原理是 每发完一个分组就停止发送,等待对方确认,在收到确认后再发下一组
7. 拥塞控制
因为网络上有很多计算机,可能当前的网络状态就比较拥堵,在不清楚网络状态下,贸然发送大量的数据,是有可能引起雪上加霜的 。所以为了进行拥塞控制,TCP发送端要维持一个拥塞窗口的变量
- TCP的拥塞控制采用了慢启动机制,先发少量的数据探探路,摸清网络的状态,然后再决定按照多大的传输数据
- 发送开始的时候,窗口大小设置为0,
- 拥塞窗口大小呈指数级别增长
- 引入一个叫做慢启动的阈值
- 当窗口大小呈指数增长到阈值时,按照线性增长的方式增长
- 在每次超时重传的时候,慢启动阈值会变为原来的一半,窗口大小也变为1
少量的丢包,仅仅是触发了超时重传,大量的丢包,就认为是网络拥塞
8. 在浏览器中输入 url 地址,到显示主页的过程
- 浏览器通过DNS协议查找域名对应的IP地址
- 浏览器会向web服务器发送HTTP请求
- 服务器处理请求
- 服务器发回一个HTML响应
请求发起后,浏览器首先要解析这个域名,他先会查看本地文件,如果本地文件中有的话,就直接使用本地文件中对应的ip地址
如果本地文件没有这个对应的ip,浏览器就会发送一个DNS请求到本地DNS服务器,请求到达本地DNS服务器后,本地DNS服务器首先会查询它的缓存记录,如果缓存中有这个记录,就可以直接返回结果,这个过程是按照递归的方式进行查询,如果没有,本地DNS服务器会向DNS根服务器进行查询
DNS根服务器没有记录具体的域名和ip的对应关系,而是告诉DNS本地服务器,你可以到域服务器上去继续查询,并给出域服务器的地址
本地DNS服务器继续向域服务器发出请求,域服务器收到请求后,也不会直接返回域名与ip的对应关系,而是告诉本地DNS服务器,域名解析服务器地址
最后,本地DNS服务器向域名的解析服务器发出请求,这时就收到了域名对应的ip地址,本地DNS服务器不仅要把域名与ip的对应关系返回给用户电脑,还要把这个对应关系保存在缓存中,以便下一次查询时,可以直接返回结果,加快访问
在拿到域名对应的ip地址后,会以随机端口向WEB服务器程序80端口发起TCP连接请求,经过三次握手,最终建立了TCP/IP连接
建立连接之后,发起HTTP请求,请求一般分为3部分,请求方法、请求头、请求正文
服务器收到请求后,http服务器处理请求,最终将HTTP响应报文返回给浏览器客户端
为了避免资源的消耗或者占用,当双方没有请求或响应传递时,任意一方都可以关闭请求,经过四次挥手,关闭连接
然后浏览器解析渲染页面
9. 状态码
200:请求成功,一般用于GET和POST请求
301:永久移动。永久重定向
302:临时移动
307:临时重定向。使用GET请求重定向
304:未修改,不会返回任何资源
400:客户端请求语法错误,服务器无法理解
401:请求需要用户的身份认证
403:服务器理解客户端的请求,但是拒绝执行
404:找不到资源
405:客户端请求的方法被禁止
500:服务器内部错误
502:作为网关或代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503:由于超载或者维护,服务器暂时无法处理请求
504:充当网关或代理的服务器,未及时从远端服务器获取请求
10. 长连接和短连接
- 短连接:客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接
- 长连接:当一个网页打开完成后,客户端和服务器 之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这条连接
11. HTTP和HTTPS的区别
- HTTP的URL由http:// 起始,默认使用端口是80,而https的URL是由https://起始,默认使用端口为443
- http没有https的安全性高,但是https比http耗资源,因为http协议运行在TCP之上,所有传输的内容都是明文,客户端和服务器都无法验证对方的身份,而https是运行在SSL之上的http协议,SSL运行在TCP之上,所有传输的内容都经过加密,加密采取的是对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密
对称加密:密钥只有一个,加密解密为同一个密码
非对称加密 :密钥成对出现
12. Cookie的作用是什么?和Session有什么区别?
- Cookie和Session都是用来跟踪浏览器用户身份的会话方式,但是两者应用场景不同
- Cookie一般用来保存用户信息,Session一般用来通过服务器记录用户的状态
- Cookie数据保存在客户端,浏览器关闭不影响,而Session数据保存在服务器端,服务器重启就消失
- Session安全性更高
13. 流量控制
接收端处理数据的速度是有限的,如果发送端发的太快,导致接收端的缓冲区被存满,这个时候如果发送端继续发送,就会造成丢包
因此,TCP支持根据接收端的能力,来决定发送端的发送速度,这个机制叫流量控制
- 接收端把自己可以接受的窗口大小放入TCP首部中的窗口大小字段,通过ACK通知发送端
- 窗口字段越大,说明网络吞吐量越高
- 如果接收端的缓冲区满了,就会将窗口设置为0,这时发送方不在发送数据,但是需要定期发送一个窗口探测器段,使接收端把窗口大小告诉发送端
14. 滑动窗口
- 因为确认应答机制是一发一回,效率差,所以我们引入了滑动窗口,就是一次发送多条数据,可以大大提高性能
- 窗口的大小就是不用等待确认应答就可以继续发送数据的最大值
- 当发送端收到第一个ACK时,滑动窗口向后移动,继续发送下一段数据
- 如果出现了丢包,第一种情况是 数据包已经抵达,ACK 丢失,这样的情况下,部分ACK丢了不要紧,可以通过后续的ACK进行确认
- 第二种情况是 数据包丢了,当某一段数据包丢了,接收端会一直响应那一段数据包的ACK,发送端如果连续三次收到同样的ACK,那就会重新发送接收端响应的那个数据包
15. 怎样解决粘包问题
粘包出现的原因:
- 在TCP的协议头中,有一个序号字段
- 在传输层的角度,TCP是一个一个报文过来的,按照序号排好放在缓冲区
- 在应用层的角度,看到的是一串连续的字节数据,应用程序看到了这个一串字节数据,不知道从哪里开始从哪里结束,是一个数据包。这样才形成了粘包问题
粘包解决:明确两个包的边界
UDP不存在粘包问题
16. HTTP请求方法 GET 和 POST的区别
GET可以缓存,POST不能缓存
GET对URL有长度限制,最大长度为2048个字符,POST没有限制
GET只允许ASCII码字符,POST不限制,二进制也可以
GET的安全性较差,因为请求数据都在URL中,POST的请求数据可以在URL中,也可以在请求体中