HTTP理解

240 阅读9分钟

输入地址到获得页面的过程

1、浏览器查询DNS,获取域名对应的IP地址

a、浏览器自身的DNS缓存
b、操作系统的NDS缓存
c、读取本地的HOST文件
d、向本地DNS服务器查询、或者递归查询
e、路由器缓存

2、获取IP后,向服务器请求建立连接、发起三次握手;

3、TCP/IP建立连接后,浏览器向服务器发起HTTP请求;

4、服务器返回结果给浏览器,浏览器解析渲染视图,显示界面。

TCP三次握手

作用:确认通信双方的接收能力和发送能力是否正常,保证两端都已经建立可靠有效的连接。

  1. 发送方接收方发起连接请求连接数据包;
  2. 接收方收到后,回应一个响应数据包;
  3. 发送方收到响应包后进行确认,双方进入连接状态。

为什么是三次握手?可以是2次吗?

1、确保通信双方的信息对等

第一次握手:服务端确认自己接收能力OK,服务端确认客户端的发送能力OK

第二次握手:客户端确认自己的收发能力OK,确认服务端的收发能力OK

第三次握手:服务端确认自己的接收能力OK,服务端确认客户端的接受能力OK

2、防止失效的连接请求又传到了服务端(防止请求超时导致脏连接,造成资源浪费)

如果2次握手就能建立连接,那么假设A、C两台机器传输数据并关闭连接后,A机器的超时连接请求才到达C机器,C机器以为由是一个新的连接请求,然后同意创建连接,这时握手成功,等待A机器发送消息,但是A机器的状态不是SYN_SEND,A机器会丢失C机器的数据,这时C机器单方面创建连接完毕,导致资源浪费。

SYN攻击

服务端的资源是在二次握手时分配的,客户端的资源是在完成三次握手时分配的。所以服务器容易受到SYN洪泛攻击。

  • SYN攻击是客户端在短时间内伪造大量不存在的IP地址,并向服务器不断发送SYN包;
  • 服务器则回复确认包,并等待客户端确认;
  • 服务器发送完SYN-ACK包后,如果未收到客户端的确认包就会重传(重传等待的时间是指数增长1s、2s、4s、8s),等待一段时间仍未收到,开始第二次重传。如果重传次数超过最大重传数,则会将该连接信息从半连接队列删除。

第三次握手中,客户端的ACK未发送到服务器怎么办?

每隔3秒重发一次,5次之后还是未收到,会自动关闭连接,进入CLOSE状态

建立连接后,客户端出现故障怎么办?

服务端每次收到请求后都会重新复位一个计时器,时间通常是2小时,若2小时还未收到客户端的任何数据,服务器就会发送一个探测段报文,每个75秒发一次,10次后无反应,服务器则会关闭连接。

四次挥手

  1. 客户端向服务端发起一个请求关闭连接;
  2. 服务端收到后,向客户端发送确认报文,告诉客户端知道了,但是不会马上关闭,因为服务端可能有自己的事情要处理,比如有数据还没发完。此时是CLOSE_WAIT状态。
  3. 服务端把事情处理好后,向客户端发送结束连接请求,表示自己也想断开连接。LAST_ACK状态
  4. 客户端收到请求后,会给服务端发送一个确认包,确定关闭连接。但是客户端处于TIME_WAIT状态,不会马上关闭。服务端收到确认包后,会关闭连接,进入CLOSE状态。

为什么TIMED_WAIT之后要等2MSL才进入CLOSED状态**

1、确保服务端收到客户端确定关闭请求的连接,才会进入CLOSE状态。MSL是TCP报文的最大生命周期,2MSL可以保证最后一个报文可靠到达。

2、防止已经失效的连接报文段出现在本次连接中,可以使得本次连接持续时间内所产生的报文段从网络中消失。

序列号作用

  • 请求应答一来一回,确保可靠传输
  • 接收方可以去除重复数据
  • 接收方可以按序号接收、标识哪些被接收的

TCP如何保证可靠传输

确认应答和序列号,去重和排序 流量控制:通过滑动窗口实现。接收方来不及处理发送方的数据时,能提示发送方降低发送率,防止丢包。 堵塞控制:当前网络拥堵时,减少数据的发送。

TCP和UDP的区别?

TCPUDP
面向连接、可靠的协议,发送数据前需要建立连接无连接、不可靠协议
类似打电话、对方接通了,验证了身份才开始通信类似广播播报,直接通信,无需确定别人有无收到
面向字节流面向报文
点对点通信支持一对多、一对一、多对一、多对多
点对点通信游戏、直播

