输入网址后会发生什么

  1. 查找目标网址的dns和IP地址
  2. 进行tcp 链接
  3. 发送http 报文
  4. 服务器处理http报文并返回给客户端
  5. 客户端渲染页面

    什么是http协议

    http 是超文本传输协议,是服务端到客户端的一种传输协议。

    tcp/ip 五层模型

  6. 应用层 // 为用户提供各种想要的服务 , http, HTTP、FTP、DNS、SMTP等

  7. 传输层 // tcp udp
  8. 网络层 // 主要是主机到主机的通讯问题, IP协议是网际互联层最重要的协议
  9. 数据链路层
  10. 物理层

osi 七层模型

  1. 应用层
  2. 表示层
  3. 会话层
  4. 传输层
  5. 网络层
  6. 数据链路层
  7. 物理层

http 端口是80, https 端口有是443。
http1, http2, http3 , http3 是使用了QUIC协议。

状态码:

1xx : 表示已经接收了,继续进行。
2xx :成功。
3xx :重定向。 302: 临时跳转
4xx: 客户端错误。 400 请求实体不对 get post 402 资源需要经过验证
5xx :服务端错误

请求报头:

conection : keep-alive 长链接。
referer 是这个请求的上一个请求是谁,找源头。

cookie:

缓存分为两种: 协商缓存和强制缓存
强制缓存 : 头部字段 expires 1.0, 客户端的时间和服务端的时间进行对比,缺点是客户端的时间可能会不准确
cache-control:max-age=number 1.1 max-age是在接下来的多长时间后失效
协商缓存: etag 和 last-modified , 可以单独去用也可以同时去用。
last-modeified 是服务端文件最后被修改的时间, if-lastmodeified-since 是服务端接收到的last-modeified 最后的时间,再次请求时候服务端发现请求头中有这个字段会和服务端上文件的last-modeified 时间进行对比,如果大于last -modeified ,会重新请求资源后 返回 code 200 反之,从本地请求资源 code 304
etag 是服务端保存的文件一个指纹,if-no-match 服务端如果发现请求头中有这个字段就会比较这个这个值,如果一样的话就会返回302 ,使用本地缓存,如果不一样的会返回200 ,并返回服务端最新的文件。
last-modified 标记是时间戳, 是文件的生成时间。
两个都有的话优先用etag 策略。

http get 传参有长度限制吗:

http 本身对url 没有长度的限制,限制是因为各个浏览器自身进行的长度限制

http1 和http2 的区别:

多路复用, 二进制分帧, 服务端推送
http1.x 的数据都是文本格式的,http2 采用了二进制格式的。
http1.x 对报头不进行压缩, http2 对报头进行压缩。
http1.0 是短连接,一个tcp 只能有一个http请求,选一个请求必须等待上一个tcp 完毕。
http1.x 是长链接,一个tcp 请求完成不断开,在一定时间段内的请求继续用这个tcp连接,知道一定时间后没有请求后断开, 但是下一个请求也必须是上一个请求完毕后才能请求,是文件层面的阻塞。
http2 多路复用,是多个请求可以用同一个tcp 链接,而且每个请求不需要扥上一个请求完成,这样就不会造成堵塞。但是多路复用也有一个缺点就是如果有一个包丢失了,后续的请求必须等这个丢失的包重新发送,请求回来才能继续请求。
服务端推送: 可以由服务端主动推送数据给客户端

http3 :

http3 是基于quic,底层是UDP的,http3 也能多路复用,而且因为是基于UDP 的,所以不用有严格的按照顺序去发送,即使某一个包丢失了,其他的包也可以继续请求,这样就解决的阻塞的问题。

三次握手,四次挥手过程:

三次握手:
首先由客户端发送给服务端一段开始报文, syn = 1 seq = 10000;
服务端收到客户端发送的报文后给客户端发送一段确认报文,ack = 1 ACK = 10001 syn =1 seq = 10202,客户端收到服务端发送的确认报文,表示我知道了服务端能接受到我发送的报文,我们之间的连接能建立起来。但是这时候服务端并没有收到客户端发送的确认报文,所以 客户端还在在接受到服务端发送的确认报文后再给服务端发送一条确认报文,这条报文目的是为了让服务端也知道客户端能收到我发送的报文, syn =1 ack = 10203 seq = 000091;这时候三次握手结束。
为什么要三次握手: 第一次是客户端发送确认, 服务端接收到报文,然后服务端要给客户端发送确认报文,表示我知道你要跟我建立连接,但是这时候服务端不知道客户端能不能收到确认报文,所以客户端收到服务端发送的确认报文后,要再次给服务端发送报文,表示我知道咱俩能建立连接了,开始吧,这就是为什么要三次握手。
四次挥手:
首先客户端发送一段请求结束连接的报文给服务端,FIN =1 seq = 10000;
然后服务端接受到客户端发送的请求结束连接的报文,会发送一段确认报文给客户端表示,好的我知道你要跟我断开连接了, FIN = 1 ack = 100001 seq = 19987;
然后服务端在准备完毕后会再次给给客户端发送确认报文,FIN =1 ack = 100002 seq = 199988;
最后客户端要给服务端发送确认报文,表示好的,咱们断开连接吧。
需要确认的是,客户端接到确认报文不会立即释放tcp连接,而是会等2msl后再释放,而服务端接收到确认报文后会立即释放tcp 连接。
如果第三次挥手后,服务端没有收到第四次确认,服务端会重复发送第三次确认报文。
客户端为什么要等2msl 时间,因为假设发送了第四次确认报文,但是丢失了,服务端会重复发送第四次确认报文给客户端,这一来一回的时间是2msl
用一个例子形容:
三次握手
男: 我喜欢你,我们搞对象吧
女: 我知道了。好的,我们搞吧。
男:嗯嗯,好的,那我们开始吧。
四次挥手:
男:我不想处了,你太能吃了。
女:我知道了,我考虑下,我看你家还有啥能吃的。
女: 我看完了,你家没啥能吃的了。好的,我们分手了
男:我知道了,那就分手吧,你把我家冰箱放下。