计算机网络
OSI七层和TCP/IP五层
- OSI:应用、表示、会话、传输、网络、数据链路、物理
- TCP:应用(报文)、传输(报文段)、网络(分组)、数据链路(帧)、物理(比特)
- 应用层协议:HTTP、HTTPS、DNS、FTP、STMP
- 传输层协议:TCP、UDP
- 网络层协议:
- ARP地址解析协议:因为IP到另一个IP之间需要经过多个路由器进行转发,ARP协议是根据IP地址查询MAC地址,将请求转发给下一个路由器
- ICMP协议:ping命令中用到,ping命令用于测试两台主机之间的连通性,在路由器和主机之间传递控制信息,比如ping命令就是向目的主机发送一个数据包要求对方回应一个数据包,根据数据包的收发情况计算丢包率和延时
TCP和UDP
1. TCP和UDP的区别:连接、传输、应用
- TCP:面向连接、可靠
- 连接方面:建立连接时需要进行三次握手,断开连接时需要进行四次挥手
- 传输方面:有确认、超时重传、流量控制和拥塞控制确保数据不丢失不乱序
- 应用:FTP文件传输、STMP邮件发送、远程登陆TELNET
- UDP:无连接不可靠
- 不需要建立连接和断开连接
- 传输方面:只管发送不管是否接收,速度快,可能会丢包
- 应用:视频、直播、语音
2. TCP的可靠性如何实现:滑动窗口、确定、超时重传、流量控制、拥塞控制
- 滑动窗口:发送方的报文可以分为四种类型:发送已接收、发送未接收、允许发送、不许发送。其中发送未接收和允许发送可以组成一个滑动窗口,实现流量控制和拥塞控制
- 确认:通过seq序列号和ack确认报文约定发送方发送的下一个报文的头序列
- 超时重传:发送方发送一个报文后开始计时,如果超时都没收到接收方的确认报文,重发这个报文
- 流量控制:基于滑动窗口机制实现,接收方根据自身缓存大小动态调整发送方的发送窗口大小(即允许发送的大小),窗口大小通过确认报文反馈给发送方。
- 拥塞控制:基于滑动窗口机制实现,发送方估算当前的网络情况,自行调整发送窗口的大小,有四个阶段
- 慢开始:窗口大小为1,先探测网络情况,如果情况良好,窗口大小呈指数上升
- 拥塞避免:窗口大小到达阈值时,呈线性上升每次+1,当发生超时重传时,阈值降为当前窗口大小的一半,将窗口大小降为1,重新开始慢开始阶段
- 快重传:当接收方收到三个重复的确认报文时,发送方直接重发接收方未接收的报文,进入快恢复阶段
- 快恢复:阈值变为当前窗口大小的一半,窗口大小降为当前窗口大小的一半,进入拥塞避免阶段
- 发送窗口的大小为接收窗口和拥塞窗口的最小值
2. TCP三次握手
- 客户端向服务器发起请求,等待服务器回应(发送SYN=1,seq=x,进入SYN_SENT)
- 服务器收到客户端请求,回应确认报文(发送ACK=1,SYN=1,ack=x+1,seq=y,进入SYN_RECOV)
- 客户端收到服务器的确认报文,客户端回应确认报文,客户端进入establish状态,服务器收到确认报文后也进入establish状态(发送ACK=1,ack=y+1,seq=x+1,进入establish)
3. 为什么是三次,不能是两次吗
- TCP是可靠的连接,客户端和服务器双方的收发能力需要得到确认之后才能建立连接,只有两次的话,服务器的收发能力还无法得到确认
- 防止超时的连接请求重新到达服务器开启无效的连接。如果只有两次,服务器只要收到客户端的连接请求报文就会开启连接,开启一个无用的连接,造成资源浪费
4. TCP四次挥手
- 客户端向服务器发送FIN终止报文,等待服务器回应。(发送FIN=1,seq=u,进入FIN_WAIT_1)
- 服务器收到FIN报文后,如果服务器还需要收发数据,先回应一个确认报文(发送ACK=1,ack=u+1,seq=v,客户端进入FIN_WAIT_2,服务器进入CLOST_WAIT)
- 服务器处理完数据后,向客户端发送FIN终止报文,等待客户端回应(发送ACK=1,FIN=1,ack=u+1,seq=w,服务器进入LAST_ACK)
- 客户端收到确认报文后,回应一个确认报文给服务器,客户端进入TIME_WAIT,等待2MSL后关闭。服务器收到确认报文后,服务器进入CLOSE状态,服务器稍早于客户端关闭连接(发送ACK=1,seq=u+1,ack=w+1,进入CLOSE)
5. 为什么是四次挥手,可以是三次吗
- TCP是可靠的连接,客户端和服务器需要处理完数据后才能发送FIN终止报文,四次挥手才能确保
- 可以是三次,如果服务器在第二次挥手时已经处理完数据,可以直接发送FIN终止报文,这样就能实现三次挥手
6. TIME_WAIT时间为什么是2MSL
- 确保客户端和服务器能够正常关闭,2MSL是报文在网络中的最长存活时间,超过2MSL没收到回应说明报文确实是丢失了,需要重传报文然后正常关闭连接
- 可以防止其他报文的干扰
7. 大量TIME_WAIT的原因、导致的问题、解决
- 现象:高并发下短连接,服务器主动关闭连接,导致大量客户端处于TIME_WAIT状态
- 危害:占用端口,端口数量有限,最多65535个
- 解决:使用长连接、修改sysctl.conf配置文件,开启time_wait回收,重新设置2MSL时间
HTTP和HTTPS
1. HTTP1.0、HTTP1.1、HTTP2.0的区别
- 1.0默认使用短连接,客户端和服务器每次进行资源交换都有建立和断开连接,时间开销大
- 1.1默认使用长连接,keepalive机制,一个TCP连接支持多次资源交换
- 2.0的解析采用了二进制格式,新增了多路复用机制,允许同时发送多个HTTP请求
2. 长连接和短连接
- 短连接:HTTP1.0默认使用短连接,客户端和服务器完成一次资源交换后,立即通过四次挥手断开连接
- 优点:存活的连接都是有用的连接,管理起来比较方便
- 缺点:建立和断开连接的时间开销大
- 使用:浏览器访问服务器使用的就是短连接,短连接对服务器的压力小,因此并发量大、请求频率低的情况可以使用短连接
- 长连接:客户端和服务器完成一次资源交换后,不会立即通过四次挥手断开连接
- 优点:省去了建立和断开连接的时间开销
- 缺点:长连接对服务器压力大
- 使用:数据库的连接使用的就是长连接
- 心跳检测机制:
- 实现长连接:
- 使用HTTP1.1版本
- 应用层实现自定义的心跳检测机制,比如使用Netty实现
3. HTTP报文结构
- 请求报文
- 请求行:HTTP请求方式、URL、HTTP版本
- 首部行:Host服务器、User-Agent(浏览器信息)
- 空行
- 消息体:GET为空,POST存放请求参数列表
- 响应报文
- 状态行:HTTP版本、状态码、状态
- 首部行:Connection(短连接close、长连接keep-alive)、Date(日期)、Server(web服务器和操作系统)、Content-Length(响应报文长度)、Content-Type(text/html)
- 空行
- 响应体:服务器返回的数据
4. HTTP和HTTPS的区别
- HTTP端口为8080,HTTPS端口为443
- HTTP基于TCP协议,传输明文。HTTPS基于SSL和TLS协议,传输加密内容
- HTTPS需要数字证书,要交费使用
- HTTPS使用混合加密方式,通过非对称加密保证安全性,通过对称加密保证传输的效率,解决了HTTP被伪装、被篡改、被监听的安全问题
5. HTTP请求方式:get、post、delete、put
- get:向目的资源请求数据,将参数列表以明文方式拼接到URL后面,不安全,并且因为URL有长度限制,因此请求参数也有长度限制
- post:向目的资源提交数据,将参数列表存放在request请求头的消息体里,不会对外暴露
6. HTTP状态码
- 1开头,表示消息,如:100-继续发送
- 2开头,表示成功,如:200-ok
- 3开头,表示重定向,如:301-永久,302-临时,303-get重定向,304-未修改,307-不get重定向
- 4开头,表示客户端错误,如:404-找不到,403-禁止访问,401-未授权
- 5开头,表示服务器错误,如:500-错误,502-网关错误
7. 输入URL到页面的流程
- DNS查询域名的IP
- 查询浏览器的DNS缓存
- 查询本地的HOST文件
- 请求到本地DNS服务器
- 请求到国际DNS服务器
- 国际DNS服务器根据映射关系查找域名对应的IP,返回给本地DNS服务器
- 本地DNS服务器缓存域名和IP,返回给用户
- 浏览器将域名和IP缓存到本地的HOST文件和DNS缓存
- TCP三次握手建立连接
- 客户端向服务器发起HTTP请求
- 服务器返回资源
- 浏览器解析,渲染,显示页面
- 如果是短连接,TCP四次挥手断开连接。如果是长连接,维持一段时间后TCP四次挥手断开连接
8. HTTPS连接过程
- 客户端和服务器TCP三次握手建立连接之后,客户端浏览器将自己支持的加密算法列表和一个客户端随机数发送给服务器
- 服务器收到加密算法列表后,选择一个对称加密、一个非对称加密,将公钥、数字证书和一个服务器随机数发送给客户端
- 客户端收到数字证书后,先检查数字证书是否有效,如果有效,生成对称密钥,使用公钥对对称密钥进行加密,将对称密钥发送给服务器
- 服务器收到对称密钥后,使用私钥进行解密,之后客户端和服务器就可以进行加密通信
9. 对称和非对称
- 对称:加密和解密都使用同一个密钥,快,但是不安全。AES、DES
- 非对称:加密使用公钥,解密使用私钥,慢,但是安全。RSA
10. 重定向和转发
- 重定向是客户端行为,浏览器根据服务器返回的状态码,对URL重新发起HTTP请求,URL地址栏会发生变化,不能共享数据
- 转发是服务器行为,服务器对URL直接进行访问,URL地址栏不会发生变化,可以共享request请求头数据
11. Cookie和Session
- session是存放在服务器的,当客户端第一次访问时,会生成一个sessionid和session,session用于保存客户端的数据,可以将sessionid存入cookie,将cookie返回给客户端,客户端浏览器会保存cookie,当客户端下一次访问时,通过sessionid在服务器中快速查找session
- session可以无上限存放数据,可以存放任意类型的数据,但是不建议大量存放,因为会占用服务器内存,影响服务器的效率
- cookie是存放在客户端的,浏览器会将服务器返回的cookies保存,浏览器会将cookie保存到本地,可以被修改,不安全。
- cookie只能存放4KB的数据
- session存放安全性比较高的数据,比如用户的状态。cookies可以存放一些安全性要求没那么高的数据
- 如果cookie被禁用,可以通过在URL后拼接sessionid恢复session功能