TCP:类似打电话 UDP:类似广播

为什么要分层?

因为网络不稳定,数据传输失败后,需要重传,应用层都有这样的需求,所以专门抽了一层传输数据,但是有些数据需要重传有些不需要,所以再抽一层网络层。

应用层HTTP、FTP、STMP、DNS网络的不稳定,数据到达某个路由节点时,会存在失败的情况,所以需要重传,如果数据报文太大,就会出现延迟的现场。所有的应用层都需要重传数据,所以需要分层。
类传输层TCP、UDP负责数据的拆分和组装。新问题:有些数据不需要重传,比如UDP,直播/游戏中只需要最新状态即可,发失败的数据不需要重传。所以再分一层。
网络层IP负责路由、寻址,最小单位传输数据。
数据链路层以太网 WI-FI为网络提供物理支持
  • 简化问题的难度和复杂度
  • 灵活性好
  • 易于实现和维护
  • 标准化工作

七层协议 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层

HTTP版本

HTTP1.0短连接,每次与服务端通信都需要新开一个连接
HTTP1.1默认值就连接,没用明确提出关闭,端口就一直保持
HTTP2.0管线化,1个TCP连接发起多个请求和响应数据;二进制分帧层对头部压缩;多路复用
HTTP3.0支持一对多、一对一、多对一、多对多
存储在客户端存储在服务端

HTTP有无状态、无连接

特点:简单快速、

灵活: 语义上自由、传输的形式多样化

无状态:每次http请求都是独立的、无关的,默认不需要保留状态信息(既是优点也是缺点)。

请求-应答:一发一收、有来有回。

无连接:

优点:不需要额外的资源记录状态,减轻服务器的负担。

缺点:

明文传输;

无状态:无法支持连续多个步骤的事物操作,每次都得询问一遍身份信息,不仅麻烦还增加了不必要的数据传输。因此有了Cookie技术

队头堵塞:HTTP开启长链接时,公用一个TCP连接,同一时刻只能处理一个请求。

滑动窗口技术

发送方的发送窗口时不能大于接收方的接收窗口的。 以字节为单位的滑动窗口技术,可以很好的协调双方的收发能力

Cookie 和 Session

HTTP无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的。例如购物车。所以引入了cookie。

Cookie本质是浏览器里存储的一个很小的文本文件

Session默认会往cookie设置seesionId,确定会话的身份信息。

CookieSession
是浏览器里存储的一个很小的文本文件默认会往cookie设置seesionId
容量小,只能存储4K无限制
性能缺陷,紧跟域名,不管其他页面需不需要一段时间内,用户增多会影响服务器性能
存储在客户端,安全缺陷,容易被截取篡改放在服务端,安全性高

URI、URL、URN

URI:统一资源标识符,用于标识某一互联网资源名称的字符串

URL:统一资源定位符

URN:统一资源名称

ARP

通过IP查找MAC地址,用来定位下一个接收数据包网络设备的MAC地址

HTTPS连接过程

  1. 客户端向服务端发起请求连接,携带随机数、支持的TLS版本、支持的加密套件;
  2. 服务端收到请求后,向客户端发送随机数、选择的TLS版本、加密套件;
  3. 服务端会把证书发给客户端;
  4. 客户端验证证书的合法性,主机名等;
  5. 客户端生成随机数,通过公钥加密,生成预主秘钥,发送给服务端;
  6. 此时双方根据三个随机数可以生成同样的秘钥
  7. 客户端使用客户端加密秘钥加密数据,告诉服务端,将使用加密通信
  8. 服务端也会告诉客户端,将使用加密通信
  9. 双方验证通过,握手正式结束

服务器随机数的作用:防止重放攻击,中间人攻击保存随机数后,第二天再往服务器发数据。 客户端使用客户端加密秘钥加密传输数据,是为了防止中间人攻击拦截数据后,直接往回扔,此时服务端无法识别是自己发出的数据还是客户端发来的数据。

对称加密和非对称加密

对称加密:加密秘钥和解密秘钥相同,最大的问题是传输秘钥,加解密的效率高 非对称加密:加密秘钥和解密秘钥不同,性能慢,加解密的效率低

POST和GET区别

GETPOST
缓存角度浏览器主动缓存,会留下历史记录默认不会
编码角度只能URL编码,只能接收ASCII字符无限制
参数角度拼接在url后面,不安全,长度有限制放在body,适合敏感信息。
幂等性幂等(相同操作,结果一样)非幂等
作用用于获取数据用于发送数据
后退操作后退不会刷新后退会刷新