网络
TCP/UDP
计算机网络结构
- 物理层
- 链路层
- 网络层(提供主机到主机到通路,IP协议:ip包通过相同路径到达目的地,到达顺序与发送顺序不一致如何解决)
- 传输层(提供端到端、应用到应用到通路,TCP/UDP)
- 应用层( 高层协议,HTTP/SMTP, DSN/RTP)
浏览器输入url中经历的过程
- DNS缓存,不在DNS缓存也不在host文件里面,域名服务器发起一个DNS查询(递归????),返回IP地址
- 调用socket函数,发起TCP请求,TCP三次握手
- 应用层协议,HTTP请求
- 反向代理Nginx,负载均衡,增大吞吐量
- uwsgi/gunicorn(WSGI),兼容web应用(django、flask、etc.)
- web框架,web app响应
- TCP 四次挥手
TCP三次握手/四次挥手
TCP V.S. UDP
- TCP:面向连接(3次握手)、可靠(通过对方的确认确定被对方收到)、基于字节流(tcp有缓存区、分段发送)
- UDP:无连接、不可靠、面向报文
HTTP协议
http请求的组成
- 消息行
- 请求头(重点)
- 消息主体
参考:https://blog.csdn.net/shouwang666666/article/details/70232053/
http响应的组成
- 状态行
- 响应头(重点)
- 响应正文
http常见状态码
- 1** 信息:服务器收到请求,需要请求者继续执行操作
- 2** 成功:操作被成功接受并处理(200成功)
- 3** 重定向:需要进一步操作完成请求(301永久重定向,302临时重定向)
- 4** 客户端错误(403禁止,404不见了)
- 5** 服务器错误
Restful 语义
- get:获取
- post:创建
- put:更新
- delete:删除
**GET/POST 区别 **
- restful语义不同
- GET:幂等(服务器上没有副作用),post:非幂等(会影响数据库等数据)
- get请求参数放到url(明文),有长度限制;post是放到请求体里,更安全
幂等性
- 无论调用多少次都得到相同结果都http方法
- a=4:幂等,a+=4:非幂等
- 幂等的方法客户端可以安全地重发请求
- 非幂等要在server端实现
method | idempotent | safe |
---|---|---|
options | ✅ | ✅ |
get | ✅ | ✅ |
head | ✅ | ✅ |
put | ✅ | ❌ |
post | ❌ | ❌ |
delete | ✅ | ❌ |
patch | ❌ | ❌ |
ps:安全是指会不会修改数据
http长连接
- 短连接:建立连接 --> 数据传输 --> 关闭连接(建立、关闭的开销大)
- 长连接:保持tcp连接不断开(connection:keep-alive)
- 区分http请求:content-length(静态:长度)/tansfer-encoding:chunked(动态:每次需要发送多长,指导chunked=0就结束)
标准的http是无状态&无连接
- 标准的 http 协议:不包括cookies, session,application的http协议
- 无连接
- 每一个访问都是无连接,服务器挨个处理访问队列里的访问,处理完一个就关闭连接,这事儿就完了,然后处理下一个新的
- 无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接
- 无状态
- 无登录状态,即服务器不知道某个用户是否已登录过了。因为愚蠢的服务器不知道客户端是否已登录过了,所以每次都要在交互场景(会话)中请求中带上上一次的请求信息
- TCP一直有状态,HTTP一直无状态,但是应用为了有状态,就给HTTP加了cookie和session机制,让使用http的应用也能有状态,但http还是无状态
cookie
- Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容
- Cookie具有不可跨域名性
- 保存登录信息有多种方案
- 方案一:用户名与密码都保持到Cookie中,下次访问时检查Cookie中的用户名与密码,与数据库比较。这是一种比较危险的选择,一般不把密码等重要信息保存到Cookie中
- 方案二:是把密码加密后保存到Cookie中,下次访问时解密并与数据库比较。这种方案略微安全一些。如果不希望保存密码,还可以把登录的时间戳保存到Cookie与数据库中,到时只验证用户名与登录时间戳就可以了(每次)
- 方案三:只在登录时查询一次数据库,以后访问验证登录信息时不再查询数据库。实现方式是把账号按照一定的规则加密后,连同账号一块保存到Cookie中。下次访问时只需要判断账号的加密规则是否正确即可(安全:把账号保存到名为account的Cookie中,把账号连同密钥用MD5算法加密后保存到名为ssid的Cookie中。验证时验证Cookie中的账号与密钥加密后是否与Cookie中的ssid相等)
cookie & session
- session:服务器生成之后给客户端(通过url参数/cookie)
- cookie:实现session(服务器识别用户)的一种机制,通过http cookie字段实现
- session通过在服务器保存session_id识别用户,cookie存储在客户端
- cookie一般是加密的
参考