2021.12.3
全双工和半双工
全双工允许数据在两个方向上同时传输,半双工允许数据在两个方向上传输。
- 全双工:两个方向可以同时传输
- 半双工:同一时间只能有一个方向在传输,不能同时传输
HTTP/1.0和HTTP/1.1的区别
- HTTP/1.1是持续连接,TCP默认不关闭
- HTTP/1.1有流水线方式和非流水线方式
- 流水线方式:客户在收到 HTTP 的响应报文之前就能接着发送新的请求报文
- 非流水线方式:客户在收到前一个响应后才能发送下一个请求
选择使用最多的是HTTP/1.1
Socket
- Socket又称“套接字”,是对TCP/IP的封装,提供可供程序员做网络开发的接口——Sokcet接口
HTTP报文格式
2012.12.4
HTTP相关
HTTP是单工(吗?):浏览器发请求,服务器回响应
TCP 的可靠体现在 :TCP 在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源
HTTP过程:
- DNS 解析
- TCP 连接
- 发送 HTTP 请求
- 服务器处理请求并返回 HTTP 报文
- 浏览器解析渲染页面
- 连接结束
HTTP/1.1的长连接会在响应头加入代码:
1 | Connection:keep-alive |
Cookie和Session
- Cookie 一般用来保存用户信息,Session 的主要作用就是通过服务端记录用户的状态。
- Cookie 存储在客户端中,而 Session 存储在服务器上。
如果Cookie被禁用:最常用的就是利用 URL 重写把 Session ID 直接附加在 URL 路径的后面。
如果客户端没传 Session:当浏览器第一次访问服务器时,服务器端发现客户端发来的请求没有带 Session,则会为客户端生成一个 SessionId 附带到 Cookie 里面传给客户端,下次客户端用这个 Session 附带在 Cookie 里面发送。
HTTP/1.0 和 HTTP/1.1 的区别
- HTTP/1.0是短连接,HTTP/1.1是长连接
- HTTP/1.1有流水线方式和非流水线方式
- 流水线方式:客户在收到 HTTP 的响应报文之前就能接着发送新的请求报文
- 非流水线方式:客户在收到前一个响应后才能发送下一个请求
HTTP/1.1 和 HTTP/2.0 的区别
- HTTP1.1 基于文本格式传输数据;HTTP2.0 采用二进制格式传输数据,解析更高效
- HTTP2.0 是多路复用的,而非有序并阻塞的,只需一个连接即可实现并行
- HTTP2.0 使用报头压缩(用特定算法压缩),降低了开销
- HTTP2.0 允许服务器向客户端主动推送资源
URI 和 URL 的区别
- URI是统一资源标志符,可以唯一标识一个资源。
- URL是统一资源定位符,可以提供该资源的路径。它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。
HTTP 和 HTTPS 的区别
- 端口:http:80,https:443
- 安全性和资源消耗:
- HTTP 协议运行在 TCP 之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。
- HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议,SSL/TLS 运行在 TCP 之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。
对成加密和非对称加密
- 对称加密:密钥只有一个,加密解密为同一个密码,且加解密速度快。
- 非对称加密:密钥成对出现,加密解密使用不同密钥。
2022.1.1
拥塞窗口
TCP 的拥塞控制采用了四种算法,即慢开始、拥塞避免 、快重传和快恢复。
慢开始: 先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd 初始值为 1,每经过一个传播轮次,cwnd 加倍。 (慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。)(每次翻倍)
拥塞避免: 拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢增大,即每经过一个往返时间 RTT 就把发送放的 cwnd 加 1。(每次加1)
慢开始门限:ssthresh
cwnd<ssthresh时,用慢开始算法
cwnd>=ssthresh时,用拥塞避免算法
快重传与快恢复:
接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认。
即使收到了失序的,也要立即发出对已收到的报文段的重复确认
发送方一旦收到3个连续的重复确认,就将相应的报文段立即重传。
在浏览器中输入 url 地址 ->> 显示主页的过程(面试常客)
过程:
总体来说分为以下几个过程:
- DNS 解析
- TCP 连接
- 发送 HTTP 请求
- 服务器处理请求并返回 HTTP 报文
- 浏览器解析渲染页面
- 连接结束
HTTPS
分为以下步骤:
- 客户端向服务器发起HTTPS请求,连接到服务器的443端口
- 服务器端有一个密钥对,即公钥和私钥,是用来进行非对称加密使用的,服务器端保存着私钥,不能将其泄露,公钥可以发送给任何人。
- 服务器将自己的公钥发送给客户端。
- 客户端收到服务器端的证书之后,会对证书进行检查,验证其合法性,如果发现发现证书有问题,那么HTTPS传输就无法继续。严格的说,这里应该是验证服务器发送的数字证书的合法性,关于客户端如何验证数字证书的合法性,下文会进行说明。如果公钥合格,那么客户端会生成一个随机值,这个随机值就是用于进行对称加密的密钥,我们将该密钥称之为client key,即客户端密钥,这样在概念上和服务器端的密钥容易进行区分。然后用服务器的公钥对客户端密钥进行非对称加密,这样客户端密钥就变成密文了,至此,HTTPS中的第一次HTTP请求结束。
- 客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥发送给服务器。
- 服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文。
- 然后服务器将加密后的密文发送给客户端。
- 客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成。
HTTP 是不保存状态的协议, 如何保存用户状态?
Session 机制的存在就是为了解决这个问题,Session 的主要作用就是通过服务端记录用户的状态。典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了(一般情况下,服务器会在一定时间内保存这个 Session,过了时间限制,就会销毁这个 Session)。
大部分情况下,我们都是通过在 Cookie 中附加一个 Session ID 来方式来跟踪。
Cookie 被禁用怎么办?
最常用的就是利用 URL 重写把 Session ID 直接附加在 URL 路径的后面。
Cookie 的作用是什么? 和 Session 有什么区别?
Cookie 和 Session 都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。
- Cookie 一般用来保存用户信息: 比如 ① 我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了;② 一般的网站都会有保持登录 ③ 登录一次网站后访问网站其他页面不需要重新登录。(登录状态保持)
- Session 的主要作用就是通过服务端记录用户的状态: 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。(记录用户动作?)
2022.2.23
TCP如何保证可靠传输?
- 应用数据被分割成 TCP 认为最适合发送的数据块。
- TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
- 校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
TCP 的接收端会丢弃重复的数据。 - 流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
- 拥塞控制: 当网络拥塞时,减少数据的发送。
- ARQ 协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
- 超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
2022.3.18
RSA加密算法(非对称加密算法之一)
1 | 公钥:(E,N) |
2022.8.24
TTL是什么
TTL:(Time To Live ) 生存时间
TTL 是由发送主机设置的,以防止数据包不断在IP互联网络上永不终止地循环。
转发 IP 数据包时,要求路由器至少将 TTL 减小 1。
GET和POST请求的区别
- 最直观的区别就是Get把参数包含在url中,post通过 request body(请求体)传递参数。
- Get比post更不安全,因为参数直接暴露在url中,所以不能用来传递敏感信息。
- Get在浏览器回退时是无害的,而post会再次提交请求。
- Get请求只能进行url编码,而post可以进行多种形式的编码。
- Get请求参数会被浏览器完整的记录下来保留在历史记录里,而post参数不会被保留。
- Get请求在url中传送的参数是有长度限制的,而post没有(浏览器导致)。
- 对参数的类型,Get只接受ASCII码字符,而post没有限制。