HTTP 专题
- HTTP 报文
- GET 和 POST 方法
- Cookie 和 Session
- HTTP 缓存
- HTTPS
HTTP 报文
HTTP 请求报文
- 请求行
- 请求方法
- HTTP 版本
- URL
- 首部行
- Connection 表示要不要持续链接
- Accept-language 表示希望收到的语言版本
- 空行
- 请求体:供 POST 方法使用
HTTP 响应报文
- 响应行
- HTTP 版本
- 状态码:HTTP 常见的状态码和适用场景
- 响应状态信息描述
- 首部行
- 空行
- 响应体
GET 和 POST 方法的区别
- GET 方法把参数包含在 URL 中,POST 通过 Request Body 传递参数
- GET 方法比 POST 方法更快
- POST 请求包含更多的首部行
- POST 先将请求头发送给服务器进行确认,然后才真正发送数据
- GET 会将数据缓存起来
总结
- POST 更安全,不会作为 URL 的一部分,不会被缓存。
- POST 发送的数据更大,GET 有 URL 长度限制
- POST 能发送跟多的数据类型,GET 只能发送 ASCII 字符
- POST 比 GET 慢
- POST 一般用于修改和写入数据,GET 一般用于搜索排序和筛选
Cookie 和 Session
- Cookie
- Session
- Cookie 和 Session 的联系
- Cookie 和 Session 的区别
Cookie
问题:Web 站点希望能够识别用户,来对用户进行专门化服务,就生成一个唯一 ID,作为索引在数据库中产生表项。
服务器通过一个包含 Set-cookie 首部行的 HTTP 响应报文进行响应。
- 如果没有设置 Cookie 失效日期,他们仅保存在浏览器会话期间
- 大多数浏览器支持的 Cookie 最大存储的数据量是
4K
,因此不用来保存大数据 - Cookie 以明文的方式存储,并不安全
- Cookie 是不跨域名的
Cookie 的修改和删除
Cookie 并不提供修改和删除
- 如果想要修改,需要服务器在 HTTP 响应报文中返回一个同名的 Cookie
- 如果想要删除,只需要返回一个同名的 Cookie,并发 maxAge 设置为 0
注意:返回同名 Cookie 的时候,需要除 maxAge,value 之外的全部信息都和原 Cookie 相同
Session
client 访问 server 的时候,server 将 client 信息记录在 server 上面,这就是 session。
用户和服务器建立连接的时候,服务器会为其分配一个 SessionId
Session 的生命周期
- Session 在用户的第一次访问服务器的时候创建,只访问静态资源并不会创建 Session
- server 会将长时间没有活动的 Session 从服务器内存中清除,此时 Session 便失效。Tomcat 的默认失效时间为 30 min
- 计时从 Session 未被访问的时候开始算起
Session 和 Cookie 的联系
Session 需要通过 Cookie 实现,服务器要向 client 发送一个 JSESSIONID 的 Cookie,它的值就是该 Session 的 id,Session 依据此 Cookie 来识别是否为同一用户
- 该 Cookie 是服务器自动生成的,maxAge 一般为
-1
,也就是关闭浏览器就会失效。 - 因此同一计算机的两个浏览器窗口访问服务器时会生成两个不同的 Session ,但是由子窗口会共享父窗口的 Cookie ,共享一个 Session
Cookie 和 Session 的区别
- 存储位置
- 安全性
- 对服务器的影响
- 数据大小:Cookie 保存的数据最多不超过
4k
,一般浏览器限制一个站点最多保存 20 个 Cookie
HTTP 缓存
一般只用于 GET 请求
HTTPS
- 引入 CA 使用数字证书来保证公钥的合法性,避免了中间人攻击。
- 使用非对称加密来约定对称加密要使用的 key
- 信息传递过程使用对称加密来实现
HTTPS 的核心 SSL/TLS 协议的工作原理
- 对称加密:如何约定密钥在计算机网络中存在问题,性能高很多
- 非对称加密:可以使用公钥模拟用户发送信息,也存在问题,
数字证书
解决:第三方仿照 server 给 client 发送自己的公钥,并且中间截获的问题
为了公钥传输的信赖性问题,第三方机构应运而生——证书颁发机构(CA,Certificate Authority)。CA 默认是受信任的第三方。CA 会给各个服务器颁发证书,证书存储在服务器上,并附有 CA 的电子签名
- client 向 server 发送 HTTPS 请求时
- 获取目标服务器的证书,并验证合法性
- 证书内存在 server 的公钥
如何生成数字签名
- CA 使用散列技术生成一个摘要,并使用 CA 的密钥对摘要进行加密,然后将证书发给 server
- server 将证书发给 client 时,client 向 CA 获取加密摘要所用的公钥,并自己计算摘要,与 CA 解密出来的摘要进行比对。
- 如果相同,则成功
总结:通过引入第三方机构 CA 对 server 的公钥进行验证。
- HTTP 协议运行在 TCP 之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。
- HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议,SSL/TLS 运行在 TCP 之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS 高,但是 HTTPS 比 HTTP 耗费更多服务器资源。
HTTPS 的工作流程
- client 向 server 发起 HTTPS 请求
- server 将数字证书发送给 client
- client 校正数字证书的合法性,如果不通过产生 HTTPS 警告信息
- client 通过公钥对对称加密要使用的 key 进行加密,发送给客户端
- server 通过密钥解密对称加密要使用的 key
- client 和 server 进行对称加密传输
为什么不适用非对称加密?
- 资源消耗远大于对称加密
TCP
TCP 报文格式
序号 && 确认号 (32 位)
TCP 的 ACK 并不是立即发出的,因为 TCP 会采取累计确认的方式,一旦延迟期间后面的数据包也来了,就可以直接发送最新的 ACK,提高效率
首部长度 (4 位)
一个单位表示 4 字节,最长是 64 字节
窗口大小 (16 位)
用于流量控制,设置 cwnd
TCP 校验和 (16 位)
拥塞控制 & 流量控制
拥塞控制
通过拥塞窗口实现
TCP 维持一个 cwnd 和一个门限值
- 慢开始
- 拥塞避免
- 快重传
- 快恢复
流量控制
通过滑动窗口来实现
- 发送方维持一个 rwnd,接收方可以通过 TCP 报文来控制 rwnd
拥塞控制和流量控制的区别
- 流量控制解决的是发送方和接收方速率不匹配
- 拥塞控制解决的是避免网络资源被耗尽的问题,全局性。
差错控制
通过 TCP 校验和实现,如果发现错误,则不发送 ACK,等待重传。
应用层可以使用更强力的手段,例如 CRC
TCP 粘包、拆包
发生的原因:
- 要发送的数据大于或小于 TCP 发送缓冲区剩余空间大小
- 待发送的数据大于 MSS
解决方式:
- 给每个数据包添加包首部,包含数据包的长度
- 在数据包之间设置边界,添加特殊字符等
- 设置消息定长
TCP 三次握手和四次挥手
TCP 与 UDP 的区别
TCP | UDP |
---|---|
面向连接,提供可靠交付 | 无连接,尽最大努力交付 |
面向字节流 | 面向报文 |
一对一 | 一对多、一对一、多对一、多对多 |
有拥塞控制、流量控制 | 首部开销小 |
TCP:FTP、HTTP、HTTPS、SSH、SMTP、Telnet
UDP:DNS、DHCP、TFTP
- Post title:计算机网络
- Post author:auggie
- Create time:2022-04-07 14:00:12
- Post link:https://ruanjiancheng.github.io/2022/04/07/compute-network/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.