- 基础知识
- HTTP基础知识(状态码,请求方法,请求头,cookies)
- socket/webSocket
- 系统请求库和开源请求库
- 缓存系统(LRU LFU)
- 应用场景:文件上传,断点续传,加密和签名。
- 特殊请求:流媒体协议,IM长连接
基础知识
1. TCP/IP
1.1 协议层:从下往上为网络访问层、网络层、传输层、应用层
1.2 TCP的3次握手和四次挥手: 博文详解
握手:3次信息发送,客户端、服务端和客户端,每次信息包括首部,3次分别为SYN,SYN+ACK,ACK,除了首部还有序列号,第一次发送一个序列号seq=x,第二次服务端序列号y,第三次客户端序列号x+1,然后还要回复之前的序列号,ack=x+1,数值是前面的序列号+1。
大写的那些部分表示的是这个命令是干嘛的,性质问题,seq是自己的标识,就像id一样,ack是表示回复的是那一条命令,ack=回复的命令的seq+1。
通过seq和ack就可以把命令串接起来,形成流程。
SYN
和FIN
都是原始命令,而ACK
是对它们的回复。所以握手就是:1. 同步 2.回复+同步 3.回复。挥手就是:1. 结束 2.回复 3.回复+结束 4.回复。2和3都是对1的回复,因为服务端接收到1的消息后,可能还没有把数据全部传给客户端,所以它回复2,告诉接收到1了,等把数据发完,再回复3,告诉客户端,它也可以结束了。
握手:
- SYN=1,seq=x
- SYN=1,ACK=1,seq=y,ack=x+1
- ACK=1,seq=x+1,ack=y+1
挥手:
- FIN=1,seq=u
- ACK=1,seq=v,ack=u+1
- ACK=1,FIN=1,seq=w,ack=u+1
- ACK=1,seq=u+1,ack=w+1
- 客户端等待2MSL,确认最后消息发送完成。
TimeWait(最后等待2MSL)作用:
1。防止上一次连接中的包,迷路后重新出现,影响新连接 (经过2MSL,上一次连接中所有的重复包都会消失) 2。可靠的关闭TCP连接 在主动关闭方发送的最后一个ack(fin) ,有可能丢失,这时被动方会重新发 fin, 如果这时主动方处于CLOSED 状态 ,就会响应rst 而不是ack。所以 主动方要处于TIME_WAIT 状态,而不能是CLOSED 。 TIME_WAIT 并不会占用很大资源的,除非受到攻击。
1.3 TCP和UDP的区别
TCP是面向连接的,并且保证数据接收,丢失会重发,还要保证数据的顺序,这一系列的手段保证TCP的数据传输是稳定可靠的,但同时也增加负担。
UDP则不保证数据的送达,所以有更高的实时性,更低的系统负担。
而且TCP只能一对一,而UDP可以一对多、多对多。
HTTP基础知识
1. HTTP 的报文结构
请求报文:
请求行,请求头,请求数据。请求行包括请求方法、URL和协议版本,请求头用key:value的形式存储。
响应报文:
响应行,响应头,响应数据。响应行包含协议版本和状态码。响应头用key:value的形式存储。
2. HTTP协议的性质
- 无状态协议
每次请求都是独立的,即使是同一个客户端和服务端的多次请求也不会关联起来。服务端不会记录和保存请求的信息,用来关联和定位之后的请求。
如果多个请求是关联的,那么就有第1步、第2步...那么就有对于当前进行到哪的一个记录,这个就是我理解的状态。
可以对比TCP的握手过程,它是有步骤的,多次数据交互之前是关联的(靠seq和ack标识),这就是有状态的。
- 持续连接
HTTP基于TCP,请求前TCP肯定是要先连接的,但是一次请求结束后,如果短时间内还会多次请求,可以使用keep-alive保持TCP的连接,之后的请求可以避免再次建立TCP连接的消耗。持续连接指的就是这个TCP连接的维持。这个和HTTP的无状态性质是两码事
http1.1开始支持持续连接。
- 简单的、可扩展的
简单的指结构简单直接易读,可扩展指可以在headers里加入自定义的内容来扩展协议的作用,只需客户端和服务端达成一致即可。
3. Hosts文件
- 负责把域名映射为IP地址
- 优先使用本地Hosts文件解析,没有则去知名DNS服务器请求。
4. 状态码
首先开头决定类型:2 成功 3 重定向 4 请求错误 5 服务器出错。然后常见的状态码:
- 200 成功, 204 请求成功但无内容, 206 部分内容(如断点续传)
- 301永久移动 302临时移动 305 使用代理
- 304 上次请求后数据未修改,只返回响应头,不返回数据。这个需要配合
Last Modified
和If Modified Since
使用,请求头带上If Modified Since
询问xx时间后是否修改,返回头带上Last Modified
表示数据的上次修改是什么时候。服务端把请求头里的时间和数据的实际修改时间做比较,如果没变化,则返回304。这样减少了网络的消耗。 - 404 未找到数据 401 未授权 400 语法错误 405 方法(post/get...)不可用 408 请求超时 410 永久删除
- 502 错误网关 504 网关超时 503 服务不可用(由于超载或停机维护) 505 HTTP版本不支持
5. 请求方法
get post head 这三个常用,还有: put上传文件 delete请求删除 options查看性能 connect更改为管道方式代理服务器 trace回复测试
6. cookies和session
都是保存请求状态的手段,cookies保存在客户端,请求返回头里包含Set-Cookie
,则会在本地生成cookies.之后请求的时候携带cookies,通过相同的cookie来关联同一个站点的请求。
session是服务端保存的,在一个请求到来后,检查是否有session id,没有则构建一个session,把session id写入返回头。之后的请求通过session id来关联。服务端把相关的数据保存在session里,这样多个请求能够定位到同一个session,从而实现数据关联共享。
总结来说,核心还是给请求加入了标识id,通过相同的标识把多个请求关联。然后cookies把共享数据存在本地,session把共享数据存在服务端。