1. HTTP协议(HTTP1.1)
HTTP:超文本传输协议,是建立在TCP之上的一种无状态协议。大致工作流程为:
- 客户端发送一个HTTP请求,通过TCP协议传送到服务器端
- 服务器端收到请求后,开始处理请求,做出相应的动作,返回HTTP响应
HTTP请求:
由请求行、请求头、空行、请求体组成。
- 请求行:请求方法 请求路径 http协议版本
- 请求头:cookie/Content-Length/Accept-Encoding/Connection等头字段
- 空行:告诉服务器请求头部到此为止。
- 请求体:POST方法的话会将请求数据放到请求体中,GET请求时请求体为空。
常用的请求方法:
- GET 用来请求指定的资源,应只是检索,不会对数据造成影响
- GET请求可缓存
- 可以在浏览器历史记录中查找到
- 可收藏至书签
- POST 向指定资源提交数据进行处理,可能会导致新的资源建立或已有资源的修改
- POST请求不会被缓存
- 无法从浏览器记录中查找到
- HEAD 类似于GET请求,只不过返回的响应中没有响应体,用于获取响应头
- PUT 从客户端向服务器传送的数据取代指定的文档的内容。
- DELETE 请求服务器删除指定的资源
- OPTIONS 允许客户端查看服务器的性能。
- TRACE 回显服务器收到的请求,主要用于测试或诊断。
GET和POST的区别
- 提交数据的形式不同
- GET请求的数据附在URL之后,以?分割URL和数据,参数之间用&相连
- POST将数据放到请求体中
- 提交数据的大小
- GET提交方式影响了URL的长度。本身HTTP规范对于URL长度没有限制,主要取决于不同客户端、服务器的支持。
- POST方式提交的数据没有限制
- 提交数据的安全
- POST比GET的安全性要高一些
- GET提交数据用户名和密码将明文出现在URL上
- 页面可能被浏览器缓存
- 可以查看浏览器的历史记录
- POST比GET请求要慢
- POST请求会先将请求头发送给服务器进行确认(服务器返回100 Continue),然后才真正发送数据
- POST包含更多的请求头(描述body的数据)
HTTP响应:
由响应行、响应头、响应体组成。
- 响应行:协议版本 状态码 状态描述(HTTP/1.1 200 OK)
- 响应头:描述服务器的基本信息(Expires/Set-Cookie/Content-Type/Allow(用于枚举资源所支持的 HTTP 方法的集合)等字段)
- 响应体:响应的数据;可以是纯数据、HTML代码、JS代码等。
常用的状态码:
- 1xx:表示成功接收请求,需要客户端继续提交下一次请求才能完成整个过程
- 100 Continue 继续,客户端应该继续其请求
- 101 Switching Protocols 切换协议,服务器根据客户端的请求切换协议
- 2xx:表示成功接收请求并完成整个处理过程
- 200 OK 请求成功
- 204 No Content 服务器成功处理,但未返回内容
- 3xx:为了完成请求,需要客户端进一步细化请求。
- 301 Moved Permanently 永久移动,返回信息会包含新的URI,浏览器自动定向至新的URI
- 302 Found 只是临时移动,客户端应继续使用原有URI
- 304 Not Modified 未修改,此时服务器不会返回任何资源,客户端使用缓存
- 4xx:客户端请求有误
- 400 Bad Request 客户端请求的语法有误
- 403 Forbidden 服务器拒绝执行该请求
- 404 Not Found 服务器找不到该资源
- 5xx:服务器端出现错误
- 500 Internal Server Error 服务器内部错误
HTTP1.1支持长连接,长连接与短连接的区别:
- 长连接:cleict与server连接建立后不断开,这种方式下通讯连接一直存在。
- 完成一次读写操作之后,连接不会主动关闭,后续还会使用这个连接。
- 用于操作频繁、点对点通讯、连接数不能太多的情况
- 例如数据库的连接
- 通过Content-Length或分块传输的chunked编码(最后有一个空chunked块)来判断一次数据传输结束
- 短连接:client与server进行一次数据传输时才会建立连接,传输完毕后立即断开连接。
- 例如web的HTTP服务
HTTP/1.1中默认开启长连接,关闭采用:Connection: close。 HTTP/1.0默认关闭,开启采用:Connection: Keep-Alive
URL编码:
- escape/unescape:对ASCII字符编码,使用%加上两位16进制,对于Unicode字符,使用%uxxxx。
- encodeURI/decodeURI:对于Unicode,采用UTF-8进行编码,再百分号编码。
- encodeURIComponent/decodeURIComponent
2. HTTPS
通过计算机网络进行安全通信的传输协议。利用SSL/TLS加密数据包,目的是提供对网站服务器的身份认证,保护数据的隐私及完整性。
HTTPS的特点:
- 混合加密:HTTPS是集对称加密和非对称加密为一体的加密过程
- 对称加密:需要协商加密的秘钥。使用非对称加密对协商秘钥的过程进行加密。
- 非对称加密:公钥和私钥(私钥只有一个人有)
- 验证身份:保证公钥的正确性(SSL证书)
- 实现数字签名
- 对信息M进行HASH函数处理,生成摘要H
- 使用私钥对摘要H进行加密获取数字签名S,发送{M, S}
- 验证数字签名
- 对接收到的M进行HASH处理,生成摘要H1
- 使用公钥解密签名S获得H
- 比较H和H1
- 实现数字签名
3. 浏览器缓存
根据是否需要向浏览器重新发起HTTP请求将缓存分为强缓存和协商缓存。
- 强缓存:不会向服务器发送请求,直接从缓存中取数据。该请求返回的状态码为 200 from cache。
- 设置两个HTTP Header字段:Expires/Cache-Control
- Expires 指定缓存过期时间,是服务器端的具体的时间。
- Cache-Control:控制网页缓存
- public 响应可以被客户端和代理服务器缓存
- private 响应只可以被客户端缓存。是默认值
- max-age 表示最大过期时间(从响应正确回来开始计算)
- no-store 不缓存任何响应
- no-cache 资源被缓存但是立即失效,需要发请求确认协商缓存是否生效
- 协商缓存:强缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器来判断是否使用缓存。相关的状态码是 304 Not Modified
- Last-Modified/If-Modified-Since:时间是秒为单位,如果修改的频率太高,无法精准记录
- ETag/If-None-Match:ETag是服务器生成的当前资源的唯一标识,资源变化会重新生成。
4. TCP协议
-
为什么需要三次握手?
- 为了防止已失效的连接请求报文突然又传送到了服务端,从而产生错误
- 也有可能服务端的ACK报文由于网络原因并没有收到。这时服务器傻傻等着,造成资源浪费
-
为什么TIME_WAIT状态需要经过2MSL才能回到CLOSE状态?
- TIME_WAIT状态是用来重发可能丢失的ACK报文
- Server如果没有收到ACK,会不断重复的发送FIN
- CLient如果在2MSL的时间里没有收到FIN,则结束TCP连接
-
为什么是三次握手,挥手却要四次?
- server端收到client的SYN请求之后,可以直接发送SYN+ACK。ACK用来应答,SYN用来同步
- server收到FIN报文时,可能不能立即关闭SOCKET,只能先回复一个ACK报文。等到server数据传送完成之后再发送FIN报文
-
TCP连接建立之后,客户端故障了怎么处理?
- TCP设置一个计时器,每收到一个请求就重新复位这个定时器
- 计时结束,服务器仍未收到客户端的数据,则会发送探测报文段,最多发送10个。仍无应答之后会关闭连接
5. 从输入一个URL到加载整个网页的过程?
- 域名解析:将输入的网址解析为IP地址。DNS解析是一个递归查询的过程。
- 先在本地域名服务器中查询IP地址
- 本地域名服务器向根域名服务器发送请求
- 本地域名服务器向顶级域名服务器发送请求
- 本地域名服务器向二级域名服务器发送请求直至找到IP地址返回给本地域名服务器
- TCP连接:三次握手建立TCP连接
- 浏览器发送HTTP请求
- 服务器处理HTTP请求,返回HTTP响应
- 浏览器页面渲染
- 构建DOM树和CSSOM树
- 构建渲染树
- 布局(定位)页面元素
- 绘制页面元素
- 四次挥手,断开TCP连接
6. TCP和UDP的区别
TCP/UDP是传输层常用的两个协议。
TCP 可靠连接、面向字节流
优点:
- 三次握手建立连接
- 数据传递时,有确认、超时重传、拥塞机制等
- 确认应答机制 & 序列号(ACK SYN)
- 超时重传 & 序列号
- 数据丢失,超时未收到确认则会重传该数据
- ACK丢失造成的重传会根据序列号确认是否有重复的包
- 拥塞控制(拥塞窗口):防止过多的数据注入网络中
- 慢开始:由小到大逐渐增大发送窗口,指数增大(慢启动门限)
- 拥塞避免:发送窗口线性增长。无论是慢启动算法还是拥塞避免算法,只要判断网络出现拥塞,就要把慢启动开始门限设置为发送窗口的一半(>=2),cwnd设置为1,然后再使用慢启动算法。
- 快重传:收到一个失序的报文段后立刻发出重复确认
- 快恢复:收到3个重复确认之后慢启动门限减半;执行拥塞避免算法
- 流量控制:控制发送端发送数据的速率
- 数据结束后断开连接节约资源
缺点:
- 慢、效率低
- 占用系统资源高
UDP 不可靠、非连接
- 无连接,发送数据前不需要建立连接
- UDP不保证可靠交付
- UDP面向报文
7. cache-control头字段
- 请求头中使用cache-control
- no-cache 告知代理服务器不直接使用缓存,需要向原服务器发起请求
- no-store 所有内容都不会被保存到缓存
- max-age = age 告知服务器客户端想要接收一个存在时间不大于age的资源
- max-stale 告知服务器客户端愿意接受一个超过缓存时间的资源。可以使用过期的缓存
- min-fresh 告知服务器客户端希望接收一个在小于seconds秒被更新过的资源
- 响应头字段中的cache-control
- public 任何情况下都得缓存该资源
- private 返回数据只能被某些用户做缓存。一般是发起请求的浏览器才能使用返回数据的缓存
- no-cache 不直接使用缓存,要求向服务器发起请求(新鲜度校验)
- no-store 所有内容都不会被缓存
- max-age 告知客户端该资源在age秒内是新鲜的,不需要向服务器发请求